2016-04-03 2 views
2

Я могу объявить победителя, если игрок получает пять своих жетонов подряд, и теперь я пытаюсь реализовать функцию захвата частей противника. Например, я игрок X, я могу отловить части O, подобные этому X00X, в любом направлении на доске. Чтобы реализовать это, правильная логика: Найти всех соседей вокруг O, проверить и посмотреть, является ли сосед X или O, если в каждой строке есть два нуля, окруженных X, я могу возьмите эти куски. Есть ли лучший способ подойти к этой проблеме? Я имею в виду что-то вроде этого:Поиск соседей в игре из пяти в ряд

function isOCaptured(token, row, col){ 
    if(gameBoard[row][col]==="O" && gameBoard[row][col+1] === "X" 
     && gameBoard[row][col-1] === "X"){ 
    return true;  
    } 
    return false; 
} 

Но это не кажется, возвращает истину, когда я помещаю один O между двумя крестиками.

Вот что мой server.js и app.js выглядеть прямо сейчас: https://jsfiddle.net/Amidi/s3gnx3rL/4/ HTML, просто 13 х 13 сетка кнопок с событием, прикрепленного к каждому, который посылает кнопки координат функции Add() в моем app.js

+0

Можем ли мы получить jsfiddle или картину игры? Было бы проще визуализировать проблему, которая у вас есть. – Hawkeye

+0

Хорошо, я обновил свой вопрос со ссылкой на мой jsfiddle. –

+0

Можете ли вы добавить html в jsfiddle? – Hjulle

ответ

0

Теперь проблема заключается в том, что код работает, только если «О» был помещен последним. Это можно решить с помощью цикла for.

for(var i = -1; i <= 1; i++) { 
    if (gameBoard[row][col+i]==="O" && gameBoard[row][col+i+1] === "X" 
     && gameBoard[row][col+i-1] === "X") { 
     return true; 
    } 
} 
return false; 

Вы также можете использовать ломтик:

// The closest 5 cells to the left/right of the newly added piece, as a string 
var str = gameBoard[row].slice(col-2,col+3).join(""); 
// Look for the pattern "XOX" in those 5 cells. Double negation to return bool. 
return !!str.match("XOX"); 

Старый ответ

По вашему комментарию, код был назван так:

if(isOCaptured(x,y)===true){console.log("y is between 2 x\s"); 

Этот означает, что функция вызывается с два вместо трех аргументов. Это приведет к следующим значениям аргументов: token = x, row = y и col = undefined.

Выражение оценивается таким образом, будет:

gameBoard[y][undefined]==="O" && gameBoard[y][undefined+1] === "X" 
    && gameBoard[y][undefined-1] === "X" 

Что бы оценить следующим образом:

  1. Оценка gameBoard[y] будет успешным, в результате чего в колонке (не тот, хотя).
  2. Затем мы попытаемся индексировать столбец с undefined, и поскольку массив не содержит элемент с именем undefined, он не будет работать, в результате чего (снова) undefined.
  3. Затем мы сравниваем это значение undefined с "0", что, очевидно, неверно.
  4. Выражение false && ... вернет false, как и вся функция.

Если вторая часть была бы выполнена, было бы вычислить undefined+1, который (довольно точно) оценивается в NaN (не число). Массив также не содержит NaN, поэтому этот расчет также будет оценен как false.


Теперь несколько советов:

  1. Заявление if(expr){return true} else {return false} может быть упрощена только return expr.
  2. Эти ошибки довольно легко найти, если вы используете Chrome Debugger (или Firebug для firefox), где вы можете пройти через код и посмотреть, что происходит и где что-то не так.
+0

Я переопределил параметры, чтобы просто взять два аргумента: строку и col. Я заметил какое-то странное поведение. Я проверяю, находится ли O между двумя X. Моя функция возвращает true, только если два X сначала помещены, а затем я помещаю O между ними (что не то, что я хочу). Он должен возвращать true, если у меня есть X, а затем O, а затем X, правильно? В принципе, если два O находятся подряд, я хочу уловить их, поместив X с каждой стороны. –

+0

Мне очень нравится эта версия среза. Как расширить его, чтобы он искал не только слева направо, но и сверху вниз, и обе диагональные направления для шаблона «XOX»? –

+0

@BeeBop Это не так просто сделать в других направлениях, но попытайтесь выяснить, как это работает, и вы сможете выяснить, как его расширить. Если вы все еще запутались после честной попытки, пожалуйста, не стесняйтесь задавать дальнейшие, более конкретные вопросы об этом. (Я рад помочь, но я не здесь, чтобы написать ваш код для вас.) – Hjulle

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