, поэтому я уверен, что все слышали о вызове Беркли Pac-Man AI в тот или иной момент.Некоторое время назад я создал 2D-платформер (без прокрутки) и подумал, что было бы неплохо черпать вдохновение из этого проекта, но создать AI для моей игры (вместо PacMan).При этом, я обнаружил, что очень застрял.Я рассмотрел несколько решений GitHub для PacMan, а также множество статей, касающихся реализации обучения MDP / Reinforced в Python.Мне трудно вернуть их обратно в мою игру.
В моей игре 10 уровней.У каждого уровня есть фрукты, и как только агент захватывает все фрукты, он завершает уровень, и начинается следующий уровень.Вот пример этапа:
Как вы можете видеть на этой картинке, мой агент - маленькая белка, и он должен схватить все вишни.На земле также есть шипы, по которым он не может ходить (или вы теряете жизнь).Вы можете избежать шипов, прыгнув.Таким образом, прыжок технически перемещает агента на 2 области влево или вправо (в зависимости от того, как он смотрит).Кроме этого вы можете двигаться влево, вправо, вверх и вниз по лестнице.Вы не можете прыгнуть больше, чем на 1 пробел, поэтому «2+ gappers» наверху, которые вы видите, вам придется спуститься по лестнице и обойти.Кроме того, не изображенные выше, есть враги, которые идут влево и вправо только на полу, который вы должны уклоняться (вы можете перепрыгнуть через них или просто избежать их).Они отслеживаются в сетке, о которой я расскажу ниже.Так что это немного об игре, если вам нужно больше разъяснений, не стесняйтесь спрашивать, и я могу помочь, позвольте мне немного углубиться в то, что я попробовал сейчас, и посмотреть, может ли кто-нибудь помочь мне собрать что-то вместе.
В моем коде у меня есть сетка, в которой есть все места на карте и то, что они есть (платформа, обычное место, шип, награда / фрукты, лестница и т. Д.).Используя это, я создал сетку действий (код ниже), которая в основном хранит в словаре все места, которые агент может перемещать из каждого места.
for r in range(len(state_grid)):
for c in range(len(state_grid[r])):
if(r == 9 or r == 6 or r == 3 or r == 0):
if (move_grid[r][c] != 6):
actions.update({state_grid[r][c] : 'None'})
else:
actions.update({state_grid[r][c] : [('Down', 'Up')]})
elif move_grid[r][c] == 4 or move_grid[r][c] == 0 or move_grid[r][c] == 2 or move_grid[r][c] == 3 or move_grid[r][c] == 5:
actions.update({state_grid[r][c] : 'None'})
elif move_grid[r][c] == 6:
if move_grid[r+1][c] == 4 or move_grid[r+1][c] == 2 or move_grid[r+1][c] == 3 or move_grid[r+1][c] == 5:
if c > 0 and c < 18:
actions.update({state_grid[r][c] : [('Left', 'Right', 'Up', 'Jump Left', 'Jump Right')]})
elif c == 0:
actions.update({state_grid[r][c] : [('Right', 'Up', 'Jump Right')]})
elif c == 18:
actions.update({state_grid[r][c] : [('Left', 'Up', 'Jump Left')]})
elif move_grid[r+1][c] == 6:
actions.update({state_grid[r][c] : [('Down', 'Up')]})
elif move_grid[r][c] == 1 or move_grid[r][c] == 8 or move_grid[r][c] == 9 or move_grid[r][c] == 10:
if c > 0 and c < 18:
if move_grid[r+1][c] == 6:
actions.update({state_grid[r][c] : [('Down', 'Left', 'Right', 'Jump Left', 'Jump Right')]})
else:
actions.update({state_grid[r][c] : [('Left', 'Right', 'Jump Left', 'Jump Right')]})
elif c == 0:
if move_grid[r+1][c] == 6:
actions.update({state_grid[r][c] : [('Down', 'Right', 'Jump Right')]})
else:
actions.update({state_grid[r][c] : [('Right', 'Jump Right')]})
elif c == 18:
if move_grid[r+1][c] == 6:
actions.update({state_grid[r][c] : [('Down', 'Left', 'Jump Left')]})
else:
actions.update({state_grid[r][c] : [('Left', 'Jump Left')]})
elif move_grid[r][c] == 7:
actions.update({state_grid[r][c] : 'Spike'})
else:
actions.update({state_grid[r][c] : 'WTF'})
В этот момент я как бы застрял накак / что нужно отправить в МДП.Я использую Berkeley MDP , и я просто застрял в том, как начать вовлекать и реализовывать его.У меня есть куча точек данных и где все находится, но я не знаю, как на самом деле заставить мяч двигаться.
У меня есть логическая сетка, которая отслеживает все вредные объекты (шипы и враги) и постоянно обновляетсятак как враги двигаются каждую секунду.
Я создал сетку наград, которая устанавливает:
- Шипы "-5", награда
- Падение с карты "-5"награда
- Фрукт - награда "5"
- Все остальное - награда "-0.2" (так как вы хотите оптимизировать шаги, не пытаясь быть на уровне 1 весь день).
Другая часть моей проблемы во время исследования решений или способов ее реализации заключается в том, что большинство решений - это автомобили, едущие на определенную позицию.Таким образом, у них есть только 1 награда, в то время как у меня есть несколько фруктов за этап.Да, я просто супер застрял и разочаровался в этом.Хотел попробовать себя сам, но если я не смогу сделать это, я мог бы просто сделать Pac-Man, так как есть несколько онлайн-решений.Я ценю ваше время и помощь в этом!
Редактировать: Итак, вот я пытаюсь сделать пример вызова, чтобы вернуть сетку перемещения, хотя из моего понимания (и, очевидно,) она будет динамически меняться после каждого шага, который делает агенттак как враг будет угрожать определенным точкам и все.
Это результат, вы можете видеть, что он близок, но, очевидно, немного застрял в том факте, что есть несколько наград.Я чувствую, что могу быть рядом, но я не совсем уверен.Я немного расстроен в этот момент.