黄金点游戏
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了黄金点游戏相关的知识,希望对你有一定的参考价值。
1.题目介绍
黄金点游戏是一个数字小游戏,其游戏规则是:
N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。玩了几天以后,大家发现了一些很有意思的现象,比如黄金点在逐渐地往下移动。
现在请大家根据这个游戏规则,编一个可以多人一起玩的小游戏程序,要求如下:
1、本作业属于结对编程项目,必须由二人共同完成,并分别将本次作业过程发到博客,同时将本次作业源代码提交到codeing系统;
2、如果可能的话尽量以C/S或B/S方式实现,即利用服务器接收和处理所有玩家提交的数字,并将结果反馈给各玩家,玩家可以通过客户端提交的数字;
3、如果采用单机方式实现的话,需要为用户提供便利的输入界面;
4、该游戏每次至少可以运行10轮以上,并能够保留各轮比赛结果。
2.需求分析及代码实现
1.用户输入键限制
因为要求输入的是数字且为整数所以需要添加键盘输入事件,规定只能输入数字,不能输入其他字符(除删除键),实现代码:
$(‘input‘).keydown(function(event){ if(event.keyCode!=8 && (event.keyCode<48 || event.keyCode>57)){ return false; } });
2.存放用户输入信息
用一个二维数组来存放信息,每个单元data[i][j]代表第i轮游戏,第j玩家,值为玩家所输入的数字。为了便于前期开发阶段的测试,节省玩家提交所消耗的时间,我们使用0~100的随机数来模拟用户输入的数据,以此达到更高的开发效率。
3.计算G值
计算每一轮的玩家数据总数,再除以玩家总数得到平均值,然后再乘以0.618即可得到G值,实现代码:
for(var a=1;a<=lun;a++){ var sum = 0; for(var b=1;b<=num;b++){ sum += parseInt(data[a][b]); } var avg = sum/num; var G = 0.618*avg; }
4.获取最大,最小值
最大,最小指的是与G值的差距,所以要用到绝对值的计算,可以使用js中的Math.abs()来取得绝对值,最后保存下标即可,实现代码:
var max = Math.abs(data[a][1] - G); var min = Math.abs(data[a][1] - G); var max_index = 1; //取下标 var min_index = 1; for(var b=2;b<=num;b++){ if(Math.abs(data[a][b] - G) > max){ max = Math.abs(data[a][b] - G); max_index = b; } if(Math.abs(data[a][b] - G) < min){ min = Math.abs(data[a][b] - G); min_index = b; } }
5.给出分数
各轮游戏都要记录分数,所以需要一个二维数组score_arr[][]来存放玩家的得分,代码如下:
for(var b=1;b<=num;b++){ var score = 0;if(b == max_index){ //离得最远 score = -2; } if(b == min_index){ //离得最近 score = num; } score_arr[a][b] = score;
}
6.游戏结束,计算各玩家总分
通过遍历记录分数的二维数组来计算各玩家的总分,并保存在一个一维数组中,下标表示第几个玩家,代码如下:
for(var b=1;b<=num;b++){ var sum = 0; for(var a=1;a<=lun;a++){ sum += parseInt(score_arr[a][b]); } res[b] = sum; }
7.通过排序来得到输赢结果
在结果数组中排序,分数最高的获胜,分数最低的输,代码如下:
var max_res = res[1]; var min_res = res[1]; for(var c=2;c<=num;c++){ if(res[c] > max_res){ max_res = res[c]; } if(res[c] < min_res){ min_res = res[c]; } }
以上是关于黄金点游戏的主要内容,如果未能解决你的问题,请参考以下文章