TicTacToe在NxN棋盘上的获胜逻辑

3

当前逻辑对于3x3的棋盘可以很好地工作,因为它是静态的。 我如何将其转换为NxN逻辑?

获胜逻辑是通过添加行和列方块来实现的。

/*
 * To determine a win condition, each square is "tagged" from left
 * to right, top to bottom, with successive powers of 2.  Each cell
 * thus represents an individual bit in a 9-bit string, and a
 * player's squares at any given time can be represented as a
 * unique 9-bit value. A winner can thus be easily determined by
 * checking whether the player's current 9 bits have covered any
 * of the eight "three-in-a-row" combinations.
 *
 *     273                 84
 *        \               /
 *          1 |   2 |   4  = 7
 *       -----+-----+-----
 *          8 |  16 |  32  = 56
 *       -----+-----+-----
 *         64 | 128 | 256  = 448
 *       =================
 *         73   146   292
 *
 */
wins = [7, 56, 448, 73, 146, 292, 273, 84],

/*
 * Returns whether the given score is a winning score.
 */
win = function (score) {
    for (var i = 0; i < wins.length; i += 1) {
        if ((wins[i] & score) === wins[i]) {
            return true;
        }
    }
    return false;
},

这是我的代码示例,可以在这里查看。


2
只需生成查找表即可。算术相当简单。 - Scott Sauyet
顺便说一下,不错的小部件。 - Scott Sauyet
@ScottSauyet 我该怎么做? - Himanshu Yadav
4
这不是一个编程问题,因为您知道如何做到这一点。这是一个数学问题。顺便说一下,我建议您始终使用关键字“var”进行练习。 - StackSlave
你如何确定在一个偶数 n 矩阵中哪些行和列是“中间”的? - גלעד ברקן
显示剩余3条评论
2个回答

2

因此,要以程序的方式完成这项任务,您可以使用类来跟踪每个单元格所在的“集合”,即“row1”或“col1”:

i/j 创建循环中:

cell.addClass('col' + j); // The cell is in column j
cell.addClass('row' + i); // The cell is in row i
if (i == j) {
    cell.addClass('dia0'); // The cell is in the down/right diagonal
}
if (j == SIZE - i - 1) {
    cell.addClass('dia1'); // The cell is in the up/right diagonal
}

接下来,在win()函数中,传入最后点击的单元格。对于单元格所属的每个类别,检查包含X(或O)的该类别单元格的数量是否等于表格大小:

win = function (clicked) {
    // Get all of the classes this cell belongs to
    var memberOf = clicked[0].className.split(/\s+/);

    // Check elements with the same class, and see if they contain "turn", i.e. X or O
    for (var i=0; i<memberOf.length; i++) {
        var testClass = '.'+memberOf[i];
        // If the number of elements containing "turn" == SIZE,
        // we have a winning condition
        if( $('#tictactoe').find(testClass+':contains('+turn+')').length == SIZE) {
             return true;   
        }
    }

    return false;
},

JSFiddle Demo


0

这与您的三个列表相匹配,我已经手动检查了其中两个。 代码确实非常简单,但您可能想仔细检查一下:

var getWins = function(size) {
    var val = 1, cells = [], wins = [];
    for (var i = 0; i < size; i++) {
        cells[i] = [];
        for (var j = 0; j < size; j++) {
            cells[i][j] = val;
            val *= 2;
        }
    }
    var rowWins = [], colWins = [], mainDiagWin = 0, antiDiagWin = 0;
    for (i = 0; i < size; i++) {
        rowWins[i] = 0;
        colWins[i] = 0;
        mainDiagWin += cells[i][i];
        antiDiagWin += cells[i][size - i - 1];
        for (j = 0; j < size; j++) {
            rowWins[i] += cells[i][j];
            colWins[i] += cells[j][i];
        }
    }
    return rowWins.concat(colWins, mainDiagWin, antiDiagWin);
};

getWins(2);
//=> [3, 12, 5, 10, 9, 6]

getWins(3);
//=> [7, 56, 448, 73, 146, 292, 273, 84]

getWins(4)
//=> [15, 240, 3840, 61440, 4369, 8738, 17476, 34952, 33825, 4680]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接