连接四场比赛检查胜利JS

时间:2015-10-17 00:22:05

标签: javascript arrays multidimensional-array

我正在制作我的第一个完整的程序,在我的训练下进行了两周的编程,并且遇到了一个我似乎无法弄清楚的障碍。我正在制作一个连接4游戏,并且在推送到DOM之前已经开始在JavaScript中构建逻辑。我已经开始使用构造函数创建的单元格对象,然后以2D数组的形式将其推入游戏对象。我已经设法创建了一个每次都进行播放的函数,并使用2天的数组更改该列最低点的单元格值。但是,我不知道如何检查wins函数来运行。

到目前为止,我的逻辑是,对于2D数组中的每个点,您可以按行,按列和对角线进行检查。我理解如何检查win的逻辑,但我不明白如何按行和列遍历数组。在下面的示例中,this.cellsArray是Board Constructor中的单元对象数组。该阵列有7个列阵列,每个阵列有6行,因为我翻转了典型的行列逻辑,以考虑Connect Four的基于列的性质。但是我不能像this.cellsArray [col] [row]那样访问数组,因为col和row没有定义,我不知道如何定义索引值?任何帮助将不胜感激!

Connect 4

示例:

//array location is equal to an instance of this.cellsArray[col][row]
Board.prototype.checkRowRight = function (arrayLocation) {

    if ((arrayLocation[i+1][i].value === arrayLocation.value) && (arrayLocation[i+2][i]=== arrayLocation.value)  && (arrayLocation[i+3][i].value === arraylocation.value)){
        this.winner = this.currentPlayer;
        this.winnerFound = true;
        console.log('Winner has been found!')
    }
};

1 个答案:

答案 0 :(得分:2)

回到我的逻辑here并重构获胜的行检测代码,可以很容易地将其转换为Javascript,如下所示:

function chkLine(a,b,c,d) {
    // Check first cell non-zero and all cells match
    return ((a != 0) && (a ==b) && (a == c) && (a == d));
}

function chkWinner(bd) {
    // Check down
    for (r = 0; r < 3; r++)
        for (c = 0; c < 7; c++)
            if (chkLine(bd[r][c], bd[r+1][c], bd[r+2][c], bd[r+3][c]))
                return bd[r][c];

    // Check right
    for (r = 0; r < 6; r++)
        for (c = 0; c < 4; c++)
            if (chkLine(bd[r][c], bd[r][c+1], bd[r][c+2], bd[r][c+3]))
                return bd[r][c];

    // Check down-right
    for (r = 0; r < 3; r++)
        for (c = 0; c < 4; c++)
            if (chkLine(bd[r][c], bd[r+1][c+1], bd[r+2][c+2], bd[r+3][c+3]))
                return bd[r][c];

    // Check down-left
    for (r = 3; r < 6; r++)
        for (c = 0; c < 4; c++)
            if (chkLine(bd[r][c], bd[r-1][c+1], bd[r-2][c+2], bd[r-3][c+3]))
                return bd[r][c];

    return 0;
}

测试电话:

x =[ [0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 1, 1, 0, 0],
     [0, 0, 0, 1, 1, 0, 0],
     [0, 0, 1, 2, 2, 2, 0],
     [0, 1, 2, 2, 1, 2, 0] ];
alert(chkWinner(x));

当使用棋盘调用时,chkWinner函数将返回第一个(并且只有,假设每个移动仅更改一个单元格并且您在每次移动后都会检查)获胜玩家。

这个想法基本上是将检查限制在那些有意义的检查中。例如,当向右检查单元格时(参见第二个循环),您只需要检查从最左边的四列0-6开始的每一行0-3

那是因为在找到可能的胜利之前,从其他任何地方开始都会从董事会的右侧开始。换句话说,列集{0,1,2,3}{1,2,3,4}{2,3,4,5}{3,4,5,6}将有效,但{4,5,6,7}不会(七个有效列为{{1} })。

免费获取贴纸的机会↓↓↓
豫ICP备18024241号-1