33
loading...
This website collects cookies to deliver better user experience
This is part 2 of a series originally published on the Coder One blog. Check out Part 1 here: Building an AI game bot for Bomberman. In this tutorial series, we'll build a bot in Python that can play in a variation of the classic Bomberman game called Dungeons and Data Structures. We'll start off simple, and add advanced strategies in the later parts of the series.
get_surrounding_tiles()
: Returns a list of our surrounding tilesget_empty_tiles()
: Returns tiles that are valid for our agent to move intomove_to_tile()
: Returns the corresponding action the agent should take to move to a tileget_surrounding_tiles()
will return us a list of tiles surrounding our agent's current location as an (x,y) tuple of the game map.get_surrounding_tiles()
method*.* We've left you some gaps to fill out. If you get stuck, check out the solution. (💡 Hint: check the game state documentation for useful methods).# 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_surrounding_tiles()
method to your Agent
class in 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
method with some blanks for you to fill out:# 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()
will return the action (i.e. u
, d
, l
, r
) that will get us there. E.g. if the tile we want to move to is directly north of us, this method will return 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
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
) then run the following command in your terminal to watch your new bot go up against itself:coderone-dungeon --watch my_agent my_agent