90 lines
2.9 KiB
Python
90 lines
2.9 KiB
Python
import project_constants as const
|
|
from objects import tile as tl, agent as ag
|
|
from objects.mine_models.time_mine import TimeMine
|
|
import json_generator as jg
|
|
|
|
|
|
class Minefield:
|
|
def __init__(self, json_path):
|
|
self.turn = 0
|
|
|
|
self.agent = ag.Agent(const.MAP_RANDOM_10x10)
|
|
self.json_path = json_path
|
|
|
|
# open JSON with minefield info
|
|
json_gen = jg.JsonGenerator()
|
|
json_gen.load_from_a_file(json_path)
|
|
|
|
# create matrix of a desired size, fill it with default tile objects
|
|
self.matrix = [
|
|
[
|
|
tl.Tile(
|
|
(row, column),
|
|
terrain_type=json_gen.get_tile((row, column))["terrain"],
|
|
mine=jg.create_a_mine(json_gen.get_mine((row, column)), (row, column))
|
|
) for column in range(const.V_GRID_HOR_TILES)
|
|
] for row in range(const.V_GRID_VER_TILES)
|
|
]
|
|
|
|
# iterate through chained mines, set mine predecessors
|
|
for pair in jg.get_chained_mine_and_its_predecessor_pairs(json_gen.get_grid()):
|
|
successor_position, predecessor_position = pair
|
|
successor_row, successor_column = successor_position
|
|
predecessor_row, predecessor_column = predecessor_position
|
|
|
|
predecessor = self.matrix[predecessor_row][predecessor_column]
|
|
self.matrix[successor_row][successor_column].mine.predecessor = predecessor
|
|
|
|
def next_turn(self):
|
|
self.turn += 1
|
|
|
|
for row in range(const.V_GRID_VER_TILES):
|
|
for column in range(const.V_GRID_VER_TILES):
|
|
mine = self.matrix[row][column].mine
|
|
|
|
if mine is not None and isinstance(mine, TimeMine):
|
|
mine.timer = max(0, mine.starting_time - int(self.turn / 4))
|
|
|
|
def get_active_mines(self):
|
|
mines = list()
|
|
|
|
for row in range(const.V_GRID_VER_TILES):
|
|
for column in range(const.V_GRID_VER_TILES):
|
|
mine = self.matrix[row][column].mine
|
|
|
|
if mine is not None and mine.active:
|
|
# do not add mines with predecessors
|
|
if mine.type == 'chained' and mine.predecessor is not None:
|
|
continue
|
|
|
|
mines.append(mine)
|
|
|
|
return mines
|
|
|
|
def disarm_mine(self, x, y):
|
|
tile = self.matrix[x][y]
|
|
mine = tile.mine
|
|
mine.disarm()
|
|
|
|
# ================ #
|
|
# === MOVEMENT === #
|
|
# ================ #
|
|
|
|
# check if sapper's destination is accessible
|
|
@staticmethod
|
|
def is_valid_move(target_row: int, target_column: int):
|
|
if 0 <= target_row < const.V_GRID_VER_TILES \
|
|
and 0 <= target_column < const.V_GRID_HOR_TILES:
|
|
return True
|
|
|
|
return False
|
|
|
|
# ============= #
|
|
# === OTHER === #
|
|
# ============= #
|
|
|
|
# method that allows copying classes instance
|
|
def __copy__(self):
|
|
copy = Minefield(self.json_path)
|
|
return copy
|