结对编程--黄金点游戏
1、要求:
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、讨论过程:
本次试验我们采取的是结对编程的方式,我和我们班郭光耀一起结对编程,刚开始时由于学习习惯不太一样,而且自习时间不统一,导致效率不是很高。但是经过几天的编程,我们相互熟悉后,编程效率显著提高,最终成功完成任务,同时我也感谢我们班其他同学在我们遇到困难时对我们的帮助。
设计过程:
本次代码由于需要输入需要的轮次以及人数,所以我们采取了for循环来完成数据的输入
for(i=0;i<N;i++)int f(int*s)
{
int j,t,i;
for(i=0;i<N-1;i++)
{
for(j=0;j<N-1;j++)
if(s[j]>s[j+1])
{
t=s[j];
s[j]=s[j+1];
s[j+1]=t;
}
}return s[i];}
。
运用这段代码实现最大值查找以及实现分数的赋值
在判断G值过程中通过#include<math.h>头文件下fabs绝对值来求取我们所需要的G值
最后在运行完一轮过后,必须重新赋初值,否则初值会带到第二轮中,影响G值得结果。最后通过while 循环scanf("%s",&y);重新回到下一次的输入
判断是否进行下一次输出。
将最高分赋值过student[i]
for(i=0;i<n;i++)
{
if(student[i]>maxscore)
{
maxscore=student[i];
}
}
最后输出结果。
3、过程问题:
1.在判断最接近G值时,没加math.h文件,导致fabs没办法使用
2.在运算第二次求G值的时候,输入同样的数,G值变成两倍最后才发现在第二次求值的时候必须将初始值赋予初始化
3.还有许多如拉掉分号,花括号之类的问题。
4、运行结果:
开始输入数据以及第一次结果的截图:
结束时的截图:
5、合作拍照:
6、感悟:因为我们两个人没有学习过出c/s和b/s,所以我们在看见需要使用时,感到了自身学习的不足,在往后的日子里我将努力学习,努力提高自己的编程能力。另外在编写代码的时候,由于时间安排上的不同,所以在一起编写代码时间不是很多,所以遇到问题就经常通过qq在网上沟通商量。
最后代码已经存入coding。
7、源程序代码:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
double Sum(int a,int num[]);
void main()
{
system("color 3F");
int i,n,m,k ,G;
char y='Y';
int a=0, Max, student[10000],num[1000];
double b=0.0, min = 10000 , max = 1;
while(y=='Y')
{
Max=-1;
printf("请输入游戏人数:");
scanf("%d",&n);
printf("请输入游戏局数:");
scanf("%d",&m);
printf("***********************************游戏开始***********************************\n");
for(i=0;i<n;i++) //将得分数组赋值0
{
student[i]=0;
}
for(k=0;k<m;k++)//输入学生数,并将分数求和
{
printf("第%d轮游戏:\n",k+1);
for(i=1;i<=n;i++)
{
printf("第%d个人的数字:",i);
scanf("%d",&num[i-1]);
a = num[i-1]+a;
}
printf("G值为:%.3f \n",b=a/n*0.618);
for(i=0;i<n;i++)
{
if(fabs(num[i]-b)<min) //fabs调用绝对值函数
{
min=fabs(num[i]-b);
}
}
for(i=0;i<n;i++)
{
if(fabs(num[i]-b)>max)
{
max=fabs(num[i]-b);
}
}
for(i=0;i<n;i++) //赋值
{
if(fabs(num[i]-b)==max)
{
student[i]=-2;
}
if(fabs(num[i]-b)==min)
{
student[i]=10;
}
if(fabs(num[i]-b)!=min&&fabs(num[i]-b)!=max)
{
student[i]=0;
}
}
a=0,b=0.0;
max=1,min=10000;
printf("每人得分是:\n");
for(i=0;i<n;i++)
{
printf("第%d位学生的得分为%d\n",i+1,student[i]);
}
}
for(i=0;i<n;i++) //找到最高分
{
if(student[i]>Max)
{
Max=student[i];
}
}
printf("\n");
printf("游戏结束!\n");
printf("恭喜得分为%d的同学获胜!\n",Max); //输出游戏结果
printf("\n");
printf("输入“Y”继续玩下去,否则输入“不玩了”");
scanf("%s",&y);//继续就发挥while函数
}
/*ave(double a)
{
double g,sum;
sum=a*0.618;
}*/
}