非常具体的错误 - Tic Tac Toe Tester

时间:2014-01-26 01:25:57

标签: javascript jquery arrays debugging

上次我提供了 WAY 太多信息,所以我会减少它。

我有一个正在编写的井字游戏程序,但在我介绍 AI 之前,我需要修复这个错误。

使用案例:

  • 4x4网格
  • 在右侧col上选择3,在底行选择“index 2”或“index 3”。

这样做会产生虚假胜利。我用每个其他用例对此进行了测试,这是我迄今为止发现的唯一错误。 (下图提供):

enter image description here enter image description here
这与我的支票系统有关。我提供了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;
    }
}

(我知道,很多三元运算符......希望它仍然有意义。我从头开始构建它,所以我可以详细说明是否有人需要我。)

3 个答案:

答案 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)

WORKING!

谢谢大家!

http://sinsysonline.com/tictactoe_test.html

就像添加:

一样简单
for(var i=0;i<len;i++){
    c=0; // <----- THIS
    for(var j=0;j<len;j++){

构建AI的时间: - )