• 黄金点游戏


    黄金点游戏

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

          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轮以上,并能够保留各轮比赛结果。

    看到题目,我决定用自己比较擅长的html+js完成这个任务。

    首先,如题目所说。有N个同学,于是,第一步便是确定同学的人数。

    <div class="col-lg-6 play">
                <div class="input-group">
                   <input type="text" class="form-control" id="P_numa">
                   <span class="input-group-btn">
                      <button class="btn btn-default" type="button" onclick="CreatBoxa()">
                         游戏人数
                      </button>
                   </span>
                </div>
        </div>

    这段代码便是想客户展示一个输入框,输入进行游戏的人数N。然后点击游戏人数按钮,便可以动态的生成N个输入框。用户便可以在输入框中输入自己的数字。进行游戏。动态生成输入框的代码如下所示:

    function CreatBoxa() {
        document.getElementById("resulta").innerHTML="";
        document.getElementById("Box_numa").innerHTML="";
        var Pnum1=document.getElementById("P_numa").value;
        var oa = document.getElementById("Box_numa");
        for (i = 0; i < Pnum1; i++) {
            var Box_numa = document.createElement("input"); 
            Box_num.setAttribute('type', 'text');
            Box_num.setAttribute('name', 'B_numa');
            Box_num.setAttribute('class', 'form-control');
            Box_num.setAttribute('class', 'input-sm');
            oa.appendChild(Box_numa); 
        }
    }

    前台代码:

    <div class="headera">
        <h1>Gold Point</h1>
      </div>
      <div class="contenta">
        <div class="col-lg-6 play">
                <div class="input-group">
                   <input type="text" class="form-control" id="P_numa">
                   <span class="input-group-btn">
                      <button class="btn btn-default" type="button" onclick="CreatBoxa()">
                         游戏人数
                      </button>
                   </span>
                </div>
        </div>
        <button type="button" class="btn btn-default" onclick="nexta()">开始游戏</button>
        <div class="cona">
            <div id="Box_numa">
            </div>
            <div id="resulta">
            </div>
            <div id="result2a">
            </div>
        </div>
      </div>

      如上面代码所示,CreatBox的函数便是先清空前台页面div分别是result和B_num的内容。然后获取用户输入的人数,存入变量Pnum1里面。最后用for循环通过document.createElement("")创建输入窗口。

    紧接着,用户输入完成数值后,点击开始游戏便在下方动态生成两个文本框textarea区域。然后将每轮的分数显示在result里面,并将每轮的总分数显示在result2里面。动态生成文本框区域如下所示:

    function Creatareaa(aa) {
        document.getElementById("resulta").innerHTML="";
        var oa = document.getElementById("resulta");
        var resa = document.createElement("textarea"); 
        res.setAttribute('name', 'resa');
        res.setAttribute('class', 'resa');
        res.setAttribute('rows', '10');
        res.setAttribute('cols', '40');
        res.setAttribute('readonly', 'readonly');
        oa.appendChild(resa); 
        for (i = 0; i <a.length; i++) {
            ja=i+1;
            resa.innerHTML+="第"+ja+"个人的分数是:"+aa[i]+"
    ";
        }
    }

    总体与创建游戏人数输入框相似。然后下面便是计算黄金点数的函数,通过获取用户输入的游戏数值,然后用数组的方式放到数组P里面。最后返回计算出的黄金点数A。

    function Get_num() {
        var A_numa= new Array();
        var Pa=document.getElementsByName("B_numa");
        for (i = 0; i <P.length; i++) {
            A_numa[i]=Pa[i].value;
        }
        var suma=0;
        for (i = 0; i <A_numa.length; i++) {
            suma=suma+parseFloat(A_numa[i]);
        }
        Sa=suma/A_numa.length;
        Aa=Sa*0.618;
        return Aa;
    }

    下面是计算分数函数,通过计算得出所以游戏数和黄金点数之间的差的绝对值放到数组Pe_num中,遍历得出的最大值max和最小值min。最后用过if语句判断赋予分数数组P_sum分数。然后返回P_sum

    function Counta(S_numa) {
        var P_suma=new Array();   
        var Pe_numa=new Array();
        var Sa=Get_numa();
        for (i = 0; i < S_numa.length; i++) {
            Pe_numa[i]=Math.abs(Sa-S_numa[i]);
        }
        var maxa=Pe_numa[0];
        for (i = 0; i <Pe_numa.length; i++) {
            if (maxa<Pe_numa[i]) {
                maxa=Pe_numa[i];
            }
        }
        var mina=Pe_numa[0];
        for (i = 0; i < Pe_numa.length; i++) {
            if (mina>Pe_numa[i]) {
                mina=Pe_numa[i];
            }
        }
        for (i = 0; i <Pe_numa.length; i++) {
            if (maxa==Pe_numa[i]) {
                P_suma[i]=10;
            }
            else if (mina==Pe_numa[i]) {
                P_suma[i]=-2;
            }
            else {
                P_suma[i]=0;
            }
        }
        var S1a = new Array();  
                S1a[0]=P_suma[0]
        return P_suma;
    }

    最后就是计算总分函数:

    var qa=0;
    var dataa=new Array();
    function nexta() {
        var Snuma=new Array();
        var numa=document.getElementsByName("B_numa");
        for (i = 0; i <numa.length; i++) {
            Snuma[i]=numa[i].value;
        }
        qa++;
        var Aa=Counta(Snum);
        Creatareaa(A);
        var Ba=new Array();
        if (qa==1) {
            for (i = 0; i < Aa.length; i++) {
                dataa[i]=parseInt(Aa[i]);
            }
        }else {
            for (i = 0; i <Aa.length; i++) {
            var aa=parseInt(Aa[i]);
            dataa[i]=dataa[i]+aa;
        }
        }
        Creatarea2a(dataa);
    }

      首先,在函数外创建两个全局变量q和数组data。将Count函数得出的分数数组传入数组A中。然后用Creatarea()函数显示在页面中。当全局变量q为1的时候,表示此时的next函数运行了一次。此时总分便是数组A的值,将A的值通过整形数强制转换传入data数组(为了方便后面数组内数的运算)。当q不等于1的时候,说明函数运行了一次以上,便用for循环计算data。没执行一次函数,A内的数值便能累加当全局变量数组B中。便实现了总分的计算,然后通过Creatarea2()函数显示在div的id为result2盒子内。这边是整个程序设计的思路。

    结伴照片:

    队员评价:

    我的队友是李思雨,她习惯用C语言编程,这次我们经过讨论后决定用JS完成,所以我主编,我队友帮我检查错误和提供界面设计的想法,队友大二参加一年ACM,编程还是很给力的,我们一个下午就完成了任务,两个人比一个人工作轻松,气氛愉快,工作效率高。
    相对于一个人的编程,两个人的编程更加的有了效率,而且气氛活跃。交流也更加有助于难点的攻克!

    运行效果如下所示:

    主页:

    第一步输入人数,点击游戏人数:

    第二步输入数值,点击开始游戏:

    第三步输入第二轮数值,输入完点击开始游戏:

    如上图所示,基本完成任务。上一局是想查询上次一的数值和分数,但还没有完成。现在整个程序还有几点没有完成:1、限制人数  2、限制数值大小   3、页面显示效果不佳   4、查询前面的游戏内容   5、限制游戏次数。   

  • 相关阅读:
    从内存中加载并启动一个exe
    使用Hamcrest增强JUnit的测试能力
    Delphi编译指令说明
    Delphi 64与32位的差异
    获取exe文件窗口抓图,将memo转化为JPG输出
    Delphi 的 Utf-8 转换
    我的第一个破解软件,试验成功!
    Qt之QComboBox(基本应用、代理设置)
    常见寄存器以及常见汇编指令,常见爆破指令 good
    大神级回答exists与in的区别
  • 原文地址:https://www.cnblogs.com/walldong/p/gold.html
Copyright © 2020-2023  润新知