我正在尝试制作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>
答案 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>