结对项目之黄金分割点游戏
FIRST 最开始要做的就是要隆重介绍一下我的队友:王珊同学
着重要提一句的是,我的拍档对此次结对编程项目相当的重视,因为当老师正式布置任务并对程序的做出具体要求,提出应实现的功能的时候,他就开始做了,第二天就给我了一份最初的代码,虽然那个0.0版本还有一些遗漏,但已经是一个可以玩儿的游戏了。而我那时还只是看了游戏的具体规则并没有进行实现。其效率之高让我惊讶~
这里附上我的搭档的博客:http://www.cnblogs.com/wcherry/
最终代码地址: https://coding.net/u/PerseusQ/p/Team_double/git/blob/master/Gold.cpp
然后,既然有了0.0版本,我们就可以对这个最初的程序进行相应的升级了。开始,这个程序只是写在了一个主函数里
1 #include "stdio.h" 2 #include "math.h" 3 #include "stdlib.h" 4 5 6 struct Player 7 { 8 int num; //玩家编号 9 float score; //玩家输入的数据 10 float modulus; //绝对值数据 11 }m[100]; 12 13 14 int main(int argc, char* argv[]) 15 { 16 struct Player m[100]; 17 int i,j,turn,k,peo,flag01; //turn 回合数 peo人数 18 float avescore; //平均值 19 float gloden_score; //黄金分割点 20 struct Player t; 21 bool flag=true; //flag 轮数 22 int a; 23 while(flag){ 24 system("cls"); 25 printf("童鞋你想玩儿几轮???(勇者,你必须至少玩儿10轮哦)\n"); 26 fflush(stdin); 27 flag01=scanf("%d",&k); //错误数据处理 28 if(k>=10){ 29 flag=false; 30 } 31 } 32 flag=true; 33 while(flag){ 34 system("cls"); 35 printf("同学,你想玩儿几p\n"); 36 fflush(stdin); 37 flag01=scanf("%d",&peo); 38 if(peo>=10){ 39 flag=false; 40 } 41 42 } 43 for(k=0;k<turn;k++) 44 { 45 system("cls"); //清屏函数 46 avescore=0; 47 printf("\n\n\n\n\n"); 48 for (i=0;i<10;i++) 49 { 50 m[i].num = i+1; 51 printf (" 第%d位玩家输入的数据:",m[i].num); 52 fflush(stdin); 53 flag01=scanf ("%f",&m[i].score); 54 avescore +=m[i].score; 55 } 56 avescore /=10; //求十个数的平均值 57 gloden_score=avescore*0.618; //求黄金分割点 58 59 printf("\n\n\n\n\n"); 60 printf (" 黄金分割点的值:%f\n",gloden_score); 61 62 printf("\n\n\n\n\n"); 63 for (i=0;i<10;i++) 64 { 65 m[i].modulus=fabs (gloden_score-m[i].score); //求绝对值 66 printf(" 第%d位玩家与黄金分割点的差是:%f\n",m[i].num, m[i].modulus); 67 } 68 69 printf("\n\n\n\n\n"); 70 for(i=1;i<10;i++) 71 for(j=0;j<10-i;j++) 72 if (m[j].modulus>m[j+1].modulus) 73 { 74 t=m[j]; 75 m[j]=m[j+1]; 76 m[j+1]=t; 77 } 78 printf(" 游戏排行(排行顺序由高到低):\n"); 79 for(i=0;i<10;i++) 80 printf (" 玩家%d\n",m[i].num); //冒泡排序 81 82 83 84 printf(" Do you want try again ?\n"); //判断是否继续游戏 85 printf(" Yes choose 1,No choose 2\n"); 86 printf(" 你的选择是:"); 87 /* scanf("%d",&a); 88 if (a==1) 89 flag=true; 90 else 91 break;*/ 92 } 93 return 0; 94 }
很显然这是不利于团队编程的,也是一种比较初级做法,毕竟我俩的编程能力比较基础,但是既然做了,就要做好,这也是我俩达成的共识,既然有问题我们就要齐心改好,当我提出这个问题之后,很快我们就达成一致,将其改为有多个实现不同功能的子函数组成的,较完善的程序。在这个过程中,我还发现:我们这个程序的容错能力较低,再次要特别感谢吕天一同学对我们程序提高容错能力方面的改进提出的相当宝贵的建议。我们使用了一个fflush函数,对错误的数据进行处理,我的搭档的博客中有详细的介绍,在这里我只做简单说明,虽然这个函数有的时候不太规范,但是他能做到清除数据缓冲区中的数据,使得我们数据错误的时候不至于进入死循环。一个完整的游戏或者说一个软件应该具有较高的系统容错能力。
1 fflush(stdin); 2 flag01=scanf ("%d",&Player_num); //错误数据处理
这就是该函数的具体写法。
再者就是0.0版本中并没有实现老师所要求的游戏人数必须在十人以上,游戏必须进行至少十轮的要求。我们简单的加了一个判断函数,只要输入了不符合要求的数据就要求用户重新输入。
然后来说说我们所分得子函数,经过几天的奋战我们将这个程序改为了一个包含多个子函数,由结构体数组来保存每位玩家的信息的程序。版本1.0诞生了
1 int GameInit(); 2 void Introduce(); 3 void DataDeal(int Player_num,float avescore ,struct Player m[NUM]); 4 void Compare(Player *m,int Player_num); 5 void Cal(int *b,Player *m,int Player_num);
int GameInit()函数用于实现对游戏玩家人数,游戏伦次,游戏玩家命名以及各位玩家输入各自数据的操作的实现,即完善游戏基本信息。
void Intorduce()函数用于介绍游戏规则。
void DataDeal()函数用于对数据的处理,即处理由玩家来输入的数据,求出黄金分割点的值,求出每位同学的数据与黄金分割点的差值,送
void Compare(Player *m,int Player_num)函数对这个差值进行处理,找到本轮应该扣分和应该加分的同学,再送void cal()函数将玩家进行
排序,每进行一轮排序一次。
以上就是1.0版本的基本思想。
在这次编程活动中,我的搭档做出了很多基础性的前期的工作,正是她为这个程序打下了基础,我正是在她的程序上不断地修改完成了这个小游戏软件。他写出
整个程序的大体框架,而我来逐步的完善细化整个程序。由此次编程我体会到,我们的代码必须要规范的编写,以利于自己的队友针对自己的程序进行编写,完善。
再者就是我们应该善于挑战自己不熟悉的东西,我俩的编程都不是很强,但是我们勇于尝试一些我们不熟悉的数据结构,如结构体,函数的调用等等,以此来逼着自己
不断地提高,不断地学习。同时,我们并不满足于实现,老师所规定的程序的功能,我们想出一些使其更利于用于使用的小东西小想法。