Я пытаюсь создать версию игры 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>



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я думал решить эту проблему и начал так же, как и вы: взял каждое число из «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>