Алгоритм стратегической игры
Это вопрос, с которым я играл в течение недели или около того, предложенный коллегой:
представьте себе игру, играл на размерами 36x36 сетки. Цель игры состоит в том, чтобы создать четыре угла квадрата любого размера (например., 2x2, 3x3, 4x4 и так далее). Первый игрок помещает игровую фигуру в любом месте, кроме четырех центральных пространств сетки. После первого хода игроки могут разместить свою часть игры в любом месте сетки. Игровые фигуры нельзя перемещать после их размещения. И вот и все, игра проста и весело.
Я пытался придумать алгоритм, чтобы выиграть, или, по крайней мере, преуспеть в этой игре. Есть предложения?
4 ответов
Это игра совершенной информации, где игроки по очереди, как шахматы, так же подход, используемый в шахматных движках применяется здесь. Используйте Минимакс (С альфа-бета обрезка вероятно) алгоритм поиска дерева допустимых ходов. Вы можете использовать некоторую функцию оценки, чтобы направлять поиск, отдавая предпочтение позициям, которые имеют наиболее почти завершенные квадраты.
Как Фоглберд написал Минимакс алгоритм будет работать лучше всего. Проблема заключается в том, как оценить счет текущей платы. Игра довольно сложная, есть более тысячи полей для начала. В небольшой игре, как крестики нолики вы можете вычислить все возможные ходы до конца дерева поиска в минимаксе, то вы даете 1 очко победившему игроку и -1 к проигрышу и вернуться дерево, чтобы найти свой лучший ход. В этой игре вам нужно что-то вроде эвристика чтобы вычислить счет для доски после спуска трех 10 ходов.
У меня мало информации об игре, поэтому я могу только догадываться о хорошей эвристике:
- очков из-за завершенных квадратов (если вы можете получить более одного квадрата) это был бы самый простой способ, потому что ваша эвристика непосредственно связана с игровыми точками
- минус очков из-за завершенных квадратов вашего врага
- количество возможные квадраты
- количество принадлежащих полей по бокам доски
- количество принадлежащих полей в небольших районах
существует множество эвристик, и большую часть времени вам понадобится смесь некоторых из них.
вам нужно заполнить квадрат или просто поместить его в углах?
например, является ли следующая победа?
.......................
.X..X..................
.......................
.......................
.X..X..................
.......................
или в следующем?
.......................
.XXXX..................
.X..X..................
.X..X..................
.XXXX..................
.......................
или в следующем?
.......................
.XXXX..................
.XXXX..................
.XXXX..................
.XXXX..................
.......................
хорошо, я читаю мусор в игре.. как его неоднозначно.. Я предполагаю, что эта игра похожа на "точки и линии", где пространство для подключения 2 соседние точки с линию. таким образом, сетка 2x2 будет иметь 9 вершин, 4 1x1 выигрышных позиции и 1 2x2 выигрышную позицию. С игрой, заканчивающейся победой для человека, который завершает квадрат, и галстук, как только оба игрока исчерпали выигрышные решения.
с площадями вашу рабочую часть логика хорошая. вы можете рассчитать членство в любой строке во всех возможных ячейках. так что в 2х2 примере радиального бы членство в 2 1х1 коробки и сторона имела бы членство в 1х1 и 2х2 один. Это членство становится важным.
в начале игры вы создаете членство для всех отрезков. сделать 2 копии.. (как играть в battleship) вражеская копия будет инициализирована количеством оборотов, которые он оставил, чтобы закончить каждую коробку.. таким образом, на 36x36 останется 144 хода закончите большую коробку 4 комплекта 140moves, чтобы закончить 4 коробки 35x35
во время его ходов вы уменьшаете все затронутые коробки на вражеской копии Во время вашего хода любой ход, который вы делаете, аннулирует все коробки, содержащие ваш ход. вы устанавливаете отрицательный 1, или бесконечный, или 2 миллиарда... просто нужно знать, что эти квадраты невозможны.
теперь вы создаете копию ANTI-ENEMY, которая является обратной копией вражеской копии.. это содержит, сколько ходов для завершения данного квадрат.
для данного перемещения.. сначала проверьте ситуацию выигрыша. если сможешь двигаться и победить. (antienemy с квадратом в одном) Затем проверьте, нужен ли блок. (вражеская доска с любым квадратом на одном)
теперь добавьте функцию типа minimax, если вы так склонны..
или используйте поиск, чтобы найти позиции, которые уничтожают как можно больше низких квадратов отделки, или создайте линию, которая уменьшает несколько низких квадратов на анти-вражеской доске. Это должно работать, как это не пытается закончить какой-либо конкретный квадрат, но Минимакс, где ваша стрельба для низкого балла будет лучшим сценарием.