Mastermind(HTML + jQuery + PHP)-重复数字的问题

时间:2018-09-22 09:30:12

标签: javascript php jquery algorithm

我正在尝试制作Html + Javascript + PHP版本的Mastermind游戏。 PHP只需生成一个随机的3位代码,范围为0到9。

<?php
function randomCode() {
    $Code = array();
    for ($i = 0; $i < 3; $i++) {
        $n = rand(0,9);
        $Code[] = $n;
    }
    return implode($Code); //turn the array into a string
}
$codice= randomCode();
echo(json_encode($codice));
?>

我用jQuery编写了一个程序,告诉我代码是否正确。如果不是,则在正确的位置为每个正确的数字建议一个黑色圆圈,在错误的位置为每个正确的数字建议一个白色圆圈。

$(document).ready(function() {
var code="";
$("#codice").val("");
function Turno(){
    var tentativo = $('#codice').val();
    $("#codice").val("");
    if( tentativo.length == 3){
        if( tentativo == code){
            $("#esito").html("codice giusto");
        }else{
            $("#esito").html("codice errato");
        }
        var rnrp="";
        var rnwp="";
        var NumeriRipetuti=[];
        for (var i=0; i<tentativo.length; i++){
            /*Se nel codice c'è la cifra i del tentativo*/
            /*If in code there is i number of my guess*/
            var posC = code.indexOf(tentativo[i]);
            if(posC != -1){
                var posizionedellaripetizione = code.indexOf(tentativo[i], posC+1);
                /*controllo che la cifra nel codice sia eventualmente ripetuta*/
                /*check if that number is in the code more than once*/
                if(posizionedellaripetizione != -1){
                    /*se non l'ho già messo tra i numeri ripetuti*/
                    /*if i did't put the number in "Repeated Numbers" before*/
                    if(NumeriRipetuti.indexOf(tentativo[i])==-1){
                        if(tentativo[i]==code[i]){
                            /*aumento il numero di cifre giuste posizionate correttamente*/
                            /*number of right number in right place+1*/
                            rnrp+="\u25CF";
                        }else{
                            /*altrimenti aumento il numero di cifre giuste ma posizionate male*/
                            /*number of right number in wrong place+1*/
                            rnwp+="\u25CB";
                        }
                        while(posizionedellaripetizione != -1){
                            /*controllo se la ripetizione è in posizione giusta (+pallino nero) altrimenti (+pallino bianco)*/
                            /*check if the number repeated is in the correct position*/
                            if(tentativo[posizionedellaripetizione]==code[posizionedellaripetizione]){
                                rnrp+="\u25CF";
                            }else{
                                rnwp+="\u25CB";
                            }
                            posizionedellaripetizione= code.indexOf(tentativo[i], posizionedellaripetizione+1);
                        }
                        /*lo metto nei numeri ripetuti*/
                        /*i put the number in the "Repeated Numbers"*/
                        NumeriRipetuti.push(tentativo[i]);
                    }
                }else{
                    /*se la posizione è la stessa*/
                    if(tentativo[i]==code[i]){
                        /*aumento il numero di cifre giuste posizionate correttamente*/
                        rnrp+="\u25CF";
                    }else{
                        /*altrimenti aumento il numero di cifre giuste ma posizionate male*/
                        rnwp+="\u25CB";
                    }
                }
            }
        }
        var para = document.createElement("LI");                  // Create a <p> element
        var t = document.createTextNode(tentativo+" "+rnrp+rnwp);
        para.appendChild(t);
        document.getElementById("sequenze").appendChild(para);
    }else{
        $("#esito").html("il codice deve essere di 3 cifre");
    }
}
function Arrenditi(){
     alert("Peccato! La soluzione era "+code);
}
$.getJSON("MasterMind.php", function (result) {
    code=result;
    console.log(code);
    $('#conferma').click(
        function(){
            Turno();
        }
    );
    $('#arrenditi').click(
        function(){
            Arrenditi();
        }
    );
    $("#codice").keypress(function(e) {
        if (e.keyCode == 13){
            e.preventDefault();
            Turno();
        }
    });
});

如果代码不包含重复项(例如123)并且我不尝试写带重复的数字(例如,如果代码是123并且我写333),则它可以完美地工作。我试图用在“ for”循环中已经遇到过的数字数组来解决问题,但是它似乎不起作用。如何在代码和尝试中处理这些重复? 这是HTML代码:

<!DOCTYPE html> 
<html>
    <head>
        <meta charset="utf-8">
        <!--<link rel="stylesheet" type="text/css" href="MasterMind.css" />-->
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>
        <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
        <script src="MasterMind.js"></script>
    </head>
    <body>
        <div id="container">
            <h1 id="title">MasterMind</h1>
            <h2 id="subtitle">Cerca di indovinare la combinazione di 3 numeri</h2>
            <form name="game">
                <label>Il codice segreto è:</label>
                <input id="codice" type="text">
                <input id="conferma" type="button" value="Conferma">
                <input id="arrenditi" type="button" value="Arrenditi">
            </form>
            <div id="result">
                <h3 id="esito"></h3>
                <h4>Tentativi:</h4>
                <ol id="sequenze">
                </ol>
            </div>
        </div>
    </body>
</html>

1 个答案:

答案 0 :(得分:1)

我当时正想解决这个问题,所以我也以与您相同的方式开始:将“ tentativo”中的每个数字都与“ code”中的数字进行比较。它变得复杂。然后我意识到:为什么不反过来呢? :)上山去穆罕默德:)问题变得简单了100倍。想象一下,有2组3个人,他们的T恤衫彼此之间的位置从0到9。组1是“ tentativo”,组2是“代码”。现在想象一下,“代码”组中的每个人都有一个并且只有一个对象,一张纸,他们试图将其交给“帐篷”组中的一个人。他首先在那张纸上画:一个白色圆圈或一个黑色圆圈。如果在他前面的人在T恤衫上有相同的号码,他会写一个黑色圆圈,然后不加任何疑问地将纸给他(同一号码在同一地方)(接收人是否已经有一张号码)。纸张,他将其丢弃)。现在,如果前面的人有一个不同的数字,他会在纸上写下一个白色圆圈,并期待其他人在T恤衫上找到一个具有相同数字的圆圈。如果他找到一个,他首先问那个人是否有一张纸。如果答案为“是”,则他继续寻找下一个人,依此类推,直到找到一个回答“否”的人,然后再给该人一张纸上带有白色圆圈的纸,否则他将被留下。这就是算法。现在剩下的就是要请“帐篷”小组的人打开纸片,那就是答案:)

<html>
    <head>
        <title>TODO supply a title</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>
        <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
        <script>
             $(document).ready(function() {
               $("#check").click(function(){
               code = $("#code").val();
               tentativo = $("#tentativo").val();
               tentativo_papers = [];
               for (i=0; i<code.length; i++) {
                   paper = "";//nothing written yet
                   if  (code[i] == tentativo[i]) {
                       //draws a back circle and asks the person in front
                       paper ="*";
                       tentativo_papers[i] = paper; 
                       //this is a black circle so if this tentativo person
                       // had a white cricle it is thrown away
                   }
                   else {
                       paper = "o"; //draw a white circle and look for all other pers from tentativo
                       for (j=0; j < tentativo.length;  j++) {
                           if (i==j) continue; //except the person in front of him
                           if (code[i] == tentativo[j]) {
                               //now the question
                               if (tentativo_papers[j] == null) {
                                   tentativo_papers[j] = paper;
                                   break; //he gaved his piece of paper/no need to continue
                               }
                           }
                       }
                   }
               }
               $("#result").val(tentativo_papers);
               });
            });
        </script>
    </head>
    <body>
       code <input type="number" id="code"  size="3">
       tentativo <input type="number" id="tentativo"  size="3">
       <input type="button" id ="check" value="check">
       result<input type="text" id="result">
    </body>
</html>