软件工程第三次作业

结对编程:黄金点游戏

一、题目描述

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

      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; 
View Code

三个功能函数,开始,规则介绍,计算

1 void start();   //游戏的初始化
2 void rule();            //游戏规则介绍
3 void count(PLAYER *p,float ave,int num);//计算比赛得分的函数
View Code

为输入的玩家分配空间,玩家输入数据,计算G值

 1     p=(PLAYER *)malloc(10*sizeof(PLAYER)); //动态分配结构体数组
 2 
 3     system("cls");
 4     printf("\n\n\n");
 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("\n\n");
19         printf("第%d轮比赛:\n",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\n",ave);
34         count(p,ave,player_num); 
35         flag=0;
36     }
View Code

计算玩家的成绩

 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("累计比赛得分:\n");
27     for(i=0;i<num;i++) {       //挨个玩家输出成绩
28         printf("      玩家%d: %d\n",p[i].name,p[i].score);
29     }
View Code

四、程序实现与总结

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/

 

posted @ 2016-10-16 16:44  凌姿寒  阅读(236)  评论(0编辑  收藏  举报