对数组进行检查以确定其中是否存在任何潜在的连续values
,无论是horizontal
,vertical
还是diagonal
。下面的示例是一个示例对角线,但我需要它以/
和\
两种方式工作。
所以,让我们假装场景......
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;
新评论
例如,我已经尝试过这个,但是对于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的值有关,并没有正确地重置,它影响了其他水平和垂直测试,但我有点迷失了解决它的有效方法。
答案 0 :(得分:1)
你试过了吗?
(b[i][j]==="X" && i===j) ? dl++ : 0;
(b[j][i]==="X" && (i+j)===(len-1)) ? dr++ : 0;
dl
或左对角线的i
和j
相等(所以(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 = (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)
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;
}
}