Рубрики
Без рубрики

Введение в программирование бота: создание простого бобра бомбармана (часть 2)

Это часть 2 серии, изначально опубликованная на блоге Coder One. Проверьте часть 1 здесь: … Помечено Python, программирование, AI, учебник.

Это часть 2 серии, изначально опубликованная на Кодер один блог Отказ Проверьте часть 1 здесь: Строительство игры AI BOT для Bomberman Отказ В этом учебном серии мы построим бот в Python, который может играть в вариации классической игры Bomberman под названием Подземелья и структуры данных Отказ Мы начнем простым, и добавьте расширенные стратегии в более поздние части серии.

Реконструировать

Убедитесь, что вы проверили Часть 1 этого бота программирования Учебное пособие Серия первым. До сих пор мы покрывали:

  • Настройка игровой среды Подземелья и структуры данных
  • Работа со стартовым агентом Python, который делает случайные движения
  • Познакомьтесь с объектами и методами игры

В части 2 мы покажем вам, как построить простой агент, называемый « Странник агент «Это реализует некоторую сценарию логику для изучения и ориентирования по миру. Более конкретно, это:

  1. Смотрит на его непосредственное окружение
  2. Проверяет, какие направления являются действительными для перемещения в
  3. Выбирает случайное действительное направление, чтобы взять

Если вы больше заинтересованы в теме обучения подкреплениями, проверьте мое другое вводное руководство в Умение подкрепления с помощью «Такси» Openai «Taxi» Отказ

Шаг 1: помощники помощника

В этом разделе мы пройдем через создание 3 метода помощников, которые будут полезны для нашего агента:

  1. get_surounding_tiles () : Возвращает список наших окрестных плиток
  2. get_empty_tiles () : Возвращает плитки, которые действительны для нашего агента, чтобы перейти в
  3. 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”