Простое для понимания решение без чрезмерных циклов (только псевдокод предоставлен, дайте мне знать, если вам нужно больше объяснений):
Я предполагаю, что ваш 2-й массив работает так:
board = [
[...],
[...],
[...],
...
];
Т.е. внутренние массивы представляют горизонтальные ряды доски.
Я также предполагаю, что массив заполняется буквами "b", "w" и "x", представляющими черные фигуры, белые фигуры ипустые квадраты, соответственно.
Мое решение несколько разделяй и властвуй, поэтому я разделил его на 3 случая ниже.Имейте в виду, это может показаться более сложным, чем просто запускать несколько вложенных циклов вначале, но концепция проста для понимания, чтения и правильного подхода, достаточно проста для кодирования.
Горизонтальные линии
Давайте сначала рассмотрим случай обнаружения выигрышной ситуации, ТОЛЬКО если линия горизонтальная - это самый простой способ.Сначала объедините строку в одну строку, используя что-то вроде board[0].join("")
.Сделайте это для каждого ряда.Вы получите массив, подобный следующему:
rows = [
"bxwwwbx...",
"xxxwbxx...",
"wwbbbbx...",
...
]
Теперь присоединитесь к ЭТОМУ массиву, но вставьте «x» между элементами, чтобы отделить каждую строку: rows.join("x")
.
Теперь у вас есть одиндлинная строка, представляющая вашу доску, и это просто вопрос применения регулярного выражения, чтобы найти последовательные "w" или "b" ровно 5 длин: superString.test(/(b{5,5})|(w{5,5})/)
.Если тест вернется true
, у вас ситуация выигрыша.Если нет, давайте перейдем к вертикальным линиям.
Вертикальные линии
Вы хотите повторно использовать приведенный выше код, поэтому создайте для него функцию testRows
.Тестирование вертикальных линий - точно такой же процесс, но вы хотите транспонировать плату, чтобы строки становились столбцами, а столбцы - строками.Затем вы применяете ту же функцию testRows
.Транспонирование может быть выполнено путем копирования значений в новый двумерный массив или написания простой функции getCol
и использования ее в testRows
.
Диагональные линии
Опять же, мы хотимповторно использовать функцию `testRows '.Диагональ, такая как эта:
b x x x x
x b x x x
x x b x x
x x x b x
x x x x b
Может быть преобразована в такую вертикаль, как эта:
b x x x x
b x x x
b x x
b x
b
Смещением строки i
на i
позиции.Теперь это вопрос переноса, и мы вернулись к тестированию на горизонтали.Вам нужно будет сделать то же самое для диагоналей, которые идут другим путем, но этот ряд сдвига во времени i
на length - 1 - i
позиций, или, в вашем случае, 18 - i
позиций.
Функциональный javascript
В качестве примечания, мое решение прекрасно сочетается с функциональным программированием, что означает, что его можно довольно легко кодировать, если у вас есть функциональные инструменты программирования, хотя в этом нет необходимости.Я рекомендую использовать underscore.js , поскольку вполне вероятно, что вам понадобятся базовые инструменты, такие как map
, reduce
и filter
во многих различных игровых алгоритмах.Например, мой раздел о тестировании горизонтальных линий может быть написан одной строкой javascript с использованием map
:
_(board).map(function (row) {return row.join("")}).join("x").test(/(b{5,5})|(w{5,5})/);