结对编程:黄金点游戏
一、题目描述
黄金点游戏是一个数字小游戏,其游戏规则是:
N个同学(N通常大于10),每人写一个0-100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。玩了几天以后,大家发现了一些很有意思的现象,比如黄金点在逐渐地往下移动。现在请大家根据这个游戏规则,编一个可以多人一起玩的小游戏程序,要求如下:
1、本作业属于结对编程项目,必须由二人共同完成,并分别将本次作业过程发到博客,同时将本次作业源代码提交到coding系统;
2、如果可能的话尽量以C/S或B/S方式实现,即利用服务器接收和处理所有玩家提交的数字,并将结果反馈给各玩家,玩家可以通过客户端提交数字;
3、如果采用单机方式实现的话,需要为用户提供便利的输入界面;
4、该游戏每次至少可以运行10轮以上,并能够保留各轮比赛结果。
二、需求分析
游戏需要实现以下功能:
1.玩家人数,轮次,数据输入;
2.G值的计算与输出;
3.每位玩家得分成绩输出;
游戏由输入,输出,数据计算处理三部分组成。
三、程序设计
由于水平有限,不能用C/S和B/S来实现,所以用C写了个简单的单机游戏,部分代码如下:
这里定义了结构体,包含玩家信息
1 typedef struct player { //定义玩家结构体 2 int name; 3 int score; 4 int win; 5 int defeat; 6 float number; 7 float b; 8 }PLAYER;
三个功能函数,开始,规则介绍,计算
1 void start(); //游戏的初始化 2 void rule(); //游戏规则介绍 3 void count(PLAYER *p,float ave,int num);//计算比赛得分的函数
为输入的玩家分配空间,玩家输入数据,计算G值
1 p=(PLAYER *)malloc(10*sizeof(PLAYER)); //动态分配结构体数组 2 3 system("cls"); 4 printf(" "); 5 printf(" 请输入游戏人数: "); 6 fflush(stdin); 7 scanf("%d",&player_num); 8 9 if(player_num>10){ 10 p=(PLAYER *)realloc(p,player_num*sizeof(PLAYER));//空间不足而需要增加空间 11 } 12 13 printf(" 请输入游戏轮数: "); 14 fflush(stdin); 15 scanf("%d",&game_num); 16 17 for(j=0;j<game_num;j++){ 18 printf(" "); 19 printf("第%d轮比赛: ",j+1); 20 for(i=0,sum=0;i<player_num;i++) { //sum设为总数和 21 if(flag==1){ 22 p[i].name=i+1; 23 p[i].score=0; //初始化初值为0 24 p[i].win=0; 25 p[i].defeat=0; 26 } 27 printf(" 玩家%d: ",p[i].name); 28 scanf("%f",&p[i].number); 29 sum+=p[i].number; 30 } 31 ave=sum/player_num; //计算平均值 32 ave=(float)(ave*0.618); //计算黄金点的值 33 printf(" 黄金点G的值为:%f ",ave); 34 count(p,ave,player_num); 35 flag=0; 36 }
计算玩家的成绩
1 int i; 2 char ch; 3 float max=(float)fabs(p[0].number-ave); 4 float min=(float)fabs(p[0].number-ave); 5 6 for(i=0;i<num;i++) { //统计出本轮最大值,最小值 7 p[i].b=(float)fabs(p[i].number-ave); 8 if(max<p[i].b) 9 max=p[i].b; 10 if(min>p[i].b) 11 min=p[i].b; 12 } 13 14 for(i=0;i<num;i++) { //挨个玩家赋予成绩 15 if(p[i].b==max) { 16 p[i].score-=2; 17 } 18 else if(p[i].b==min) { 19 p[i].score+=num; 20 } 21 else{ 22 p[i].score+=0; 23 } 24 } 25 26 printf("累计比赛得分: "); 27 for(i=0;i<num;i++) { //挨个玩家输出成绩 28 printf(" 玩家%d: %d ",p[i].name,p[i].score); 29 }
四、程序实现与总结
1.结对编程过程中,我负责代码的编写,我的队友刘馨负责代码的审理,下图是结对照片。
2.游戏界面:
3.开始游戏,输入人数、轮数,玩家数据
4.输出G值,玩家分数
5.规则介绍
6.总结
在编程过程中遇到许多问题,变量取名不规范,别人不易看懂,没有加注释,代码的书写不整洁,得分数据处理时情况考虑不周,没有考虑数据全部相等
的情况,这些大大小小的问题都在编程中队友的矫正发现下得到及时的解决。队友是个女孩,沉稳文静,观察思考细致,工作认真,具有很好的想法。我们通
过查阅资料来尽力完善方方面面。期间我们收获良多,学到了很多以前没有学到的知识,也感受到团队协作的重要,两个人更容易发现错误,分工明确,取长
补短,优势互补。
7.博客园链接
我的链接:https://i.cnblogs.com/lovewj/
同伴的链接:http://www.cnblogs.com/wwsthg/
8.coding.net地址:https://coding.net/u/lovewj/p/goldgame/git/upload/master/