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

编写一个数组检查以确定其中是否存在任何潜在的连续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的值有关,并没有正确地重置,它影响了其他水平和垂直测试,但我有点迷失了解决它的有效方法。

你有没有尝试过:

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

dl或左对角线的ij相等(so(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 = (ij) : diff = 0; (b[i][j]==="X") ? sum= (i+j) : sum = len; (b[i][j]==="X" && (ij)===diff) ? dl++ : 0; (b[j][i]==="X" && (i+j)===sum) ? dr++ : 0; 

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

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

在这里小提琴: http : //jsfiddle.net/atk3V/1/