结对编程——黄金点游戏
-
项目描述:黄金点游戏
黄金点游戏是一个数字小游戏,其游戏规则是:
N个同学(N通常大于10),每人写一个0-100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。玩了几天以后,大家发现了一些很有意思的现象,比如黄金点在逐渐地往下移动。
现在请大家根据这个游戏规则,编一个可以多人一起玩的小游戏程序,要求如下:
1、如果可能的话尽量以C/S或B/S方式实现,即利用服务器接收和处理所有玩家提交的数字,并将结果反馈给各玩家,玩家可以通过客户端提交数字;
2、如果采用单机方式实现的话,需要为用户提供便利的输入界面;
3、该游戏每次至少可以运行10轮以上,并能够保留各轮比赛结果。
本程序用C语言实现,源代码由我和我队友共同完成,代码已上传至coding.net系统中
我的coding.net链接:https://git.coding.net/Aaric/GoldlenPoint.git
队友的coding.net链接:https://git.coding.net/KLAPT/d.klb.git
1 #include<stdio.h> 2 #include<stdlib.h> 3 #define N 50 4 int l = 1; 5 6 struct User 7 { 8 char name[10];//名字 9 double number;//有理数 10 double goal;//得分 11 double golden;//黄金数 12 User* next=NULL; 13 }; 14 15 void getin_name(User *Head1, int sum_people1)//输入名字和数字 16 { 17 User *q, *p; 18 q = Head1; 19 for (int i = 0; i<sum_people1; i++) 20 { 21 p = (User *)malloc(sizeof(User)); 22 p->next = NULL; 23 printf("输入名字:\n"); 24 scanf("%s", p->name); 25 printf("输入数字\n"); 26 scanf("%lf", &p->number); 27 printf("\n"); 28 printf("\n"); 29 q->next = p; 30 q = p; 31 } 32 33 } 34 35 void get_count(User *Head2, int sum_people2) 36 { 37 double sum = 0; 38 User *y, *s; 39 y = Head2->next; 40 s = Head2->next; 41 while (y != NULL) 42 { 43 sum = y->number + sum; 44 y = y->next; 45 } 46 s = Head2->next; 47 while (s != NULL) 48 { 49 s->golden = sum / sum_people2*0.618; 50 s = s->next; 51 } 52 } 53 54 void get_score(User *Head3, int sum_people3, double value11, double value21)//计算得分 55 { 56 User *e; 57 e = Head3->next; 58 while (e != NULL) 59 { 60 if (e->number>e->golden) 61 { 62 if (e->number - e->golden == value11) 63 { 64 e->goal = -2; 65 66 } 67 else if (e->number - e->golden == value21) 68 { 69 70 e->goal = sum_people3; 71 } 72 else 73 { 74 e->goal = 0; 75 } 76 77 e = e->next; 78 79 } 80 else 81 { 82 if (e->golden - e->number == value11) 83 { 84 e->goal = -2; 85 } 86 if (e->golden - e->number == value21) 87 { 88 e->goal = sum_people3; 89 } 90 else 91 { 92 e->goal = 0; 93 } 94 e = e->next; 95 } 96 } 97 } 98 99 void put_message(User *Head4)//输出结果 100 { 101 User *h; 102 h = Head4->next; 103 printf("第%d轮情况:\n", l); 104 while (h!= NULL) 105 { 106 printf("姓名:%s 输入的数字:%lf 本人得分:%lf 黄金值:%lf\n", h->name, h->number, h->goal, h->golden); 107 h = h->next; 108 } 109 l++; 110 } 111 112 int main() 113 { 114 User users[N]; 115 double gol; 116 double value1 = -1;//最大值 117 double value2 = 1000; 118 int sum_people;//总人数 119 int ring;//总轮数 120 printf(" **********黄金点游戏*********\n"); 121 printf(" 输入玩游戏总人数:\n"); 122 scanf("%d", &sum_people); 123 printf(" 输入想要玩的总轮数:\n"); 124 scanf("%d", &ring);//总轮数 125 printf("\n"); 126 printf("\n"); 127 128 User *Head, *u; 129 for (int i = 0; i < ring; i++) { 130 Head = (User *)malloc(sizeof(User)); 131 Head->next = NULL; 132 getin_name(Head, sum_people); 133 get_count(Head, sum_people); 134 135 //比较 136 u = Head->next; 137 while (u != NULL) 138 { 139 if (u->number > u->golden) 140 { 141 gol = u->number - u->golden; 142 if (gol > value1) 143 { 144 value1 = gol; 145 } 146 if (gol <= value2) 147 { 148 value2 = gol; 149 } 150 u = u->next; 151 } 152 else { 153 gol = u->golden - u->number; 154 { 155 if (gol > value1) 156 { 157 value1 = gol; 158 } 159 if (gol <= value2) 160 { 161 value2 = gol; 162 } 163 u = u->next; 164 } 165 } 166 } 167 get_score(Head, sum_people, value1, value2); 168 put_message(Head); 169 users[i].next = Head->next; 170 } 171 for (int r = 0; r < ring; r++) { //游戏结束后输出各轮游戏的黄金点 172 printf("第%d轮结果:\n", r+1); 173 printf("此轮黄金值是:%lf ", users[r].next->golden); 174 printf("\n"); 175 printf("\n"); 176 } 177 return 0; 178 }
-
结队编程
-
我的搭档
-
我的搭档来自美丽的云南,一个山清水秀的地方。我一直好奇他为什么跨越大半个中国来沈阳,得到的回答是:命运!拽的不行不行的。在我的印象里,他确实是一个热情,开朗,大方,阳光而且很帅气的小伙子,很踏实,很青春。
他的博客链接:http://www.cnblogs.com/KL2016/p/5964215.html
下面是我俩的照片,近处是我,远处是我的搭档。
-
-
我对他的评价
-
评价别人可是一件很严肃的事情,背后偷摸说说也就算了,这么光明正大地评价感觉压力好大——万一出点意外打起来咋整,我可没把握打赢他!
我队友性格很随和,跟周围人相处的都挺好,办起事来认真踏实,效率很高,一起写代码的时候他的结果经常比我的先出。一个人写的代码或多或少总会有一些不足,而且自己也很难发现,我俩一起调试代码的时候他总是很耐心的给我讲解他的思路,我的一些错误他也能及时指出,大大提高了代码的质量以及编程效率。
-
-
各自的工作及习惯总结
-
一开始我俩一起交流想法,讨论编程思路,总结出大概的框架,然后各自编写具体代码,将代码合并之后俩人一块调试,再一块分析一些细节问题,之后各自分配任务,再去实现自己的代码。。。经过一次次的磨合之后任务才最终完成。
我队友的编程习惯和我差不多,包括命名规则、代码格式、封装等等,毕竟都是相同的老师教的,这就进一步提高了我们结对编程的效率。在命名规则上,他通常用单词加下划线的方式命名。如用sum_people表示总人数,见名知其意!代码格式中保证缩进及不同模块间的空行,以及必要的注释,代码可读性很高。
-
总结
紧赶慢赶一个星期,总算及时完成了这个任务,这期间虽然很幸苦,但很值得。有很多不会的东西需要边学边用,比如一些算法设计相关的知识。整个过程中我对结对编程最大的体会就是编程效率极高,自己编的代码对方总能很快找出一些问题,并及时修改。再加上我们都很注意编码规范,所以理解对方的代码对我们并没有很大的影响。此次任务让我对我的搭档也有了进一步的了解,希望以后的团队编程中能配合的更好。