多维数组 - 检查对角连续值

时间:2014-01-09 03:12:53

标签: javascript jquery arrays for-loop multidimensional-array

对数组进行检查以确定其中是否存在任何潜在的连续values,无论是horizontalvertical还是diagonal。下面的示例是一个示例对角线,但我需要它以/\两种方式工作。

小提琴: http://jsfiddle.net/PXPn9/10/

所以,让我们假装场景......

var b = [ 
    [ 0, 0, X, 0, 0 ]
    [ 0, 0, 0, X, 0 ]
    [ 0, 0, 0, 0, X ]
    [ 0, 0, 0, 0, 0 ]
    [ 0, 0, 0, 0, 0 ]
]

使用基本的2级深度循环,迭代整个事物并使用一些三元运算符来识别“胜利”

function testWin() {
    var win=3, len=b.length, r=0, c=0, dr=0, dl=0;
    for(var i=0;i<len;i++){
        for(var j=0;j<len;j++){

        // COL WIN CHECK //
            (b[j][i]==="X") ? c++ : c=0;

        // ROW WIN CHECK //
            (b[i][j]==="X") ? r++ : r=0;

        // DIAG WIN CHECK //
            // (b[i][j]==="X" && b[i+1][j+1]==="X") ? dr++ : dr=0;
            // (b[j][i]==="X" && b[i+1][j+1]==="X") ? dl++ : dl=0;
        // WIN CHECK FOR ALL 4
            if(c===win || r===win){ alert("YOU WIN!"); return true;}
        }
        r=0;
    }
}

horizontal checkvertical check似乎完美无缺,直到我启用评论尝试创建对角线测试...我可以让某人看看对角线测试并帮助确定原因让他们打破一切,我做错了什么?

我特别想要帮助我创建一个diagonal支票。 (查看整个来源的JSFiddle)

    // DIAG WIN CHECK //
        // (b[i][j]==="X" && b[i+1][j+1]==="X") ? dr++ : dr=0;
        // (b[j][i]==="X" && b[i+1][j+1]==="X") ? dl++ : dl=0;

小提琴: http://jsfiddle.net/PXPn9/10/


新评论 例如,我已经尝试过这个,但是对于3的对角线它是硬编码的(我需要稍后扩展以使用win变量)。但是,当我添加此选项时,horizontalvertical检查的右下角将失败。

    // if((b[i][j] && b[i+1][j+1] && b[i+2][j+2])==="X"){ alert("YOU WON! Diag1"); return true; }
    // if((b[i][j] && b[i+1][j-1] && b[i+2][j-2])==="X"){ alert("YOU WON! Diag2"); return true; }

我知道它与dl和dr的值有关,并没有正确地重置,它影响了其他水平和垂直测试,但我有点迷失了解决它的有效方法。

2 个答案:

答案 0 :(得分:1)

你试过了吗?

(b[i][j]==="X" && i===j) ? dl++ : 0;
(b[j][i]==="X" && (i+j)===(len-1)) ? dr++ : 0;

dl或左对角线的ij相等(所以(0,0)(1,1)和(2,2))

dr或右对角线的总和ij等于边长减1(所以(0,2)(1,1)(2, 0))

例如,当对角线的长度与矩阵的长度,在井字游戏中的全身对角线相同时,这将起作用。对于部分对角线,您可以将代码略微修改为:

var diff = 0;
var sum = len - 1;  
(b[i][j]==="X") ? diff = (i-j) : diff = 0;  
(b[i][j]==="X") ? sum= (i+j) : sum = len;  
(b[i][j]==="X" && (i-j)===diff) ? dl++ : 0;
(b[j][i]==="X" && (i+j)===sum) ? dr++ : 0;

答案 1 :(得分:0)

最终答案(由于@ tewathia的回答和一些进一步的研究)

function testWin() {
    var win=3, len=b.length, r=0, c=0, dr=0, dl=0;
    for(var i=0;i<len;i++){
        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://jsfiddle.net/atk3V/1/