多维数组 – 检查对角连续值
编写一个数组检查以确定其中是否存在任何潜在的连续values
,无论是horizontal
, vertical
还是任何一种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 check
和vertical 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
变量)。 当我添加它时,我的horizontal
和vertical
检查的右下角失败。
// 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
或左对角线的i
和j
相等(so(0,0)(1,1)和(2,2))
dr
或右对角线的总和i
和j
等于边长减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