45 lines
1.7 KiB
Python
45 lines
1.7 KiB
Python
from random import shuffle
|
|
from retro_gamer.examples.beast.agents.player import Player
|
|
from retro_gamer.examples.beast.agents.beast import Beast
|
|
from retro_gamer.examples.beast.agents.block import Block
|
|
|
|
class Board:
|
|
"""Creates the agents needed at the beginning of the game and assigns their positions."""
|
|
|
|
def __init__(self, width, height, block_density=0.3, num_beasts=10):
|
|
self.width = width
|
|
self.height = height
|
|
self.block_density = block_density
|
|
self.num_blocks = round(width * height * block_density)
|
|
self.num_empty_spaces = width * height - self.num_blocks
|
|
self.num_beasts = num_beasts
|
|
self.validate()
|
|
|
|
def validate(self):
|
|
if self.block_density < 0 or self.block_density > 1:
|
|
raise ValueError("block density must be between 0 and 1.")
|
|
if self.num_empty_spaces < self.num_beasts + 1:
|
|
raise ValueError("Not enough space on the board.")
|
|
|
|
def get_agents(self):
|
|
"""Returns a list of agents initialized in their starting positions."""
|
|
positions = self.get_all_positions()
|
|
shuffle(positions)
|
|
|
|
player_position = positions[0]
|
|
beast_positions = positions[1:self.num_beasts + 1]
|
|
block_positions = positions[-self.num_blocks:]
|
|
|
|
player = [Player(player_position)]
|
|
beasts = [Beast(pos) for pos in beast_positions]
|
|
blocks = [Block(pos) for pos in block_positions]
|
|
return player + beasts + blocks
|
|
|
|
def get_all_positions(self):
|
|
"""Returns a list of all positions on the board."""
|
|
positions = []
|
|
for i in range(self.width):
|
|
for j in range(self.height):
|
|
positions.append((i, j))
|
|
return positions
|