Files

66 lines
2.0 KiB
Python

# funções associadas a operações com o Mapa
# import random
# from modules import agente
from modules import agente
from modules.agente import Agente
# import modules.estrategia as ModEstrategia
# dimensao minima de um mapa
MIN_DIMENSAO: int = 1
MAX_DIMENSAO: int = 128
class Mapa:
"""definição de classe Mapa, que descreve um mapa com dimensão 'dimensao'.
a representação desse mapa fica guardado em 'mundo', que é uma lista de
listas, e cada posição guarda um objecto 'Agente'
"""
dimensao: tuple[int, int]
mundo: list[list[Agente]]
id_mapa: int
def __init__(self, dimensao: tuple[int, int]):
self.mundo = []
if (
dimensao[0] < MIN_DIMENSAO
or dimensao[1] < MIN_DIMENSAO
or dimensao[0] > MAX_DIMENSAO
or dimensao[1] > MAX_DIMENSAO
):
raise ValueError(
f"dimensões de mapa tem de ser >{MIN_DIMENSAO} e <={MAX_DIMENSAO}"
)
self.dimensao = dimensao
self.mundo = self.inicializar()
self.id_mapa = id(self)
def __str__(self):
return f"Dados Mapa ({self.id_mapa})\n \
\tdimensao: {self.dimensao[0]} x {self.dimensao[1]}"
def inicializar(self) -> list[list[Agente]]:
# inicializar mundo
for _ in range(0, self.dimensao[0]):
mundo_tmp: list[Agente] = []
for _ in range(0, self.dimensao[1]):
mundo_tmp.append(Agente())
self.mundo.append(mundo_tmp)
return self.mundo
def posicao(self, posicao: tuple[int, int]) -> Agente:
"""devolver objecto que está na 'posicao'"""
pos_x: int = posicao[0]
pos_y: int = posicao[1]
# aplicar wrap_around_map, e evitam-se erros de dimensao
if pos_x < 0:
pos_x = self.dimensao[0] - 1
if pos_x >= self.dimensao[0]:
pos_x = 0
if pos_y < 0:
pos_y = self.dimensao[1] - 1
if pos_y >= self.dimensao[1]:
pos_y = 0
return self.mundo[pos_x][pos_y]