黄金点游戏程序
背景
N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618 (所谓黄金分割常数),得到G值。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。
需求分析
实现背景里的规则
采用单机方式实现,需要为用户提供便利的输入界面。
该游戏每次至少可以运行10轮以上,并能够保留各轮比赛结果。
后续在此基础上迭代开发。
使用语言:C++
类
定义了以下几个类:
Player类:
class Player {
public:
int score;
int id;
double value;
Player(){
id = 0;
score = 0;
value = 0;
}
};
Judger类:
class Judger {
public:
//轮次
int times;
//人数
int count;
int score[100][10];
float ans;
void CalAns(Player p[],int GameTimes);
void Print();
};
重要函数:
CalAns函数:
功能:用于计算游戏结果,并为成员打分
void Judger::CalAns(Player p[],int GameTimes) { //我们发现当多名临界分数玩家答案一样时,得分会不符合直觉,后续中我们将进行优化
double total = 0;
double Max = 0;
int Maxi=0;
double Min = 200;
int Mini=0;
for (int i = 0; i < count; i++) {
total += p[i].value;
}
ans = total / count * 0.618;
cout << "ans:" << ans << endl;
for (int i = 0; i < count; i++) {
if (abs(p[i].value - ans) < Min)
{
Min = abs(p[i].value - ans);
Mini = i;
}
if (abs(p[i].value - ans) > Max)
{
Max = abs(p[i].value - ans);
Maxi = i;
}
}
p[Maxi].score -= 2;
p[Mini].score += 2;
for (int i = 0; i < count; i++) {
score[GameTimes][i] = p[i].score;
}
}
Print函数:
功能:用于输出游戏结果
void Judger::Print() {
for (int i = 0; i < count; i++) {
double tmptot=0;
cout << "玩家" << i + 1 << "每轮的分数为:";
for (int j = 0; j < times; j++) {
cout << score[j][i] << " ";
tmptot += score[j][i];
}
cout << "总分:" << tmptot << endl;
}
}