结对作业-黄金点
黄金点游戏
黄金点游戏是一个数字小游戏,其游戏规则是:
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轮以上,并能够保留各轮比赛结果。
一.作业分工
该次结对作业由我与张翌辰同学共同完成,其中张翌辰同学负责编写代码,而我负责查找错误并修改错误,由于我不会java,所以采用C语言编写,所以界面没有太完美,但是功能齐全,简单好用。
二.代码思路与运行界面
该次代码主要运用switch()函数,for函数语句,冒泡排序法,运用数组编写。
1.主界面
2.得分界面
3.该轮游戏结束界面
三.结对感言
通过这一次的结对作业,我明显感觉到了团队的力量,结对编程省时高效,而且可以从别人身上发现自己的不足和缺点从而改正,
发现对方的优点进而学习,互相帮助,相互促进共同进步,再一次感谢张翌辰同学的帮助(http://www.cnblogs.com/bigchicken/这是他的博客)。
四.代码程序
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
void main()
{
int d[9999],p[9999],n,i,j,m;
double a[9999],Ave,G,Q,b[9999],c[9999],t,s;
Third: printf("\n\n\n\n\t\t\t* 欢迎来到朴宝英的“黄金点游戏”*\n\n\t\t\
t【1】 开始新游戏\n\n\t\t\t【2】 游戏规则\n\n\t\t\t【3】 上局玩家比分扳\n\n\t
\t\t【4】 退出游戏\n\n\t\t\t请输入相应的选项,按回车键确定: ");
scanf("%d",&m);
system("cls");
switch(m)
{
case 1:
{
printf("\n\n\n\n\t\t\t请输入进行游戏的玩家人数:");
scanf("%d",&n);
system("cls");
for(i=0;i<n;i++)
{
d[i]=0;
}
Second: s=0;
for(i=0;i<n;i++)
{
p[i]=0;
}
for(i=0;i<n;i++)
{
Loop: printf("\n\n\n\n\t\t\t请第%d位玩家输入所猜的数字****** ",i+1);
scanf("%lf",&a[i]);
if(a[i]>0&&a[i]<100)
s=s+a[i];
else
{
system("cls");
printf("\n\n\t ********ERROR********\n\n\t");
printf("输入数字必须在(0~100)的开区间内,请按回车键重新输入。");
printf("\n\n\t ********************\n\n\t");
system("pause");
system("cls");
goto Loop;
}
system("cls");
}
Ave=s/((double)n);
G=Ave*0.618;
for(i=0;i<n;i++)
{
Q=a[i]-G;
if(Q<0)
{
Q=-Q;
}
b[i]=Q;
c[i]=b[i];
}
for(i=0;i<n-1;i++)
for(j=0;j<n-i-1;j++)
{
if(b[j]>b[j+1])
{
t=b[j+1];
b[j+1]=b[j];
b[j]=t;
}
}
for(i=0;i<n;i++)
{
if(b[0]==c[i])
{
d[i]=d[i]+n;
p[i]=n;
}
if(b[n-1]==c[i])
{
d[i]=d[i]-2;
p[i]=-2;
}
}
First: printf("\n\n\n\n\t\t\t* List *\n\n\t\t\t【1】 查看本轮玩家得分情况
\n\n\t\t\t【2】 查看本“轮黄金分割常数G的值”\n\n\t\t\t【3】 玩家比分扳\n\n\t\t
\t【4】 进行下一轮\n\n\t\t\t【5】 回到游戏主菜单\n\n\t\t\t请输入相应的选项,按回车键确定: ");
scanf("%d",&m);
system("cls");
switch(m)
{
case 1:
{
printf("\n\t\t\t*本轮各位玩家得分情况:*\n\t\t\t\n");
for(i=0;i<n;i++)
{
printf("\n\t\t\t第%d位玩家本轮得分: %d 分\n\t\t\t",i+1,p[i]);
}
printf("\n\nTip:点击回车键回到List\n\n");
system("pause");
system("cls");
goto First;
}break;
case 2:
{
printf("\n\n\t ********Golden Point********\n\n\t");
printf(" 轮黄金分割常数G的值:%0.5lf",G);
printf("\n\n\t ****************************\n\n\t");
printf("\n\nTip:点击回车键回到List\n\n");
system("pause");
system("cls");
goto First;
}break;
case 3:
{
printf("\n\t\t\t*各位玩家总得分情况:*\n\t\t\t\n");
for(i=0;i<n;i++)
{
printf("\n\t\t\t第%d位玩家: %d 分\n\t\t\t",i+1,d[i]);
}
printf("\n\nTip:点击回车键回到List\n\n");
system("pause");
system("cls");
goto First;
}break;
case 4:
{
goto Second;
}break;
case 5:
{
goto Third;
}break;
default:{}break;
}
}break;
case 2:
{
printf("\n\n\t ********Rule********\n\n\t");
printf("N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100)
,交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。提交的数字
最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。\n\n");
printf("\n\t ********************");
printf("\n\nTip:点击回车键回到Home页面\n\n");
system("pause");
system("cls");
goto Third;
}break;
case 3:
{
printf("\n\t\t\t*各位玩家总得分情况:*\n\t\t\t\n");
for(i=0;i<n;i++)
{
printf("\n\t\t\t第%d位玩家: %d 分\n\t\t\t",i+1,d[i]);
}
printf("\n\nTip:点击回车键回到List\n\n");
system("pause");
system("cls");
goto Third;
}break;
case 4:
{
printf("\n\n\t******************************************************************\n\n");
printf("\n\t\t感谢您对朴宝英软件公司的支持\n\n\t\t如果您对软件有意见请把意见以
邮件形式发至\n\n\t\t295793858@qq.com\n\n\t\t我们将会尽快给您答复!\n\t\t");
printf("\n\n\t******************************************************************\n\n");
}
default:{}break;
}
}