经过近两个星期结对项目编程,从中收获了很多也发现了许多自身存在的问题。结对编程过程中比如讨论分工问题,起初不知如何下手,后来经过慢慢讨论有了比较合理的分工。我和我的同伴有着不同性格和工作方式,在做项目的过程中会有很多不同的思路和想法,编程习惯也不相同。他喜欢从整体入手,先想好程序的每一个环节,构思好整体后,才开始编程。就我而言,我习惯一层一层,循序渐进的进行编程,将每个环节做好然后进行下一项,虽然效率有点慢,但是对我来说,这种方式能让我在编程的时候少出错。我很喜欢我同伴预先做好整体构思的方法,很便捷,对于后面的编程我会尝试着用这种方式编写代码,这对培养大局观很有帮助。
编程过程中,因为要考虑到局数和人数,所以就定义了一个二维数组,行标表示第几局游戏,列标表示人数,用二维数组来存储每个玩家输入的数据,然后计算黄金点,对每个玩家进行游戏评分,将得分放到另一个数组中。统计每轮个玩家游戏得分,输出最终得分,存入文件中。编程过程很顺利没有遇到太大问题,有一些小的错误很快就改正了。我们没有做界面,同学有用JAVA做的,界面做的非常好,我也正在学习JAVA。不过目前只能写个HELLO WORLD。
对于游戏中的输入数值有减小的趋势这一现象我们在理想情况下做个假设,玩家的数据肯定是随机输入,那么平均值就和该组数据的中间值(数据从小到大排列)很接近,黄金点在平均值基础上乘0.618,约在前一半数据的中上部,即整组数据的30%左右(数据从小到达排列),如此一来大家就会发现胜者的数据往往比较小,自然而然在新一轮游戏开始时都会适当减小自己的数据。
程序代码:
#include <stdio.h>
#include <math.h>
#include<stdlib.h>
void main()
{
int a[20][20], grade[20], i, j, k1, k2, t, b, data, total = 0;
double min = 100, max = 0, average = 0;
FILE *fp;
char ch;
printf("请输入游戏局数:\n");
scanf_s("%d", &t);
printf("请输入游戏人数:\n");
scanf_s("%d", &b);
for (j = 0; j < b; j++)
{
grade[j] = 0;
}
for (i = 0; i < t; i++)
{
printf("第%d局游戏开始:\n", i + 1);
printf("请依次输入参与者的数据:\n");/*单局中输入相同数据者只有最先输入者得分*/
for (j = 0; j < b; j++)
{
scanf_s("%d", &data);
a[i][j] = data;
total = total + data;
}
average = total / b*0.618;
printf("黄金点为:%.4f", average);/*打印黄金点*/
for (j = 0; j < b; j++)
{
if (fabs(a[i][j] - average) < min)
{
min = fabs(a[i][j] - average);
k1 = j;
} /*寻找当前局距离黄金点最近的人*/
if (fabs(a[i][j] - average) > max)
{
max = fabs(a[i][j] - average);
k2 = j;
} /*寻找当前局距离黄金点最远的人*/
}
grade[k1] = grade[k1] + t; /*为胜者加分*/
grade[k2] = grade[k2] - 2; /*为负者减分*/
printf("输出本局得分:\n");
for (j = 0; j < b; j++)
{
printf("%d ", grade[j]);
}
printf("\n");
min = 100;
max = 0;
total = 0;
}
printf("游戏结束,各人得分如下:\n");
if ((fp = fopen("d:\\zmh.txt", "w+")) == NULL)
{
printf("cannot open file");
exit(1);
}
for (j = 0; j < b; j++)
{
printf("%d ", grade[j]); /*打印各人得分*/
if (grade[j] < 0)
{
grade[j] = abs(grade[j]);
ch = '-';
fputc(ch, fp);
}
ch = grade[j] + '0';
fputc(ch, fp);
ch = ' ';
fputc(ch, fp);
}
printf("\n");
max = 0;
for (j = 0; j < b; j++)
{
if (grade[j] > max)
{
max = grade[j]; /*比较出最高分数*/
}
}
for (j = 0; j < b; j++)
{
if (grade[j]==max)
printf("最高得分者是第%d人 %d分\n", j + 1, grade[j]);/*最高得分者可并列*/
}
fclose(fp);
getchar();
getchar();
}