上次我提供了 WAY 太多信息,所以我会减少它。
我有一个正在编写的井字游戏程序,但在我介绍 AI 之前,我需要修复这个错误。
这样做会产生虚假胜利。我用每个其他用例对此进行了测试,这是我迄今为止发现的唯一错误。 (下图提供):
这与我的支票系统有关。我提供了array
正在测试的bug
以及code to find a win
。
var b = [ ["", "", "", "X"],
["", "", "", "X"],
["", "", "", "X"],
["", "", "X", ""] ]
function testWin() {
var len=b.length, r=0, c=0, dr=0, dl=0;
for(var i=0;i<len;i++){
c=0;
for(var j=0;j<len;j++){
(b[j][i]==="X") ? c++ : c=0;
(b[i][j]==="X") ? r++ : r=0;
if(b[i][j]==="X" && i<len-win+1){
dr=0; dl=0;
for(var z=0;z<win;z++){
(b[i+z][j+z]==="X") ? dr++ : dr=0;
(b[i+z][j-z]==="X") ? dl++ : dl=0;
}
}
if(c===win || r===win || dr===win || dl===win){
alert("YOU WIN!"); return true;
}
}
r=0;
}
}
(我知道,很多三元运算符......希望它仍然有意义。我从头开始构建它,所以我可以详细说明是否有人需要我。)
答案 0 :(得分:2)
每次循环移动到下一列时,您需要重置列计数器c
。
function testWin() {
var len=b.length, r=0, c=0, dr=0, dl=0;
for(var i=0;i<len;i++){
c=0;
for(var j=0;j<len;j++){
(b[j][i]==="X") ? c++ : c=0;
(b[i][j]==="X") ? r++ : r=0;
if(b[i][j]==="X" && i<len-win+1){ dr=0; dl=0;
for(var z=0;z<win;z++){
(b[i+z][j+z]==="X") ? dr++ : dr=0;
(b[i+z][j-z]==="X") ? dl++ : dl=0;
}
}
if(c===win || r===win || dr===win || dl===win){ alert("YOU WIN!"); return true;}
} r=0;
}
}
编辑:这是一种只使用两个循环的方法:
function testWin() {
var len=b.length, r=0, c=0, dr=0, dl=0;
for(var i=0;i<len;i++){
r=0, c=0, dr=0, dl=0;
for(var j=0;j<len;j++){
(b[j][i]==="X") ? c++ : c=0;
(b[i][j]==="X") ? r++ : r=0;
if(i+j<len){ z = i+j;} else{z = i+j-len, dr=0, dl=0;}
(b[j][z]==="X") ? dr++ : dr=0;
(b[j][len-1-z]==="X") ? dl++ : dl=0;
if(c===win || r===win || dr===win || dl===win){ alert("YOU WIN!"); return true;}
}
}
}
答案 1 :(得分:1)
我看到的最大问题是,在处理完每一行之后,您应该执行行和列检查。我相信以下工作:
var b = [["X", "", "", "X"],
["", "X", "X", "X"],
["", "X", "X", "X"],
["", "X", "X", ""]]
var win = 4;
function testWin() {
var len = b.length;
var dr = 0,
dl = 0;
for (var i = 0; i < len; i++) {
var c = 0,
r = 0;
dr += (b[i][len - i - 1] === "X") ? 1 : 0;
dl += (b[i][i] === "X") ? 1 : 0;
for (var j = 0; j < len; j++) {
c += (b[j][i] === "X") ? 1 : 0;
r += (b[i][j] === "X") ? 1 : 0;
}
console.log(c, r, dl, dr);
if (c === win || r === win || dr === win || dl === win) {
alert("YOU WIN!");
return true;
}
}
return false;
}
其次,我不介意ternarys,但你应该这样写:
c += (b[j][i] === "X") ? 1 : 0;
你这样做的方式掩盖了表达的意义。
这个版本也大大改善了对角线检查。你真的只需要每次通过外循环为每个对角线增加一个值,并在外循环完成后检查总数。 (我把这个检查包含在与行和列相同的表达式中,因为它有点干净,但这是不必要的。)换句话说,你不需要另一个内部循环。
答案 2 :(得分:0)
就像添加:
一样简单for(var i=0;i<len;i++){
c=0; // <----- THIS
for(var j=0;j<len;j++){