黄金点游戏
前言:
这次软件工程的作业是以结对编程的形式编写“黄金点游戏”。结对编程是指两位程序员坐在同一工作台前开发软件与两位程序员各自独立工作相比,结对编程能写出质量更好更高的代码,达到事半功倍的效果。
黄金点游戏介绍:N个同学(N通常大于10),每人写一个0~100之间的有理数(不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值,提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。
具体代码流程如下:
定义玩家结构体,包含玩家姓名,输入数据,得分等。
typedef struct player { int name; int score; int win; int defeat; float number; float b; }PLAYER;
程序主要的三个函数,功能分别为游戏的初始化,游戏规则介绍,游戏得分的计算。
1 void start(); //游戏的初始化 2 void rule(); //游戏规则介绍 3 void count(PLAYER *p,float ave,int num);//计算比赛得分的函数
动态分配结构体数组,当输入游戏玩家人数大于100时,存储空间不足,此时需要重新分配存储空间
p=(PLAYER *)malloc(100*sizeof(PLAYER)); system("cls"); printf("\n\n\n"); printf(" 请输入游戏人数: "); fflush(stdin); scanf("%d",&player_num); if(player_num>100){ p=(PLAYER *)realloc(p,player_num*sizeof(PLAYER)); }
玩家信息用for循环存储到数组中,游戏分数初值为0,玩家姓名直接用数字代替,即“玩家1”,“玩家2”。
for(j=0;j<game_num;j++){ printf("\n\n"); printf("第%d轮比赛:\n",j+1); for(i=0,sum=0;i<player_num;i++) { if(flag==1){ p[i].name=i+1; p[i].score=0; //初始化初值为0 p[i].win=0; p[i].defeat=0; } printf(" 玩家%d: ",p[i].name); scanf("%f",&p[i].number); sum+=p[i].number; }
利用公式求出黄金点数G的值,再调用count()函数求出各个玩家的得分。
ave=sum/player_num; ave=(float)(ave*0.618); printf(" 黄金点G的值为:%f\n",ave); count(p,ave,player_num); flag=0;
统计出本轮游戏的最大值,最小值
for(i=0;i<num;i++) { p[i].b=(float)fabs(p[i].number-ave); if(max<p[i].b) max=p[i].b; if(min>p[i].b) min=p[i].b; }
给每个玩家赋予成绩,获胜者得N分(N个玩家),失败者得-2分,其他人都是0分。
for(i=0;i<num;i++) { if(p[i].b==max) { p[i].score-=2; } else if(p[i].b==min) { p[i].score+=num; } else{ p[i].score+=0; } }
循环输出每个玩家的成绩。
printf("累计比赛得分:\n"); for(i=0;i<num;i++) { printf(" 玩家%d: %d\n",p[i].name,p[i].score); } printf("是否继续 Y or N : ");
运行效果演示
游戏运行界面
键盘输入游戏轮数和游戏玩家数
各个玩家输入心中所想数值,程序计算出黄金点数G,显示累计比赛得分
重复游戏,直至玩家手动退出(即“是否继续”输入N)或者游戏轮数足够后,自动结束游戏
游戏规则
总结:
通过这次结对编程学习到了许多新的知识,队友给了我很多的指导与帮助,结对编程的确是一个事半功倍的好方法,编程本身是一件很枯燥的事情,尤其是遇到解不开的问题时,结对编程让两个人可以一起研究探讨,相互支持与鼓励,这就让编程的过程变得简单轻松了许多。
附带结对编程照一张
我的coding.net地址:http://www.cnblogs.com/wwsthg/
队友coding.net地址: http://www.cnblogs.com/lovewj/