Mastermind (HTML + jQuery + PHP) - Проблема с повторяющимися числами

Я пытаюсь создать версию игры Mastermind Html + Javascript + PHP. PHP просто генерирует случайный трехзначный код в диапазоне от 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.info(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>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
260
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думал решить эту проблему и начал так же, как и вы: взял каждое число из «tentativo» и сравнил его с числами из «кода». Все стало сложно. И тут я понял: а почему не наоборот? :) Взять гору к Мохамеду :) И задача стала в 100 раз проще. Представьте, что есть 2 группы по 3 человека с цифрами от 0 до 9 на футболках, которые сидят друг напротив друга. Группа 1 - "предварительная", а группа 2 - "кодовая". Теперь представьте, что у каждого человека в группе «код» есть один и только один объект, лист бумаги, который они пытаются дать человеку из группы «tentativo». Сначала он рисует на этой бумаге: белый или черный кружок. Если у человека перед ним такой же номер на футболке, он пишет черный кружок и дает ему лист бумаги (тот же номер в том же месте), не задавая вопросов (если у принимающего уже был кусок бумагу он выбрасывает). Теперь, если у человека перед ним другой номер, он пишет белый кружок на своем листе бумаги и смотрит, как другие люди находят номер с таким же номером на футболке. Если он находит такой, он сначала спрашивает, есть ли у этого человека лист бумаги. Если ответ утвердительный, он смотрит на следующего человека и так далее, пока не найдет человека, который отвечает «НЕТ» и не даст этому человеку лист бумаги с этим белым кружком, или он просто останется с ним. А это алгоритм. Осталось только попросить людей из группы «tentativo» раскрыть листки бумаги, и это ответ :)

<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>

Другие вопросы по теме