Как мне разработать хорошую функцию оценки для Connect 4?

У меня есть Java-реализация игры "Connect 4" (с переменным количеством столбцов и строк) .

В этой реализации используется (по выбору пользователя) алгоритм Mini-max Mini-max с отсечкой альфа-бета с максимальной глубиной поиска maxDepth

Моя проблема сейчас заключается в разработке хорошей функции оценки состояния платы (это значение, возвращаемое в maxDepth).

Значение находится в диапазоне от -100 (худший вариант, соответствует проигрышной ситуации) до 100 (наилучший выбор соответствует выигрышной ситуации), где 0 считается ситуацией "ничьей".

На самом деле я реализовал две функции (я сообщаю псевдокод, потому что код очень длинный)

1)

  • нет победы / нет проигрыша

-> если таблица заполнена ==> сделать (0)

-> если таблица не заполнена ==> неуверенная ситуация (50)

  • выиграть

-> если моя победа: 100

-> если победа противника: -100

2)

Of me:
- InARow[0] = maximum number of pieces in a HORIZONTAL in a row
- InARow[1] = maximum number of pieces in a VERTICAL in a row
- InARow[2] = maximum number of pieces in a DIAGONAL (ascending) in a row
- InARow[3] = maximum number of pieces in a DIAGONAL (descending) in a row
Of the opponent
- InARow2[0] = maximum number of pieces in a HORIZONTAL in a row
- InARow2[1] = maximum number of pieces in a VERTICAL in a row
- InARow2[2] = maximum number of pieces in a DIAGONAL (ascending) in a row
- InARow2[3] = maximum number of pieces in a DIAGONAL (descending) in a row

value = (100* (InARow[0] + InARow[1] + InARow[2] + InARow[3]) )/16 - (100* (InARow2[0] + InARow2[1] + InARow2[2] + InARow2[3]) )/16  

Мне нужно разработать третью (и, если возможно, лучшую) функцию. Любое предложение?

Заранее спасибо.

3 ответа

Решение

Просто посчитайте количество возможных 4 в строках, которые каждый игрок может сделать, и вычтите их друг от друга.

Например, оба игрока начинают со счета 7*4 (horizontal) + 4*7 (vertical) + 4*4 (diagonal up) + 4*4 (diagonal down), Если красный ставит один в левом нижнем углу, то желтый теряет счет 1 + 1 + 1 + 0 = 3, Но если красный ставит один в середине, желтый теряет счет 4 + 1 + 1 + 1 = 7,

Конечно, если один из игроков выигрывает, то счет другого игрока -infinityнезависимо от системы выше.

У вас есть сглаженные базовые случаи: мой выигрыш = 100 очков, мой проигрыш = -100, ничья = 0. "Неуверенный" случай, который вы можете убить, не отражает "доброту" доски. Так что теперь вам нужно заполнить пробелы. Случаи, которые вы хотите рассмотреть и назначить значения:

  • У меня есть X в ряду (если у меня есть 3 в ряду, это лучше, чем только два в строке - ваша функция должна предпочесть добавление к более длинным строкам по сравнению с более короткими)
  • У моего оппонента Х подряд (аналогично, чем больше у него / нее подряд, тем хуже для нас)
  • Подсчитайте, сколько строк вы заполняете (Размещение фигуры и формирование 2 рядов по 3 лучше, чем размещение фигуры и формирование только одного ряда по 3).
  • Подсчитайте, сколько строк вы блокируете (аналогично, если вы можете сбросить фигуру и заблокировать два ряда противников по 3, это лучше, чем блокирование одного ряда по 2)

Вот две отдельные функции оценки для подключения 4

  1. Одна базовая функция оценки, как предложено в другом ответе, мы можем вычислить количество возможных 4 в рядах, которые игрок все еще может сделать, и вычесть это из противника. Вы можете назначать разный вес или важность блокам, которые уже имеют три плитки, по сравнению с блоками, которые имеют только 1 плитку.
  2. Еще одна более сильная функция оценки может быть построена с использованием концепции угроз. Угроза - это квадрат, соединяющий 4, когда противник сбрасывает плитку. Вы можете просто вернуть разницу в количестве угроз для каждого игрока, но мы можем добиться большего успеха, фактически отфильтровывая бесполезные угрозы (например, угрозу чуть выше угрозы оппонента или все угрозы выше угрозы со стороны обоих игроков) и даже назначая бонус для некоторых угроз (например, самая низкая угроза столбца или 2 последовательных угрозы от одного и того же игрока).

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

Другие вопросы по тегам