当前逻辑在3x3电路板上可以正常工作,因为它是静态的。如何将其转换为NxN逻辑?
Win逻辑通过添加行和列正方形来工作。
/* * 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; },
我的小提琴在这里
因此,要以编程方式执行此操作,可以使用类来跟踪每个单元格所在的“设置”,即“ row1”或“ col1”:
在i/ j创建循环中:
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()
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演示