Это часть 2 серии, изначально опубликованная на Кодер один блог Отказ Проверьте часть 1 здесь: Строительство игры AI BOT для Bomberman Отказ В этом учебном серии мы построим бот в Python, который может играть в вариации классической игры Bomberman под названием Подземелья и структуры данных Отказ Мы начнем простым, и добавьте расширенные стратегии в более поздние части серии.
Реконструировать
Убедитесь, что вы проверили Часть 1 этого бота программирования Учебное пособие Серия первым. До сих пор мы покрывали:
- Настройка игровой среды Подземелья и структуры данных
- Работа со стартовым агентом Python, который делает случайные движения
- Познакомьтесь с объектами и методами игры
В части 2 мы покажем вам, как построить простой агент, называемый « Странник агент «Это реализует некоторую сценарию логику для изучения и ориентирования по миру. Более конкретно, это:
- Смотрит на его непосредственное окружение
- Проверяет, какие направления являются действительными для перемещения в
- Выбирает случайное действительное направление, чтобы взять
Если вы больше заинтересованы в теме обучения подкреплениями, проверьте мое другое вводное руководство в Умение подкрепления с помощью «Такси» Openai «Taxi» Отказ
Шаг 1: помощники помощника
В этом разделе мы пройдем через создание 3 метода помощников, которые будут полезны для нашего агента:
get_surounding_tiles ()
: Возвращает список наших окрестных плитокget_empty_tiles ()
: Возвращает плитки, которые действительны для нашего агента, чтобы перейти вmove_to_tile ()
: Возвращает соответствующее действие, который агент должен предпринять для перемещения в плитку
Вы должны быть знакомы с game_state
и Player_state
Объекты из Часть 1 Учебника Отказ
get_surorounding_tiles ()
Наш первый помощник методом get_surounding_tiles ()
Вернется нам список плиток, окружающих текущее местоположение нашего агента как (X, Y) кортеж карты игры.
Мы воспользуемся преимуществом координаты-представления карты:
Ниже приведен скелет для нашего get_surounding_tiles ()
Метод * Отказ * Мы оставили вам несколько пробелов, чтобы заполнить. Если вы застряли, проверьте решение Отказ (💡 Подсказка: Установите флажок Игра Государственная документация для полезных методов).
# given our current location as an (x,y) tuple, return the surrounding tiles as a list # (i.e. [(x1,y1), (x2,y2),...]) def get_surrounding_tiles(self, location): # location[0] = x-index; location[1] = y-index tile_north = (location[0], location[1]+1) tile_south = None ################ FILL THIS ################### tile_west = None ################ FILL THIS ################### tile_east = (location[0]+1, location[1]) surrounding_tiles = [tile_north, tile_south, tile_west, tile_east] for tile in surrounding_tiles: # check if the tile is within the boundaries of the game if None: ################ CHANGE 'NONE' ################### # remove invalid tiles from our list surrounding_tiles.remove(tile) return surrounding_tiles
Ссылка на решение
Далее добавьте свой get_surounding_tiles ()
Метод для вашего Агент
класс в my_agent.py
Отказ
class Agent: def __init__(self): pass def next_move(self, game_state, player_state): ''' This method is called each time your Agent is required to choose an action ''' pass ######################## ### HELPERS ### ######################## def get_surrounding_tiles(self, location): ''' Your code here ''' return surrounding_tiles
get_empty_tiles ()
Для того, чтобы наш агент мог бы эффективно перемещаться, ему также нужно будет знать, какой из его окружающих плиток на самом деле пустым (то есть не содержащий блок или другой игрок). Вот a get_empty_tiles
Способ с некоторыми заготовками для вас, чтобы заполнить:
# given a list of tiles, return only those that are empty/free def get_empty_tiles(self, tiles): empty_tiles = [] for tile in tiles: if None: ################ CHANGE 'NONE' ################### # add empty tiles to list empty_tiles.append(tile) return empty_tiles
Ссылка на решение
move_to_tile ()
Учитывая соседнюю окружающую плитку и наше текущее местоположение, move_to_tile ()
вернет действие (то есть u
, d
, l
, R
) Это приведет нас туда. Например. Если плитка, которую мы хотим переехать, это напрямую к северу от нас, этот метод вернет U
Отказ
# given an adjacent tile location, move us there def move_to_tile(self, location, tile): # see where the tile is relative to our current location diff = tuple(x-y for x, y in zip(tile, self.location)) # return the action that moves in the direction of the tile if diff == (0,1): action = 'u' elif diff == (0,-1): action = None ################ FILL THIS ################### elif diff == (1,0): action = None ################ FILL THIS ################### elif diff == (-1,0): action = 'l' else: action = '' return action
Ссылка на решение
Шаг 2: Агент логика
С нашими помощниками на месте мы сможем реализовать некоторую простую логику для управления нашим агентом для навигации на игровом мире.
Вот какой-то выборки скелетного кода, который поможет вам собрать вместе вашего агента. Вот также ссылка на нашу Собственная версия агента Wanderer Отказ
import random class Agent: def __init__(self): ''' Place any initialization code for your agent here (if any) ''' pass def next_move(self, game_state, player_state): ''' This method is called each time your Agent is required to choose an action ''' ######################## ### VARIABLES ### ######################## # game map is represented in the form (x,y) self.cols = game_state.size[0] self.rows = None ################ FILL THIS ################### # useful for later self.game_state = game_state self.location = player_state.location ######################## ### AGENT ### ######################## # get our surrounding tiles surrounding_tiles = self.get_surrounding_tiles(self.location) # get list of empty tiles around us empty_tiles = None ################ FILL THIS ################### if empty_tiles: # choose an empty tile to walk to random_tile = random.choice(empty_tiles) action = None ################ FILL THIS ################### else: # we're trapped action = '' return action ######################## ### HELPERS ### ######################## # given our current location as an (x,y) tuple, return the surrounding tiles as a list # (i.e. [(x1,y1), (x2,y2),...]) def get_surrounding_tiles(self, location): # location[0] = x-index; location[1] = y-index tile_north = (location[0], location[1]+1) tile_south = None ################ FILL THIS ################### tile_west = None ################ FILL THIS ################### tile_east = (location[0]+1, location[1]) surrounding_tiles = [tile_north, tile_south, tile_west, tile_east] for tile in surrounding_tiles: # check if the tile is within the boundaries of the game if None: ################ CHANGE 'NONE' ################### # remove invalid tiles from our list surrounding_tiles.remove(tile) return surrounding_tiles # given a list of tiles, return only those that are empty/free def get_empty_tiles(self, tiles): empty_tiles = [] for tile in tiles: if None: ################ CHANGE 'NONE' ################### # add empty tiles to list empty_tiles.append(tile) return empty_tiles # given an adjacent tile location, move us there def move_to_tile(self, location, tile): # see where the tile is relative to our current location diff = tuple(x-y for x, y in zip(tile, self.location)) # return the action that moves in the direction of the tile if diff == (0,1): action = 'u' elif diff == (0,-1): action = None ################ FILL THIS ################### elif diff == (1,0): action = None ################ FILL THIS ################### elif diff == (-1,0): action = 'l' else: action = '' return action
Ссылка на полный агент странника
Сохраните свой агент ( my_agent.py
) Затем запустите следующую команду в своем терминале, чтобы посмотреть, как ваш новый бот подходит к себе:
coderone-dungeon --watch my_agent my_agent
Шаг 3: бомбы
Выиграть в Подземелья и структуры данных Ваш агент должен будет делать больше, чем бродит по карте. Нужно знать, как стратегически размещать бомбы, чтобы взорвать ящики для очков или снять противника.
Теперь, когда у вас есть лучший похвал окружающей среды, посмотрите на реализацию некоторой логики вокруг размещения бомбы.
Если вы заинтересованы, проверьте нашу реализацию A Очень простой «бегущий агент» Отказ Используется Манхэттен Расстояние Формула решать, следует ли сосредоточиться на убегании от близлежащих бомб или помещать их больше.
Следующие шаги
В этой части мы отправились от случайного агента, который выбирает его движения случайным образом, чтобы он мог интерпретировать его окружающую среду и ее изучить.
В следующей части серии мы реализуем алгоритм PATHFINDING, чтобы помочь ему перейти к полезным объектам вокруг карты. Вы можете следовать за мной здесь на Dev или на Средний Чтобы получить уведомление, когда часть 3 выходит.
Слияние Если вы заинтересованы в поддержке этого проекта, пожалуйста, следуйте нам на Продукт Hunt Действительно
Спасибо за чтение 🙌
Оригинал: “https://dev.to/joooyz/an-introduction-to-bot-programming-building-a-simple-bomberman-bot-part-2-5blg”