软件工程实验课:黄金点游戏的设计(第一周)
黄金点游戏初步设计思路
N个同学(N通常大于10),每人写一个0~100之间的有理数(不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值,提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其余同学得到0分。
采用单机方式实现,需要为用户提供便利的输入界面。
这游戏每次至少可以运行10轮以上,并能够保留每轮比赛结果。
后续在此基础上迭代开发。
设计概念图:
因为图形窗口界面尚在学习过程中,所以先用C++写了一个命令行窗口的简易版
`#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<conio.h>
int main(void)
{
int num = 0; //人数
int goal[100]; //每名玩家的总得分
printf(“请输入游玩的人数(建议游玩人数大于10):\n”);
scanf("%d", &num);
int a;
for (a = 0; a < num; a++)
{
goal[a] = 0;
}
lable: int sum = 0; //每轮输入数字和
double gp = 0; //每轮的黄金点
double min = 10000; //每轮最接近黄金点的数与黄金点的差的平方
double max = 0; //每轮最不接近黄金点的数与黄金点的差的平方
int minnum = 0; //每轮最接近黄金点的数的序号
int maxnum = 0; //每轮最不接近黄金点的数的序号
int array[100]; //每轮输入数字集合的数组
int i = 0; //用于函数循环的变量
char j; //用于函数循环的变量
double k = 0; //用于函数循环的变量
printf(“请依次输入本轮数字(按回车键结束):\n”);
do
{
scanf("%d", &array[i]);
sum = sum + array[i];
i++;
} while (j = getchar() != ‘\n’);
gp = sum / i0.618;
for (i = 0; i < num; i++)
{
k = (array[i] - gp)(array[i] - gp);
if (k< min)
{
min = k;
minnum = i + 1;
}
if (k> max)
{
max = k;
maxnum = i + 1;
}
}
goal[minnum-1] = goal[minnum-1] + 2;
goal[maxnum-1] = goal[maxnum-1] - 2;
printf(“本轮的黄金点为:%lf\n”, gp);
printf("%d号得两分,%d号扣两分,其他人分数不变。\n", minnum, maxnum);
for (i = 0; i < num; i++)
{
printf("%d号玩家总得分为:%d\n", i + 1, goal[i]);
}
printf("\n");
goto lable;
_getch();
return 0;
}`