黄金点游戏

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];
  }
}

 

 

  

 

    

 

以上是关于黄金点游戏的主要内容,如果未能解决你的问题,请参考以下文章

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

黄金点游戏

结对项目—黄金点游戏

附加作业:黄金点游戏

结对编程——黄金点游戏

结对编程-黄金点游戏