我有以下测试多维数组,它反射(reflect)了标准四子棋游戏板:
var board = [['-','-','-','-','-','-','-'],
['-','-','-','-','-','-','-'],
['-','-','-','R','R','R','R'],
['-','-','-','Y','Y','R','Y'],
['-','-','-','Y','R','Y','Y'],
['-','-','Y','Y','R','R','R']];
我正在编写一个 js 验证,它检查 board 数组中的每个元素是否有 4 个同类匹配,无论是横向、向下还是对 Angular 线。查看上面的测试板,我的验证器应该返回 R
作为正确答案,因为第三行中有 4 个 R
元素的连接匹配。这是我的代码:
function fourTogether(a,b,c,d) {
return (a != '-') && (a == b) && (a == c) && (a == d);
}
function connectFour(board) {
// check RIGHT
for (row=col=0; row<3 && col<7; row++, col++) {
if (fourTogether(board[row][col], board[row+1][col], board[row+2][col], board[row+3][col])) {
return board[row][col];
}
}
// check DOWN
for (row=col= 0; row<6 && col<4; row++, col++) {
if (fourTogether(board[row][col], board[row][col+1], board[row][col+2], board[row][col+3])) {
return board[row][col];
}
}
// check DIAGONAL to RIGHT
for (row=col=0; row<3 && col<4; row++, col++) {
if (fourTogether(board[row][col], board[row+1][col+1], board[row+2][col+2], board[row+3][col+3])) {
return board[row][col];
}
}
// check DIAGONAL to LEFT
for (row=3, col=0; row<6 && col<4; row++, col++) {
if (fourTogether(board[row][col], board[row-1][col+1], board[row-2][col+2], board[row-3][col+3])) {
return board[row][col];
}
}
return board.indexOf('-') > -1 ? 'in progress' : 'draw';
}
所以我基本上使用 fourTogether
函数来建立 4 个同类匹配,并省略 '-'
元素(代表未填充的板槽) 。然后在 connectFour 函数中,我使用四个不同的 FOR 循环根据检查的方向迭代整个数组,然后添加一个 IF语句根据递增的棋盘元素检查 fourTogether
函数。最后,最后有一个三元语句,如果棋盘中没有 4 种匹配,则应返回“平局”或“游戏进行中”,具体取决于是否存在空 '-'
板槽。不幸的是,我返回了 undefined
并且我对代码具体失败的地方有点茫然。任何帮助或指示将不胜感激。
最佳答案
for 循环,例如:
for (row=col=0; row<3 && col<7; row++, col++) {
将迭代(0,0),(1,1),(2,2)
。你想要的是 (0,0),(0,1),(0,2),...,(1,0),(1,1),(1,2),...
。要实现此目的,您必须使用嵌套循环:
for (row = 0; row<3; row++) {
for (col = 0; col<7; col++) {
// do that check
}
}
关于Javascript - 四子棋游戏验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34247472/