2014-02-01 3 views
1

Итак, я решил создать небольшую игру Tic-Tac-Toe, я храню X и O в массиве и имею функцию проверки массива, чтобы узнать, выиграл ли кто-либо.Оптимизация Javascript

Прямо сейчас я просто делаю большой гигант 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

+0

[Это может дать вам идею] (http://en.wikipedia.org/wiki/Magic_square) –

+2

Когда вы говорите, что оптимизировано, вы имеете в виду работать быстрее или использовать меньше кода? – Zwade

+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) { 
    // ... 
} 
+0

Как это более эффективно, чем код в OP? Это то же самое сравнение, за исключением того, что этот ответ имеет дополнительные накладные расходы цикла. Это МЕНЬШЕ эффективно, чем ОП. –

0

Я бы сериализовал плату как-то (например, как строку пробелов, X и O), а затем просто сравнил текущую строку с известная конечная игровая строка.

| | 
-+-+- 
X| | 
-+-+- 
| |O 

Становится

var gameState = " X O"; 
+0

Существует много возможных состояний победы, но это интересная идея. – jonhopkins

+0

Я не вижу никакой пользы от этого. Если вы реализуете сравнение с базовым сравнением строк, вам нужен гигантский список всех возможных окончательных конфигураций. Если вы реализуете сравнение с более сложным методом, вы можете сделать это так же легко без сериализации. – user2357112

+0

Я собирался легко реализовать, и поэтапный шаг вверх от того места, где теперь находится плакат. – mellowfish

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);})) { ... } 
0

Представляют каждый квадрат в виде двух битов в 18-битном номер:

00 = пусто, 10 = «O», 11 = «X»

и квадраты находятся в следующем порядке:

1|2|3 
-+-+- 
4|5|6 
-+-+- 
7|8|9 

так, что X в верхней строке (со всеми остальными квадратами пуст) представляется целым числом 258048 (которое в двоичном формате 111111000000000000).

Теперь, если Вы желаете, чтобы увидеть, если X выиграл, использовать побитовое И (&) против 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 победы комбо, которые идут через центр квадрата первой. В игре против умного противника победитель, скорее всего, будет иметь центральную площадь. Проверка этих комбо сначала позволит вам использовать короткое замыкание в оценке условного.

Смежные вопросы