结队项目(黄金点游戏)
一、项目内容
黄金点游戏是一个数字小游戏,其游戏规则是:
N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。玩了几天以后,大家发现了一些很有意思的现象,比如黄金点在逐渐地往下移动。
现在请大家根据这个游戏规则,编一个可以多人一起玩的小游戏程序,要求如下:
1、本作业属于结对编程项目,必须由二人共同完成,并分别将本次作业过程发到博客,同时将本次作业源代码提交到codeing系统;
2、如果可能的话尽量以C/S或B/S方式实现,即利用服务器接收和处理所有玩家提交的数字,并将结果反馈给各玩家,玩家可以通过客户端提交的数字;
3、如果采用单机方式实现的话,需要为用户提供便利的输入界面;
4、该游戏每次至少可以运行10轮以上,并能够保留各轮比赛结果。
二、编写方式
采用2人结队编程形式来完成项目,由我来思考并主写代码,赵英男同学复审代码,由于赵英男同学对C语言的理解高于别的语言,所以我们采用的是C语言,并在完成之后再通过2人讨论进一步完善代码,使项目更加完美。
三、代码编写思路
1.首先没有顾虑界面的美化,先写只能进行一轮的比赛的代码。然后考虑了一下发现需要设置5个数组,分别用来储存玩家本轮分数、乱序数字的平均值、排完序的平均值、数字所对应的玩家编号,最后一个数组是后来完善时候加上去的,因为不只是要写1轮所以应该还设置一个存储每位选手的总得分。
2.主界面上应该有选择开始游戏等选项,并使用switch()函数编写输入选项后应如何跳转。
Tip->swich()函数使用方法:
1 scanf("%d",&m); 2 switch(m) 3 { 4 case 1:{.....}break; 5 case 1:{.....}break; 6 case 1:{.....}break; 7 case 1:{.....}break; 8 . 9 . 10 . 11 . 12 . 13 default: {.....}break; 14 }
3.把每一轮比赛的代码插入case1中,由于只是1轮比赛的代码,所以通过goto语句实现了可以继续进行下一轮,也可以重新开始一盘游戏。
首先输入玩家人数
再此输入每一位玩家所猜测的数字
由于题目中给出的要求,即玩家所猜测数字应该在(0~100),所以利用一个if语句对每一位玩家所输入的数字进行判断,如果输入的数字不在范围内,则重新输入。
考虑到不止一轮比赛,而且有时候玩家玩腻了就有可能想退出游戏或者重新开始,或者是想看下总得分,G点或者是每一轮得分,所以我在此处又使用switch()函数设置了一个List可供玩家选择。
最后由于是软件,退出游戏时给玩家提供了提意见的渠道
Tip->其中有一个关键的排序算法【冒泡排序】
原理:临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束。以下是我程序中冒泡排序的代码:
1 for(i=0;i<n-1;i++) 2 for(j=0;j<n-i-1;j++) 3 { 4 if(b[j]>b[j+1]) 5 { 6 t=b[j+1]; 7 b[j+1]=b[j]; 8 b[j]=t; 9 } 10 }
四、编写感想
由于第一次接触结队编程,我第一次在计算机领域中感受到了1+1>2的感觉,本来需要3天左右完成的代码,只用了1天半就完成了,而且由于有赵英男同学的复审,我的很多代码语法或者别的小错误都快速得到了解决,并且在我俩激烈的讨论下,不断不断的完善程序的功能,并美化了界面,所以我以后写代码,希望更多得通过结队编程的形式而不是个人单打独斗,因为这样又节省时间又高效而且可以从他人身上发现许多自己没有的东西并去学习去升华自我,提升编程能力以及协作交流能力。未来的路很长,不管走到哪里,我学会更好的与他人交流协作。最后再一次感谢赵英男同学(http://www.cnblogs.com/zhaoyingnan/ 这是他的博客 )对我的帮助!附上2张记录我俩一起努力的时间与汗水的照片~
五、代码附录
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<math.h> 4 void main() 5 { 6 int d[9999],p[9999],n,i,j,m; 7 double a[9999],Ave,G,Q,b[9999],c[9999],t,s; 8 Third: printf("\n\n\n\n\t\t\t* 欢迎来到朴宝英的“黄金点游戏”*\n\n\t\t\t【1】 开始新游戏\n\n\t\t\t【2】 游戏规则\n\n\t\t\t【3】 上局玩家比分扳\n\n\t\t\t【4】 退出游戏\n\n\t\t\t请输入相应的选项,按回车键确定: "); 9 scanf("%d",&m); 10 system("cls"); 11 switch(m) 12 { 13 case 1: 14 { 15 printf("\n\n\n\n\t\t\t请输入进行游戏的玩家人数:"); 16 scanf("%d",&n); 17 system("cls"); 18 for(i=0;i<n;i++) 19 { 20 d[i]=0; 21 } 22 Second: s=0; 23 for(i=0;i<n;i++) 24 { 25 p[i]=0; 26 } 27 for(i=0;i<n;i++) 28 { 29 Loop: printf("\n\n\n\n\t\t\t请第%d位玩家输入所猜的数字****** ",i+1); 30 scanf("%lf",&a[i]); 31 if(a[i]>0&&a[i]<100) 32 s=s+a[i]; 33 else 34 { 35 system("cls"); 36 printf("\n\n\t ********ERROR********\n\n\t"); 37 printf("输入数字必须在(0~100)的开区间内,请按回车键重新输入。"); 38 printf("\n\n\t ********************\n\n\t"); 39 system("pause"); 40 system("cls"); 41 goto Loop; 42 } 43 system("cls"); 44 } 45 Ave=s/((double)n); 46 G=Ave*0.618; 47 for(i=0;i<n;i++) 48 { 49 Q=a[i]-G; 50 if(Q<0) 51 { 52 Q=-Q; 53 } 54 b[i]=Q; 55 c[i]=b[i]; 56 } 57 for(i=0;i<n-1;i++) 58 for(j=0;j<n-i-1;j++) 59 { 60 if(b[j]>b[j+1]) 61 { 62 t=b[j+1]; 63 b[j+1]=b[j]; 64 b[j]=t; 65 } 66 } 67 for(i=0;i<n;i++) 68 { 69 if(b[0]==c[i]) 70 { 71 d[i]=d[i]+n; 72 p[i]=n; 73 } 74 if(b[n-1]==c[i]) 75 { 76 d[i]=d[i]-2; 77 p[i]=-2; 78 } 79 } 80 First: printf("\n\n\n\n\t\t\t* List *\n\n\t\t\t【1】 查看本轮玩家得分情况\n\n\t\t\t【2】 查看本“轮黄金分割常数G的值”\n\n\t\t\t【3】 玩家比分扳\n\n\t\t\t【4】 进行下一轮\n\n\t\t\t【5】 回到游戏主菜单\n\n\t\t\t请输入相应的选项,按回车键确定: "); 81 scanf("%d",&m); 82 system("cls"); 83 switch(m) 84 { 85 case 1: 86 { 87 printf("\n\t\t\t*本轮各位玩家得分情况:*\n\t\t\t\n"); 88 for(i=0;i<n;i++) 89 { 90 printf("\n\t\t\t第%d位玩家本轮得分: %d 分\n\t\t\t",i+1,p[i]); 91 } 92 printf("\n\nTip:点击回车键回到List\n\n"); 93 system("pause"); 94 system("cls"); 95 goto First; 96 }break; 97 case 2: 98 { 99 printf("\n\n\t ********Golden Point********\n\n\t"); 100 printf(" 轮黄金分割常数G的值:%0.5lf",G); 101 printf("\n\n\t ****************************\n\n\t"); 102 printf("\n\nTip:点击回车键回到List\n\n"); 103 system("pause"); 104 system("cls"); 105 goto First; 106 }break; 107 case 3: 108 { 109 printf("\n\t\t\t*各位玩家总得分情况:*\n\t\t\t\n"); 110 for(i=0;i<n;i++) 111 { 112 printf("\n\t\t\t第%d位玩家: %d 分\n\t\t\t",i+1,d[i]); 113 } 114 printf("\n\nTip:点击回车键回到List\n\n"); 115 system("pause"); 116 system("cls"); 117 goto First; 118 }break; 119 case 4: 120 { 121 goto Second; 122 }break; 123 case 5: 124 { 125 goto Third; 126 }break; 127 default:{}break; 128 } 129 }break; 130 case 2: 131 { 132 printf("\n\n\t ********Rule********\n\n\t"); 133 printf("N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。\n\n"); 134 printf("\n\t ********************"); 135 printf("\n\nTip:点击回车键回到Home页面\n\n"); 136 system("pause"); 137 system("cls"); 138 goto Third; 139 }break; 140 case 3: 141 { 142 printf("\n\t\t\t*各位玩家总得分情况:*\n\t\t\t\n"); 143 for(i=0;i<n;i++) 144 { 145 printf("\n\t\t\t第%d位玩家: %d 分\n\t\t\t",i+1,d[i]); 146 } 147 printf("\n\nTip:点击回车键回到List\n\n"); 148 system("pause"); 149 system("cls"); 150 goto Third; 151 }break; 152 case 4: 153 { 154 printf("\n\n\t******************************************************************\n\n"); 155 printf("\n\t\t感谢您对朴宝英软件公司的支持\n\n\t\t如果您对软件有意见请把意见以邮件形式发至\n\n\t\t295793858@qq.com\n\n\t\t我们将会尽快给您答复!\n\t\t"); 156 printf("\n\n\t******************************************************************\n\n"); 157 } 158 default:{}break; 159 } 160 } 161 162