所以我决定构建一个小小的Tic-Tac-Toe游戏,我将X和O存储在一个数组中,并且有一个检查阵列的功能,看看是否有人赢了。
现在我正在做一个巨大的巨人IF
if ((board[0] == valueToCheck && board[1] == valueToCheck && board[2] == valueToCheck) ||
(board[3] == valueToCheck && board[4] == valueToCheck && board[5] == valueToCheck) ||
(board[6] == valueToCheck && board[7] == valueToCheck && board[8] == valueToCheck) ||
(board[0] == valueToCheck && board[3] == valueToCheck && board[6] == valueToCheck) ||
(board[1] == valueToCheck && board[4] == valueToCheck && board[7] == valueToCheck) ||
(board[2] == valueToCheck && board[5] == valueToCheck && board[8] == valueToCheck) ||
(board[0] == valueToCheck && board[4] == valueToCheck && board[8] == valueToCheck) ||
(board[2] == valueToCheck && board[4] == valueToCheck && board[6] == valueToCheck)) {
我只是想知道是否有一种更优化的方式来做到这一点,因为我即将建立一个计算机化的对手,它应该检查它的对手是否即将赢,哦,我不使用jQuery < / p>
答案 0 :(得分:1)
您可以使用数组来存储可能的组合来简化它:
var combinations = [
[0, 1, 2],
[3, 4, 5],
[6, 7, 8],
[0, 3, 6],
[1, 4, 7],
[2, 5, 8],
[0, 4, 8],
[2, 4, 6]
];
var win = false;
for(var i = 0 ; i < combinations.length ; i++) {
var c = combinations[i];
if(board[c[0]] == valueToCheck && board[c[1]] == valueToCheck && board[c[2]] == valueToCheck) {
win = true;
break;
}
}
if(win) {
// ...
}
答案 1 :(得分:0)
我会以某种方式序列化电路板(例如作为一串空格,X和O),然后简单地将当前字符串与已知的结束游戏字符串进行比较。
| |
-+-+-
X| |
-+-+-
| |O
成为
var gameState = " X O";
答案 2 :(得分:0)
以下是使用数组some
和every
的简短方法。使用旧浏览器时不是compatible。
var wins = [
[0,1,2], [3,4,5], [6,7,8], // rows
[0,3,6], [1,4,7], [2,5,8], // columns
[0,4,8], [2,4,6] ]; // diagonals
var is_value = function(i) { return board[i] == valueToCheck; };
if( wins.some(function(a){return a.every(is_value);}) ) { ... }
答案 3 :(得分:0)
将每个方块表示为18位数字中的两位:
00 =空白, 10 = “O”, 11 = “X”
,方块按以下顺序排列:
1|2|3
-+-+-
4|5|6
-+-+-
7|8|9
以便顶行中的X(所有其他正方形为空)由整数258048(二进制为111111000000000000)表示。
现在,如果您想要查看X是否赢了,您可以使用按位AND(&amp;)来对抗8种可能的获胜组合:
if (
(gameBoard & 258048 === 258048) || // top row full of X's
(gameBoard & 4032 === 4032) || // middle row full of X's
// etc.
) { // X has won }
理想情况下,你将每个获胜的组合(再次,只有8个)放在一个数组中并像这样运行:
if (
(gameBoard & winningXCombo[0] === winningXCombo[0]) || // top row full of X's
(gameBoard & winningXCombo[1] === winningXCombo[1]) || // middle row full of X's
// etc.
) { // X has won }
而且,如果你真的想要优化,请先检查通过中心广场的4个获胜组合。在与智能对手的比赛中,获胜者很可能拥有中心广场。首先检查这些组合将使您在评估条件时利用短路。