Я пытаюсь реализовать алгоритм AI для Bomberman. В настоящее время у меня есть работающая, но не очень умная элементарная реализация (нынешний ИИ переусердствует в размещении бомб).
Это первый ИИ, который я когда-либо пытался реализовать, и я немного застрял. Более сложные алгоритмы, которые я имею в виду (те, которые я ожидаю для принятия лучших решений) слишком сложны, чтобы быть хорошими решениями.
Какие общие советы вы имеете для реализации Bomberman AI? Существуют ли радикально разные подходы к тому, чтобы сделать бота более оборонительным или агрессивным?
Изменить: текущий алгоритм
Мой текущий алгоритм работает примерно так (псевдокод):
1) Постарайтесь поместить бомбу, а затем найдите ячейку, безопасную от всех бомб, включая ту, которую вы только что установили. Чтобы найти эту ячейку, выполните итерации по четырем направлениям; если вы можете найти любую безопасную расходящуюся ячейку и достичь ее вовремя (например, если направление вверх или вниз, ищите ячейку, найденную слева или справа от этого пути), тогда безопасно разместить бомбу и двигаться в этом направлении.
2) Если вы не можете найти и безопасные расходящиеся клетки, попробуйте НЕ ставить бомбу и посмотрите снова. На этот раз вам нужно будет искать безопасную ячейку только в одном направлении (вам не нужно отклоняться от нее).
3) Если вы все еще не можете найти безопасную камеру, ничего не делайте.
for $(direction) in (up, down, left, right):
place bomb at current location
if (can find and reach divergent safe cell in current $(direction)):
bomb = true
move = $(direction)
return
for $(direction) in (up, down, left, right):
do not place bomb at current location
if (any safe cell in the current $(direction)):
bomb = false
move = $(direction)
return
else:
bomb = false
move = stay_put
Этот алгоритм делает бота очень счастливым (он будет очень часто размещать бомбы). Он не убивает себя, но имеет привычку делать себя уязвимым, заходя в тупики, где его могут заблокировать и убить другие игроки.
Есть ли у вас какие-либо предложения о том, как я могу улучшить этот алгоритм? Или, может быть, я должен попробовать что-то совершенно другое?
Одна из проблем этого алгоритма состоит в том, что он имеет тенденцию оставлять у бота очень мало (часто только одну) безопасных ячеек, на которых он может стоять. Это потому, что бот оставляет за собой множество бомб, если он не убивает себя.
Однако, оставляя за собой след бомб, остается мало мест, где можно спрятаться. Если один из других игроков или ботов решает разместить бомбу где-то рядом с вами, часто случается, что вам негде спрятаться и вы умираете.
Мне нужен лучший способ решить, когда устанавливать бомбы.
Ответы:
Проблема, с которой вы сталкиваетесь, заключается в том, что ваш ИИ никогда не останавливается, чтобы принять разумное решение о том, куда он должен поместить свою следующую бомбу, в результате чего он просто сбрасывает бомбы всякий раз, когда может, и затем решает «дерьмо, дерьмо, что мне теперь делать! ?»
Пауза, чтобы думать
Прямо сейчас ваш AI просто никуда не денется. Иногда, однако, это действительно должно двигаться к цели. Например, если он видит усиление и думает, что может добраться до него раньше игрока, возможно, ему следует найти безопасный путь к этой плитке и двигаться туда, следя за бомбами и избегая их по пути.
Такое же поведение при перемещении к цели можно использовать, когда он думает о том, где разместить следующую бомбу .
Когда ваш ИИ может разместить бомбу, вместо того, чтобы делать это немедленно, он должен кратко использовать алгоритм поиска, чтобы выбрать из доступных мест размещения бомбы на основе таких критериев, как:
Когда это решение было принято, ИИ выбрал место для размещения бомбы и место, где можно спрятаться от взрыва. Теперь он может идти к месту, положить свою бомбу, а затем идти к своему укрытию. Как только он достигает своего укрытия, он может хотеть продолжать идти и находить места для бомб (если у него несколько бомб), при условии, что он должен держаться подальше от бомбы, которую он здесь проходил, чтобы избежать.
На прогулке и поиске безопасного пути
Вы можете разработать для своего ИИ единый метод обхода и использовать его каждый раз, когда хотите, чтобы он шел куда-то. Этот метод может использовать алгоритм поиска A * чтобы найти его путь.
Чтобы сохранить ИИ в безопасности, вы можете заставить его перепроверять свой путь каждый раз, когда размещается новая бомба. Чтобы избежать взрывов, он может проверить время, пока бомба не взорвется, и считать, что потенциальная взрывная ячейка безопасна, если она не взорвется, когда она проходит через эту ячейку, и, если она небезопасна, рассматривайте ее как непроходимую ячейку. ,
Чтобы определить ошибки вашего ИИ (чтобы его иногда можно было взорвать), он должен делать ошибки в расчетах: рассеянно забывать о бомбе, недооценивать размер взрыва или время, пока бомба взрывается, и т. Д.
Примечание: Вы также можете сделать его случайное хождение более целенаправленным, выбирая случайные места для ходьбы или всегда имея в виду новое место для размещения бомбы, вместо того, чтобы просто случайно выбирать соседнюю плитку для блуждания. Таким образом, он не будет блуждать взад и вперед по одному и тому же месту, как если бы он не мог принять решение.
источник