结对编程黄金点游戏

此次结对编程我是与同班的王鑫同学一组,题目是设计一个黄金点游戏,本来看老师建议界面和服务器的设计,想用java来写,但是我俩对于java不太熟悉,忙活了两天没有结果,干脆用我二人共同会的语言C语言来实现,所以我二人决定通过C语言来实现这个游戏。

题目要求设计的游戏的规则为:有N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分

一、设计思路:

  我二人决定用两个一维数组来存游戏同学输入的数(number[])和每个同学的得分(student[]),首先我们认为游戏的人需要自行输入游戏的人数(n)和游戏的局数(j)。

然后通过一个for循环实现将每个游戏玩家输入的数存入到number[]数组中并将这些数求和赋值给a,如下图所示:

for(i=1;i<=n;i++)
{
printf("请输入第%d个人的数字:",i);
scanf("%d",&number[i-1]);
a += number[i-1];
}

接下来就是求出本轮游戏的G值,因为已经求出来了这些数的和为a,所以G值就可以用printf("G值为:%.3f \n",b=a/n*0.618);  这个语句来打印出G值并将G值赋值给b(精确到小数点后3位)。

做好这些之后就开始确定如何找到距离G值最近的数与最远的数,我们的想法是通过fabs()方法分别求出每个玩家输入的数与G值做差的绝对值,并将最小的绝对值与最大的绝对值分别赋值给max和min,我们首先将max与min分别赋值为0与100然后再通过for循环实现赋值,如下图:

if(fabs(number[i]-b)<min)
{
min=fabs(number[i]-b);
}
}
for(i=0;i<n;i++)
{
if(fabs(number[i]-b)>max)
{
max=fabs(number[i]-b);
}

因为这些玩家中会有些玩家输入的数据是相同的,所以距离G值最近的值和最远的值会有相同的玩家。于是我们又通过一个for循环找到玩家数与G值做差取绝对值的数与max和min相同的玩家(与max相同的玩家为距离G值最远的玩家,min为最近)并将相应得分存入玩家对应的分数数组student[]中,如下图:

for(i=0;i<n;i++)
{
if(fabs(number[i]-b)==min)
{

if(fabs(number[i]-b)==max)
{    student[i]=student[i]+n;
}
student[i]-= 2;
}}

接下来再通过一个for循环将每个人的成绩打印出来。整体再通过一个for循环实现游戏可以继续j轮。在游戏运行了j轮之后通过一个for循环找到最高分maxscore,并打印出获胜的是哪位玩家,如下图:

for(i=0;i<n;i++)
{
if(student[i]>maxscore)
{
maxscore=student[i];
}
}
printf("游戏结束!结果如下:\n");

printf("恭喜得数为%d的同学获胜!\n",maxscore); 

最后在整体上加入一个while循环实现是否继续游戏。

二、错误分析:

  通过以上的设计我们将代码写完然后就开始测试程序,这时发现了好多问题。

  1、游戏玩家的分数和G值出现错误。

     解决方案:通过我们二人的研究发现在每轮游戏中没有将a(游戏玩家输入数的和)max(与G做差的最大绝对值)min(与G做差的最下绝对值)这几个数值重置,导致下一轮游戏开始时这三个数值是在上一轮的基础上继续运行的从而导致最后计算游戏玩家分数和G值时出现错误。所以我二人在每轮游戏结束时将这几个必要的值重置。再次运行时结果正常。

  2、游戏完成一次之后输入Y再一次游戏时最后找获胜者时出错。

    解决方案:因为有了前一个错误的经历我们觉得这也是同样的问题,重新整理一遍代码后发现果然是同样的问题,就是在每一次游戏结束后没有将最高分maxscore重置导致,经过修改程序完美运行没有再出现错误。

三、运行截图:

  开始输入数据截图如下:

  第一次游戏结束结果图如下:

  游戏结束后再继续游戏截图如下:

四、总结:

  对于编程我们都有眼高手低的毛病,因为我们都开始学习java,刚开始打算用java来实现程序,虽然主函数都写完了基本功能也实现了,但是对于界面和服务器一点基础也没有,而且他在学的Eclipse和我在学的android studio也不太一样,明显不熟练整了几天感觉有些困难,我们又回到了C语言上,先实现所有基础功能。通过这次实验发现自己好多的东西不会,要尽快补充自己的知识量,因为有的同学已经遥遥领先了。在两周过程中我们经常做到一起研究程序,分别提出自己的想法,了解跟自己不同的想法,增进了同学之间的友谊,而且有一种不一样的体验,感觉学到很多东西。非常感谢老师能安排这样的实验。

下图是我二人在一起讨论代码时的照片:

 

五、源程序代码:

#include <stdio.h>
#include <math.h>
void main()
{
int i,n,j,k;
char s=‘Y‘;
int a=0;
int maxscore;
int student[50];
int number[50];
double b=0;
double min = 100 , max = 0;
while(s==‘Y‘)
{
maxscore=-1000;
printf("请输入游戏人数:");
scanf("%d",&n);
printf("请输入游戏局数:");
scanf("%d",&j);
for(i=0;i<n;i++) //将得分数组赋值0
{
student[i]=0;
}
for(k=0;k<j;k++) //局数循环
{
for(i=1;i<=n;i++) //输入每个同学的数并求和
{
printf("请输入第%d个人的数字:",i);
scanf("%d",&number[i-1]);
a += number[i-1];
}

printf("G值为:%.3f \n",b=a/n*0.618); //输出G值
for(i=0;i<n;i++)
{
if(fabs(number[i]-b)<min) //用每个数分别减去G值并取绝对值找到最大绝对值max与最小min
{
min=fabs(number[i]-b);
}
}
for(i=0;i<n;i++)
{
if(fabs(number[i]-b)>max)
{
max=fabs(number[i]-b);
}
}
for(i=0;i<n;i++) //通过max与min找到距离G点最远与最近的数,并将对用同学的成绩进行修改
{
if(fabs(number[i]-b)==min)
{

if(fabs(number[i]-b)==max)
{    student[i]=student[i]+n;
}
student[i]-= 2;
}
}
a=0; //每轮游戏结束将一些必要数值重置
b=0;
max=0;
min=100;
printf("*******************************\n");
for(i=0;i<n;i++) //打印出每个同学成绩
{
printf("*第%d位学生的得分为%d\n",i+1,student[i]);
}
printf("*******************************\n");
}
for(i=0;i<n;i++) //找到最高分
{
if(student[i]>maxscore)
{
maxscore=student[i];
}
}

printf("游戏结束!结果如下:\n");

printf("恭喜得数为%d的同学获胜!\n",maxscore); //输出游戏结果
printf("____________________________________________________________________\n");
printf("是否继续游戏? Y/N\n"); //游戏结束判断是否继续游戏
scanf("%s",&s);
}

}
时间: 2024-10-11 11:50:49

结对编程黄金点游戏的相关文章

结对编程——黄金点游戏之旅【二】

一.黄金点游戏是一个数字小游戏,其游戏规则是: N个同学(N通常大于10),每人写一个0-100之间的有理数(不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(黄金分割常数),得到G值.提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分. 二.后续功能的实现功能 经过三天的努力,我们终于完成了开始游戏.取消准备.查看历史纪录.添加测试以及退出登录功能. 1.开始游戏(准备游戏)功能介绍:玩家登陆成功后直接进入游戏界面,下方的准备窗口会

结对编程-黄金点游戏之旅[四]

(游戏已上线,更多信息请戳底部链接▼) <--戳这个链接也会跳的哦, 了解游戏规则戳这里-->游戏规则 我的队友: 张波(进入博客请戳底部链接) 性格开朗,人很随和,不想写代码的时候都是他主动拉着我去写的,工作认真负责,有分歧的地方或者逻辑不顺的地方我们都会仔细讨论 主要负责写后台的业务逻辑,登陆.注册.开始游戏等小功能的后台代码 遵照代码规范.每次他写完后我都会做Code Review,虽然没有自动化测试,没有性能分析,但是我会单步调试,分析每一行代码的逻辑和作用 我: 李洋洋 主要负责前端

结对编程-黄金点游戏

一.项目描述:黄金点游戏 黄金点游戏是一个数字小游戏,其游戏规则是: N个同学(N通常大于10),每人写一个0-100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值.提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分.玩了几天以后,大家发现了一些很有意思的现象,比如黄金点在逐渐地往下移动. 现在请大家根据这个游戏规则,编一个可以多人一起玩的小游戏程序,要求如下: 1.本作业属于结对编程项

结对编程—黄金点游戏WinForm单机版

本小游戏场景来自邹欣老师的<移山之道>一书: "阿超的课都是下午两点钟,这时班上不少的同学都昏昏欲睡,为了让大家兴奋起来,阿超让同学玩一个叫"黄金点"的游戏:N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值.提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分.玩了几天以后,大家发现了一些很有意思的现象,比如黄金

结对编程——黄金点游戏

结对编程项目-黄金点游戏 一.项目描述:黄金点游戏是一个数字小游戏,其游戏规则是: N个同学(N通常大于10),每人写一个0-100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值.提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分.玩了几天以后,大家发现了一些很有意思的现象,比如黄金点在逐渐地往下移动. 现在请大家根据这个游戏规则,编一个可以多人一起玩的小游戏程序,要求如下: 1.本作业

结对编程————黄金点游戏

一.项目描述:黄金点游戏 黄金点游戏是一个数字小游戏,其游戏规则是: N个同学(N通常大于10),每人写一个0-100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值.提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分.玩了几天以后,大家发现了一些很有意思的现象,比如黄金点在逐渐地往下移动. 现在请大家根据这个游戏规则,编一个可以多人一起玩的小游戏程序,要求如下: 1.本作业属于结对编程项

结对编程-黄金点游戏之旅[一]

黄金点游戏 游戏描述:黄金点游戏是一个数字小游戏,其游戏规则是N个同学(N通常大于10),每人写一个0-100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值.提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分.玩了几天以后,大家发现了一些很有意思的现象,比如黄金点在逐渐地往下移动. 游戏机制设计:采用B/S模式,由客户端发起请求参加游戏,服务端接收请求处理,当满足游戏结算条件的时候向客户

结对编程-黄金点游戏之旅[二]

项目结构: 前端页面结构及样式和动画设计 登陆(10.14完成) 注册(10.14完成) 主游戏页(10.15完成) ajax回调函数处理以及页面渲染 请求当前房间游戏用户列表返回json数据处理(未完成) 请求当前用户游戏历史纪录结果json数据处理(未完成) 前端ajax交互方法 注册(10.14完成) 登陆(10.15完成) 添加当前用户到游戏列表(10.15完成) 从游戏列表删除当前用户(10.15完成) 前端js事件处理方法 退出登陆返回登陆页(10.15完成) 后台控制器层交互方法

结对编程——黄金点小游戏的设计与实现

个人感想 最近总是很纠结,关于如何平衡考研时间和学校课程时间,还有关于考研资料的选择.就是在这样一种状态下,我迎来了结对编程项目,两个人共同编程完成一个小游戏,说实话,刚开始时我对这个项目不怎么感兴趣,我总觉得应该把时间都放在考研上.还有一个原因就是,我觉得自己什么都不会,肯定会拖累队友,但是经过我们多次沟通后,我发现这个小游戏没有我想象中的那么难,而且我逐渐有点兴趣了,再加上和队友的多次沟通,我觉得结对编程是一件很有意思的事,两个人提出不同的想法然后讨论,再接着看着自己的想法都能慢慢的实现出来