结对编程——黄金点游戏

  • 项目描述:黄金点游戏

黄金点游戏是一个数字小游戏,其游戏规则是:

  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表示总人数,见名知其意!代码格式中保证缩进及不同模块间的空行,以及必要的注释,代码可读性很高。

  • 总结

  紧赶慢赶一个星期,总算及时完成了这个任务,这期间虽然很幸苦,但很值得。有很多不会的东西需要边学边用,比如一些算法设计相关的知识。整个过程中我对结对编程最大的体会就是编程效率极高,自己编的代码对方总能很快找出一些问题,并及时修改。再加上我们都很注意编码规范,所以理解对方的代码对我们并没有很大的影响。此次任务让我对我的搭档也有了进一步的了解,希望以后的团队编程中能配合的更好。

posted @ 2016-10-15 13:43  Hello.Aaric  阅读(318)  评论(5编辑  收藏  举报