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= 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=res[c];
}
}
3.作品展示
4.结对简述
项目开发过程记录
结队成员:蒲建国、孙乐