Javascript-连接四个游戏验证

Javascript-连接四个游戏验证,javascript,Javascript,我有以下测试多维阵列,它镜像了一个标准的Connect Four游戏板: var board = [['-','-','-','-','-','-','-'], ['-','-','-','-','-','-','-'], ['-','-','-','R','R','R','R'], ['-','-','-','Y','Y','R','Y'], ['-','-','-','Y','R','Y'

我有以下测试多维阵列,它镜像了一个标准的Connect Four游戏板:

var board = [['-','-','-','-','-','-','-'],
             ['-','-','-','-','-','-','-'],
             ['-','-','-','R','R','R','R'],
             ['-','-','-','Y','Y','R','Y'],
             ['-','-','-','Y','R','Y','Y'],
             ['-','-','Y','Y','R','R','R']];
我正在编写一个js验证,它检查board数组中的每个元素是否存在横向、向下或对角的4种匹配。查看上面的测试板,我的验证器应该返回
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';
}
功能四合一(a、b、c、d){
返回(a!='-')&&(a==b)&&(a==c)&&(a==d);
}
功能连接器4(电路板){
//核对正确
for(row=col=0;rowfor循环,如:

for (row=col=0; row<3 && col<7; row++, col++) {
for循环的值,如:

for (row=col=0; row<3 && col<7; row++, col++) {

使用两个嵌套循环,必要时检查四个方向中的每一个

var板=[['-'、'-'、'-'、'-'、'-'、'-'、'-'、'-'],
['-','-','-','-','-','-','-'],
['-'、'-'、'-'、'R'、'R'、'R'、'R'、'R'],
['-'、'-'、'-'、'Y'、'Y'、'R'、'Y'],
['-','-','-','Y','R','Y','Y'],
['-'、'-'、'Y'、'Y'、'R'、'R'、'R'];
功能四合一(a、b、c、d){
返回(a!='-')&&(a==b)&&(a==c)&&(a==d);
}
功能连接器4(电路板){
var bl=board.length,bw=board[0]。长度;
//在整个电路板上循环一次而不是多次
对于(变量行=0;行2&&
四合一(sq,板[row+1][col-1],板[row+2][col-2],板[row+3][col-3])){
返回sq;
}
}      
} 
//board.indexOf('-')>-1?返回“进行中”:返回“绘制”;/?????
返回“无赢家”;
}

警报(connectFour(board));
使用两个嵌套循环,必要时检查四个方向中的每一个

var板=[['-'、'-'、'-'、'-'、'-'、'-'、'-'、'-'],
['-','-','-','-','-','-','-'],
['-'、'-'、'-'、'R'、'R'、'R'、'R'、'R'],
['-'、'-'、'-'、'Y'、'Y'、'R'、'Y'],
['-','-','-','Y','R','Y','Y'],
['-'、'-'、'Y'、'Y'、'R'、'R'、'R'];
功能四合一(a、b、c、d){
返回(a!='-')&&(a==b)&&(a==c)&&(a==d);
}
功能连接器4(电路板){
var bl=board.length,bw=board[0]。长度;
//在整个电路板上循环一次而不是多次
对于(变量行=0;行2&&
四合一(sq,板[row+1][col-1],板[row+2][col-2],板[row+3][col-3])){
返回sq;
}
}      
} 
//board.indexOf('-')>-1?返回“进行中”:返回“绘制”;/?????
返回“无赢家”;
}

警报(connectFour(线路板));
我会以不同的方式解决这个问题

首先,设置函数以轻松地获取要测试的行

function row(board, i) {
    return board[i].join('');
}
function col(board, j) {
    return board.map(e => e[j]).join('');
}
function diagDown(board, i) {
    return board.map((e, j) => e[i - board.length + j] || '').join('');
}
function diagUp(board, i) {
    return board.slice(0).reverse().map((e, j) => e[i - board.length + j] || '').join('');
}
(如果您想查看对角线的情况,请尝试在控制台中使用一些值,您将看到它是如何进行映射的)

现在迭代有效行

function whoWon(board) {
    var i, s, r = 'RRRR', y = 'YYYY';
    // rows
    for (i = 0; i < board.length; ++i) {
        s = row(board, i);
        if (s.indexOf(r)) return 'R';
        if (s.indexOf(y)) return 'Y';
    }
    // cols
    for (i = 0; i < board[0].length; ++i) {
        s = col(board, i);
        if (s.indexOf(r)) return 'R';
        if (s.indexOf(y)) return 'Y';
    }
    // diagonals
    for (i = 4; i <= board.length + board[0].length - 4; ++i) {
        s = diagDown(board, i);
        if (s.indexOf(r)) return 'R';
        if (s.indexOf(y)) return 'Y';
        s = diagUp(board, i);
        if (s.indexOf(r)) return 'R';
        if (s.indexOf(y)) return 'Y';
    }
    return '-';
}

还请注意

function isDraw(board) {
    return board[0].every(e => e !== '-');
}

我会以不同的方式解决这个问题

首先,设置函数以轻松地获取要测试的行

function row(board, i) {
    return board[i].join('');
}
function col(board, j) {
    return board.map(e => e[j]).join('');
}
function diagDown(board, i) {
    return board.map((e, j) => e[i - board.length + j] || '').join('');
}
function diagUp(board, i) {
    return board.slice(0).reverse().map((e, j) => e[i - board.length + j] || '').join('');
}
(如果您想查看对角线的情况,请尝试在控制台中使用一些值,您将看到它是如何进行映射的)

现在迭代有效行

function whoWon(board) {
    var i, s, r = 'RRRR', y = 'YYYY';
    // rows
    for (i = 0; i < board.length; ++i) {
        s = row(board, i);
        if (s.indexOf(r)) return 'R';
        if (s.indexOf(y)) return 'Y';
    }
    // cols
    for (i = 0; i < board[0].length; ++i) {
        s = col(board, i);
        if (s.indexOf(r)) return 'R';
        if (s.indexOf(y)) return 'Y';
    }
    // diagonals
    for (i = 4; i <= board.length + board[0].length - 4; ++i) {
        s = diagDown(board, i);
        if (s.indexOf(r)) return 'R';
        if (s.indexOf(y)) return 'Y';
        s = diagUp(board, i);
        if (s.indexOf(r)) return 'R';
        if (s.indexOf(y)) return 'Y';
    }
    return '-';
}

还请注意

function isDraw(board) {
    return board[0].every(e => e !== '-');
}

SyntaxError:意外的令牌返回(…)
,将您的
return
移动到函数末尾的三元运算符前面。另外,
fourTogether
没有返回语句。我很确定for循环没有达到您期望的效果。谢谢Paul。我在我的fourTogether中有return语句,我在这里错误地省略了。我已经进行了相应的编辑。
SyntaxError:意外的令牌返回(…)
,将您的
return
移动到函数末尾的三元运算符前面。另外,
fourTogether
没有返回语句。我很确定for循环没有达到您期望的效果。谢谢Paul。我在fourTogether中有return语句,我在这里错误地省略了。我已经进行了相应的编辑。谢谢。我想我通过尝试在一个
for
语句中同时包含行和列特定循环,我做得太过分了。还感谢您展示了在这两个实例中迭代的内容。谢谢。我想我做得太过分了,因为我尝试在一个
for
语句中同时包含行和列特定循环。还感谢您展示了itera的确切内容在这两个例子中,ted都做了。非常好的解决方案,消除了大量不必要的循环。非常好的解决方案,消除了大量不必要的循环