黄金点游戏结对编程

author author     2022-09-22     610

关键词:

游戏项目:

1.游戏名:经典游戏黄金点

2.游戏规则:N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数)得到G值。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。

3.驾驶员(Driver):秦超。领航员(Navigator):袁成杰

4.我们使用的是博客园的的源代码。我们做了如下的程序改动

  1. 原程序主函数有些“臃肿”,用一个界面显示函数把界面的代码包括在内。
  2. 原来项目在表述上有些不合理,所以我们做了适当的修改,这样更像是一个小游戏。
  3. 我们在原有基础上加了统计每位玩家的最后得分情况功能,使得黄金点游戏更有“游戏”为我们带来的“竞技”的味道。
  4. 具体代码如下:

 

#include "GP.h"

Decide_Node *Dhead; //决定游戏使用的是结构数组,结构数组的头部
U_decide_Node *udhead, *udnext, *udtail; //未决定的游戏轮数的,使用结构的3个指针
PNode *phead, *pnext, *ptail; //人结构的3个指针。每轮游戏,游戏人数不确定

int i=0;
void main()
{
int n; //知道游戏轮数的 游戏轮数
displayMenu();

switch (i)
{
case 1: Udecide_n(); break;
case 2:
{
n = Decide_n();

break;
}
case 3:
printf("谢谢使用 ");
break;

default:
return ;

}

Delete_n(n); //释放空间
Delete_u(); //释放空间
}

void displayMenu()
{
while(1)
{
printf(" ┌───────┐ ");
printf(" │ │ ");
printf(" │ 黄金点游戏 │ ");
printf(" │ │ ");
printf(" └───────┘ ");;

printf("游戏规则如下: ");
printf("N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100)");
printf("交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数)," );
printf("得到G值。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。 ");

printf("1.没有决定游戏进行几轮,先来一次 "); //每一轮的次数是N次
printf("2.决定游戏进行几轮 ");
printf("3.退出 ");
printf("输入选项: ");
scanf("%d",&i);
if(i>= 1 && i<= 3)
return;
}
}
void Delete_n(int n) // 释放结构数组
{
int i;
for (i = 0; i < n;i=0)
{
free(Dhead[i].node);
}
free(Dhead);
}
int Decide_n() //决定轮数游戏
{
int n; //玩游戏的总轮数
int i; //记录游戏玩到第几轮
int m; //玩一轮游戏,参加游戏的人数
int j; //在一轮游戏中,玩游戏的人
float sum; //一轮游戏中全部输入的数字和
float abmax; //输入的数与黄金点相差的绝对值最大值
float abmin; //输入的数与黄金点相差的绝对值最小值
int x; //是否输出每一轮的输入的信息

printf("请输入要进行的游戏轮数:");
scanf("%d", &n);
Dhead = (Decide_Node*)malloc(n*sizeof(Decide_Node));
if (Dhead == NULL)
{
printf("Decide_Node空间申请失败 ");
exit(1);
}
for (i = 0; i < n; i++)
{

printf("请输入游戏人数:");
scanf("%d", &m);
Dhead[i].node = (Pnode *)malloc(m*sizeof(Pnode));
if (Dhead[i].node == NULL)
{
printf("Dhead[%d].node申请空间失败 ", i);
exit(1);
}
sum = 0;
for (j = 0; j < m; j++)
{
printf("玩家%d:", j + 1);
scanf("%f", &Dhead[i].node[j].number); //第i轮游戏第j个人
sum = sum+ Dhead[i].node[j].number;
}
Dhead[i].average = sum *0.618;

abmax = 0;
abmin = 100;
for (j = 0; j < m; j++) //计算每一个输入的数字与黄金的绝对值,并且找出最大绝对值和最小绝对值
{
Dhead[i].node[j].absoluten_n = fabs(Dhead[i].node[j].number - Dhead[i].average ); //fabs求整数绝对值函数
if (abmax < Dhead[i].node[j].absoluten_n)
{
abmax = Dhead[i].node[j].absoluten_n;
}
if (abmin>Dhead[i].node[j].absoluten_n)
{
abmin = Dhead[i].node[j].absoluten_n;
}
}
for (j = 0; j < m; j++) //给每一个参加游戏的人打分
{
if (Dhead[i].node[j].absoluten_n == abmax)
{
Dhead[i].node[j].grade = -2;
}
else if (Dhead[i].node[j].absoluten_n == abmin)
{
Dhead[i].node[j].grade = m;
}
else
{
Dhead[i].node[j].grade = 0;
}
}
printf("黄金点:%.2f ",Dhead[i].average);
printf("得分情况如下: ");
for (j = 0; j < m; j++)
{
printf("玩家%d得分;%d ",j+1,Dhead[i].node[j].grade);
}
while(1)
{
printf("是否要输出所有玩家的数字 ");
printf("1,是 2,否 ");
printf("请输入选项:");
scanf("%d", &x);
switch (x)
{
case 1:
{
for (j = 0; j < m; j++)
printf("玩家%d输入的数是:%d ", j + 1,(int)Dhead[i].node[j].number);
break;
}
case 2: break;
default:
{
printf("输入无效 ");
break;
}
}
}
return n;
}
}

void Udecide_n()
{
int i; //是否还有下一个人参与游戏在一轮中中的标志
int j; //是否进行下一轮游戏的标志
int n; //每轮游戏参与游戏的人
float sum; //一轮游戏中全部输入的数字和,同时也是黄金点的值
float abmax; //输入的数与黄金点相差的绝对值最大值
float abmin; //输入的数与黄金点相差的绝对值最小值
int x; //是否输出每一轮的输入的信息
udhead = (U_decide_Node *)malloc(sizeof(U_decide_Node));
if (!udhead)
{
printf("udhead空间申请失败 ");
exit(1);
}
udtail = udhead;
while (1)
{
udnext = (U_decide_Node *)malloc(sizeof(U_decide_Node));
if (!udnext)
{
printf("udnext空间申请失败 ");
exit(1);
}
udnext->next = NULL;
udtail->next = udnext;
udtail = udnext;
phead = (PNode *)malloc(sizeof(PNode));
if (!phead)
{
printf("phead空间申请失败 ");
exit(1);
}
phead->next = NULL;
udnext->node = phead;
ptail = phead;
sum = 0;
n = 0;
printf("请至少输入3个数 ");
while (1) //构建每一轮游戏的链表
{
pnext = (PNode *)malloc(sizeof(PNode));
if(!pnext)
{
printf("pnext空间申请失败 ");
exit(1);
}
pnext->next = NULL;
ptail->next = pnext;
ptail = pnext;
printf("请第%d个人输入:",n+1);
scanf("%f",&pnext->number);
n++;
sum = sum + pnext->number;
if (n >=3)
{
next3: printf("是否要再输入: ");
printf("1.是 2.不是 ");
printf("请选择选项:");
scanf("%d", &i);
if (i == 2)
{
break;
}
else if (i != 1)
{
printf("输入无效请重新输入 ");
goto next3;
}
}
}
sum = sum / n*0.618;
udnext->average=sum;
abmin = 100;
abmax = 0;
pnext = phead->next;
while (pnext) //计算每一个输入的数字与黄金的绝对值,并且找出最大绝对值和最小绝对值
{
pnext->absoluten_n = abs(pnext->number - sum);
if (abmax < pnext->absoluten_n)
{
abmax =pnext->absoluten_n;
}
if (abmin>pnext->absoluten_n)
{
abmin = pnext->absoluten_n;
}
pnext = pnext->next;
}
pnext = phead->next;
while (pnext) // 给每一个参加游戏的人打分
{
if (pnext->absoluten_n == abmax)
{
pnext->grade = -2;
}
else if (pnext->absoluten_n == abmin)
{
pnext->grade = n;
}
else
{
pnext->grade = 0;
}
pnext=pnext->next;
}
printf("黄金点值:%.2f ", udnext->average);
printf("玩家得分情况: ");
pnext = phead->next;
n = 0;
while(pnext)
{
printf("玩家%d得分:%d ", n+1, pnext->grade);
n++;
pnext = pnext->next;
}
next4: printf("是否要输出所有玩家数字: ");
printf("1,是 2,否 ");
printf("请输入选项:");
scanf("%d", &x);
switch (x)
{
case 1:
{
for (n = 0,pnext=phead->next; pnext; n++, pnext = pnext->next)
{
printf("玩家%d输入的数是:%d ", n + 1, (int)pnext->number);
}
break;
}
case 2:break;
default:
{
printf("输入无效,请重新输入 ");
goto next4;
}
}
next5: printf("是否要再进行一轮游戏: ");
printf("1.是 2.不是 ");
printf("请选择选项:");
scanf("%d", &j);
if (j == 2)
{
break;
}
else if (j != 1)
{
printf("输入无效请重新输入 ");
goto next5;
}

}
}

void Delete_u() //未决定空间释放
{
udnext = udhead->next;
while (udnext)
{
phead = udnext->node;
pnext = phead->next;
while (pnext)
{
phead->next == pnext->next;
free(pnext);
pnext = phead->next;
}
free(phead);
udhead->next = udnext->next;
free(udnext);
udnext = udhead->next;
}
free(udhead);
}

 

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
void Udecide_n();
int Decide_n(); //游戏板块
void Delete_n(int n); //申请空间的释放
void Delete_u(); //申请空间的释放
void displayMenu();
typedef struct Pnode //一个人的信息 决定
{
float number; //输入的数
float absoluten_n; //与黄金点差的绝对值
int grade; //分数
}Pnode;
typedef struct PNode // 未决定
{
float number;
float absoluten_n;
int grade;
struct PNode * next;
}PNode;
typedef struct Decide_Node //决定进行游戏轮数的结构体
{
float average; //黄金点的值
Pnode *node;
}Decide_Node;
typedef struct U_decide_Node //未决定进行游戏轮数的结构体
{
float average;
PNode *node; //每轮数据的成员
struct U_decide_Node *next;
}U_decide_Node;

 

5.心得体会:

  1. 通过这次对黄金点游戏的结对编程的经历,我感觉到了团队合作的重要性,以及对于自己现有编程知识的掌握还远远不够,因此后面我需要更加多的努力,不只是应该有更多的创意在项目上,还应该多学习几门语言来实现这些功能。
  2. 当然,一个好的项目的界面也十分重要,一个有趣的界面与游戏模式能让玩家被吸引到,这些都是我们应该在后面的学习中提高的地方。

 

结对编程——黄金点游戏

结对编程项目—黄金点游戏一.项目描述:黄金点游戏是一个数字小游戏,其游戏规则是:   N个同学(N通常大于10),每人写一个0-100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘... 查看详情

结对编程-黄金点游戏

...    分工:本周的课程任务是结对编程实现黄金点游戏,我的结对对象是郑淑丹,分工情况是:驾驶员:袁文雪,领航员:郑淑丹。由于我们两人都比价缺乏项目经验,因此在结 查看详情

结对编程——黄金点游戏

本次的结对编程的项目是黄金点游戏,我的结对对象是杨月永,我们的编程能力都不太好,而且都对C语言更熟悉些,因此我们决定用C语言来实现。(1)分工:角色分配:杨月永是领航员,我是驾驶员,但由于我们的编程能力都... 查看详情

结对编程————黄金点游戏

一、项目描述:黄金点游戏黄金点游戏是一个数字小游戏,其游戏规则是:   N个同学(N通常大于10),每人写一个0-100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄... 查看详情

结对编程-黄金点游戏

一、项目描述:黄金点游戏黄金点游戏是一个数字小游戏,其游戏规则是:   N个同学(N通常大于10),每人写一个0-100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄... 查看详情

结对编程-黄金点游戏

...sp;     驾驶员:徐建磊二、内容及要求黄金点游戏是一个数字小游戏,其游戏规则是:   N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平... 查看详情

结对编程(黄金点游戏)

                                 &n 查看详情

结对编程-黄金点游戏之旅[一]

黄金点游戏游戏描述:黄金点游戏是一个数字小游戏,其游戏规则是N个同学(N通常大于10),每人写一个0-100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G... 查看详情

黄金点游戏结对编程

游戏项目:1.游戏名:经典游戏黄金点2.游戏规则:N个同学(N通常大于10),每人写一个0~100之间的有理数(不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数)得到G值。提交的数字最靠近G... 查看详情

结对编程——黄金点游戏

...玩家输入的数做如下处理:先求和再平均,将平均数乘以黄金分割数0.618得出黄金值,用黄金值分别减去每位玩家输入的数得出差,并对差进行取绝对值操作得出最后差,差最小的玩家加一分,差最大的玩家减一分,其余玩家分... 查看详情

结对编程——黄金点游戏之旅

一、黄金点游戏是一个数字小游戏,其游戏规则是:  N个同学(N通常大于10),每人写一个0-100之间的有理数(不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(黄金分割常数),得到G值。提交的数字最靠近G... 查看详情

黄金点游戏(结对编程项目)

黄金点游戏基本要求:N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。提交的数字最靠近G(取绝对值)的同学... 查看详情

结对编程:黄金点小游戏

一.游戏要求黄金点游戏是一个数字小游戏,其游戏规则是:   N个同学(N通常大于10),每人写一个0-100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),... 查看详情

结对编程-黄金点游戏之旅[二]

项目结构:前端页面结构及样式和动画设计登陆(10.14完成)注册(10.14完成)主游戏页(10.15完成)ajax回调函数处理以及页面渲染请求当前房间游戏用户列表返回json数据处理(未完成)请求当前用户游戏历史纪录结果json数据处... 查看详情

一次奇妙的体验:结对编程之黄金点小游戏

                      项目描述:黄金点游戏黄金点游戏是一个数字小游戏,其游戏规则是:   N个同学(N通常大于10),每人写一个 查看详情

结对编程—黄金点游戏(庞思瑶&季远琦)

首先,黄金点游戏是一个数字小游戏,其游戏规则是:N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。提交的数... 查看详情

结对编程-黄金点游戏之旅[四]

(游戏已上线,更多信息请戳底部链接▼)<--戳这个链接也会跳的哦,了解游戏规则戳这里-->游戏规则我的队友:张波(进入博客请戳底部链接)性格开朗,人很随和,不想写代码的时候都是他主动拉着我去写的,工作认真... 查看详情

结对项目--黄金点游戏

黄金点游戏,共10名玩家,每位玩家输入一个0-100之间的有理数,不包括0和100,系统会算出这10个点的平均值然后乘上0.168以此作为黄金点,提交的数字最接近黄金点的玩家得到1分,离黄金点最远的玩家-2分,其他玩家得0分。10轮... 查看详情