我上次提供了WAY太多的信息,所以我会减少它。
我正在编写一个井字游戏程序,但在引入人工智能之前,我需要修复这个错误。
用例:
- 4x4 网格
- 在右列选择 3,并在底行选择“索引 2”或“索引 3”。
这样做会产生错误的胜利。我已经用所有其他用例对此进行了测试,这是迄今为止我发现的唯一错误。 (下面提供的图片):
这与我的检查系统有关。我提供了它正在测试 bug
的数组
,以及寻找胜利的代码
。
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;
}
}
(我知道,很多三元运算符......希望它仍然有意义。我从头开始构建它,所以如果有人需要我,我可以详细说明。)
- 实时站点(含补偿):http://sinsysonline.com/tictactoe_test.html
- 完整 fiddle (带伴奏):http://jsfiddle.net/SinisterSystems/9kzeq/
- 用于测试的简化 Fiddle:http://jsfiddle.net/SinisterSystems/LNT6j/1/
最佳答案
每次循环移至下一列时,您都需要重置列计数器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;}
}
}
}
关于javascript - 非常具体的错误 - Tic Tac Toe 测试仪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21358490/