结对编程黄金点游戏
此次结对编程我是与同班的王鑫同学一组,题目是设计一个黄金点游戏,本来看老师建议界面和服务器的设计,想用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); } }