Поиск шаблонов в логических играх - PullRequest
5 голосов
/ 28 августа 2009

Мне было интересно, какие алгоритмы чаще всего применяются для поиска шаблонов в играх-головоломках, состоящих из сеток ячеек.

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

Например, такие игры, как колонки, украшенные драгоценными камнями, даже тетрис.

Я также хочу знать, является ли обнаружение паттернов "грубой силой" (например, сканирование всей сетки, пытаясь найти три соседние ячейки одного цвета) значительно хуже, чем использование определенных алгоритмов в очень маленьких сетках, таких как 4 X 4 например (и опять же, я знаю, что это зависит от типа игры и правил ...)

Какие структуры обычно используются в играх такого типа?

Ответы [ 3 ]

5 голосов
/ 28 августа 2009

Это всегда зависит от домена. Но есть также две ситуации, когда вы выполняете такие поиски. Одна ситуация после хода (изменение игрового поля, сделанного игроком), а другая будет, если / когда вся доска изменилась.

В тетрисе вам не нужно сканировать всю доску после того, как кусок упал. Тебе просто нужно поискать строки, к которым прикоснулся кусок.

В матч-3 играх, таких как Bejeweled, где вы меняете местами две смежные фигуры одновременно, вы сначала запускаете локализованный поиск в каждом направлении вокруг каждого квадрата, который изменился, чтобы увидеть, сработали ли какие-нибудь фигуры. Затем, если они есть, игра сбросит несколько новых случайных фигур на игровое поле. Теперь вы можете запускать один и тот же локализованный поиск вокруг каждого измененного квадрата, но это может включать много операторов if и может на самом деле медленнее просто сканировать всю доску сверху вниз слева направо. Это зависит от вашей реализации и потребует профилирования.

Как говорит Адриан, достаточно простого 2D-массива. Однако часто вы можете добавить «границу» пикселей вокруг этого массива, чтобы упростить аспект поиска шаблонов. Без рамки вы должны иметь if операторов вдоль краевых квадратов, которые говорят: «ну, если вы в верхнем ряду, не ищите (и не уходите от массива)». Имея границы вокруг него, вы можете безопасно просто искать все: сохраняя себя if операторов, сохраняя себя ветвящимися, избавляя себя от проблем конвейера, ища быстрее.

Джону: такие вещи действительно имеют значение в высокопроизводительных настройках, даже на современных машинах, если вы создаете алгоритм поиска для игры / решения игры. Если да, то вы хотите, чтобы ваша базовая симуляция выполнялась как можно быстрее, чтобы искать как можно глубже в наименьшем количестве циклов.

2 голосов
/ 28 августа 2009

Относительно алгоритмов: это, безусловно, зависит от игры. Например, для тетриса вам нужно будет сканировать каждую строку, если она имеет одинаковый цвет. Я даже не могу придумать что-то, что в данном случае не сравнится с методом грубой силы. Но для большинства казуальных игр грубой силой должно быть вполне нормально. Распознавание образов должно быть незначительным по сравнению с обработкой графики и звука.

Относительно структур: простого 2D-массива должно быть достаточно для представления доски.

0 голосов
/ 28 августа 2009

Учитывая среднюю скорость компьютера в эти дни, если она в реальном времени, когда пользователь играет в игру, это, вероятно, не будет иметь значения (РЕДАКТИРОВАТЬ: только для очень маленьких игровых плат). Конечно, это будет зависеть от сложности игровой логики, но также и от того, насколько быстро будет выполняться код на целевой машине (то есть, это игра на веб-странице JavaScript или приложение для Windows, написанное на C ++).

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

Более эффективная стратегия может включать отслеживание постепенных изменений игрового поля вместо повторного сканирования всей доски каждый раз.

...