似乎是黄金点游戏

Gold-Point

黄金点游戏,包含服务器和客户端。已有两个版本,一款运行于Windows环境,使用纯C语言开发,支持多线程和TCP网络通信。另一款使用Qt开发,具有图形化界面,可跨平台。

 

1、游戏简介

 黄金点游戏是一个数字小游戏,其游戏规则是:

      N个同学,每人写一个有理数,交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。

2、游戏玩法

      玩家自己输入游戏轮数和人数设定,在输入自己所写的数,然后程序自动运行得出分数

3、设计思路

      ①从10个用户处获取数据

      ②获取G值,设所有用户提供数字的平均值与0.618的积为G值。

      ③获取用户数据中距离G点最近的值和最远的值,即获取赢家数据保存下标和输家数据保存下标,先调用之前的获取G点方法得到G的值,再把所有数据分别与之相减取绝对值得到差值数组,最后把差值数组内的每一个值分别与G值比较,保存下差距最大和差距最小者的下标。

      ④数据处理,获取赢家成绩和输家成绩后,我们发现如果赢家不止一位,输家也不止一位,两个位置都有多个人占据,那么上面的代码就不能满足需求,所以要进行数据重复处理,获取完最大值和最小之后,反回去对原始距离数据进行对比,得出最大值和最小值的数据下标。

      ⑤得出输赢,游戏运行完毕,用户的成绩各不相同,所以需要将其排序输出来使结果。

 

4、黄金点源代码

#include<stdio.h>
#include<stdlib.h>
#define N 50
int l = 1;

struct User
{
char name[10];//名字
double number;//有理数
double goal;//得分
double golden;//黄金数
User* next=NULL;
};

void getin_name(User *Head1, int sum_people1)//输入名字和数字
{
User *q, *p;
q = Head1;
for (int i = 0; i<sum_people1; i++)
{
p = (User *)malloc(sizeof(User));
p->next = NULL;
printf("输入名字:\n");
scanf("%s", p->name);
printf("输入数字\n");
scanf("%lf", &p->number);
printf("\n");
printf("\n");
q->next = p;
q = p;
}

}

void get_count(User *Head2, int sum_people2)
{
double sum = 0;
User *y, *s;
y = Head2->next;
s = Head2->next;
while (y != NULL)
{
sum = y->number + sum;
y = y->next;
}
s = Head2->next;
while (s != NULL)
{
s->golden = sum / sum_people2*0.618;
s = s->next;
}
}

void get_score(User *Head3, int sum_people3, double value11, double value21)//计算得分
{
User *e;
e = Head3->next;
while (e != NULL)
{
if (e->number>e->golden)
{
if (e->number - e->golden == value11)
{
e->goal = -2;

}
else if (e->number - e->golden == value21)
{

e->goal = sum_people3;
}
else
{
e->goal = 0;
}

e = e->next;

}
else
{
if (e->golden - e->number == value11)
{
e->goal = -2;
}
if (e->golden - e->number == value21)
{
e->goal = sum_people3;
}
else
{
e->goal = 0;
}
e = e->next;
}
}
}

void put_message(User *Head4)//输出结果
{
User *h;
h = Head4->next;
printf("第%d轮情况:\n", l);
while (h!= NULL)
{
printf("姓名:%s 输入的数字:%lf 本人得分:%lf 黄金值:%lf\n", h->name, h->number, h->goal, h->golden);
h = h->next;
}
l++;
}

int main()
{
User users[N];
double gol;
double value1 = -1;//最大值
double value2 = 1000;
int sum_people;//总人数
int ring;//总轮数
printf(" **********黄金点游戏*********\n");
printf(" 输入玩游戏总人数:\n");
scanf("%d", &sum_people);
printf(" 输入想要玩的总轮数:\n");
scanf("%d", &ring);//总轮数
printf("\n");
printf("\n");

User *Head, *u;
for (int i = 0; i < ring; i++) {
Head = (User *)malloc(sizeof(User));
Head->next = NULL;
getin_name(Head, sum_people);
get_count(Head, sum_people);

//比较
u = Head->next;
while (u != NULL)
{
if (u->number > u->golden)
{
gol = u->number - u->golden;
if (gol > value1)
{
value1 = gol;
}
if (gol <= value2)
{
value2 = gol;
}
u = u->next;
}
else {
gol = u->golden - u->number;
{
if (gol > value1)
{
value1 = gol;
}
if (gol <= value2)
{
value2 = gol;
}
u = u->next;
}
}
}
get_score(Head, sum_people, value1, value2);
put_message(Head);
users[i].next = Head->next;
}
for (int r = 0; r < ring; r++) { //游戏结束后输出各轮游戏的黄金点
printf("第%d轮结果:\n", r+1);
printf("此轮黄金值是:%lf ", users[r].next->golden);
printf("\n");
printf("\n");
}
return 0;
}

 

5、 总结:

     本次游戏为结对项目,但由于个人参与校级事由原因,未能组队。我借鉴网上的代码再寻求大神一起讨论与解读,最后掌握初步的代码。

posted @ 2017-10-28 22:11  昕格尔  阅读(174)  评论(1编辑  收藏  举报