From c06624d79c1e2951bf4b65eb4f265dbc2251522d Mon Sep 17 00:00:00 2001 From: korzepadawid Date: Sun, 29 May 2022 23:13:45 +0200 Subject: [PATCH] example genome generation --- algorithms/genetic/map_generator.py | 107 ++++++++++++++++++++++++++++ requirements.txt | Bin 148 -> 216 bytes 2 files changed, 107 insertions(+) create mode 100644 algorithms/genetic/map_generator.py diff --git a/algorithms/genetic/map_generator.py b/algorithms/genetic/map_generator.py new file mode 100644 index 0000000..2e917c7 --- /dev/null +++ b/algorithms/genetic/map_generator.py @@ -0,0 +1,107 @@ +from dataclasses import dataclass +from random import randrange + +import numpy as np +import numpy.typing as npt + +# map config +KNIGHTS_PER_TEAM_COUNT = 4 +SAND_COUNT = 21 +WATER_COUNT = 21 +TREE_COUNT = 37 +MONSTERS_COUNT = 2 +CASTLES_COUNT = 1 +ROWS = 19 +COLUMNS = 24 +KNIGHTS_SPAWN_WIDTH = 4 +KNIGHTS_SPAWN_HEIGHT = 7 +LEFT_KNIGHTS_SPAWN_FIRST_ROW = 6 +LEFT_KNIGHTS_SPAWN_FIRST_COL = 0 +RIGHT_KNIGHTS_SPAWN_FIRST_ROW = 6 +RIGHT_KNIGHTS_SPAWN_FIRST_COL = 20 + +# aliases +GRASS = 0 +SAND = 1 +WATER = 2 +TREE = 3 +MONSTER = 4 +CASTLE = 5 +KNIGHT_RED = 6 +KNIGHT_BLUE = 7 + + +@dataclass +class Position: + row: int + col: int + + +def is_empty(grid: npt.NDArray, position: Position) -> bool: + return grid[position.row, position.col] in [GRASS, SAND] + + +def is_invalid_area(spawn_position_start, height, width) -> bool: + return spawn_position_start.row + height - 1 < 0 or \ + spawn_position_start.row + height - 1 >= ROWS or \ + spawn_position_start.col + width - 1 < 0 or \ + spawn_position_start.col + width - 1 >= COLUMNS + + +def spawn_objects_in_given_area(grid: npt.NDArray, object_alias: KNIGHT_RED | KNIGHT_BLUE | CASTLE | MONSTER, + objects_count: int = 1, + spawn_position_start: Position = Position(row=0, col=0), + width: int = 1, + height: int = 1) -> None: + if is_invalid_area(spawn_position_start, height, width): + raise ValueError("Invalid spawn area") + + if objects_count > 0: + row = randrange(spawn_position_start.row, spawn_position_start.row + height) + col = randrange(spawn_position_start.col, spawn_position_start.col + width) + position = Position(row=row, col=col) + objects_remaining = int(objects_count) + + if is_empty(grid=grid, position=position): + grid[position.row, position.col] = object_alias + objects_remaining -= 1 + + spawn_objects_in_given_area( + grid=grid, + object_alias=object_alias, + objects_count=objects_remaining, + spawn_position_start=spawn_position_start, + width=width, + height=height + ) + + +def genome() -> npt.NDArray: + grid = np.zeros((ROWS, COLUMNS), dtype=int) + spawn_objects_in_given_area( + grid=grid, + object_alias=KNIGHT_RED, + objects_count=KNIGHTS_PER_TEAM_COUNT, + spawn_position_start=Position(row=LEFT_KNIGHTS_SPAWN_FIRST_ROW, col=LEFT_KNIGHTS_SPAWN_FIRST_COL), + width=KNIGHTS_SPAWN_WIDTH, + height=KNIGHTS_SPAWN_HEIGHT + ) + + spawn_objects_in_given_area( + grid=grid, + object_alias=KNIGHT_BLUE, + objects_count=KNIGHTS_PER_TEAM_COUNT, + spawn_position_start=Position(row=RIGHT_KNIGHTS_SPAWN_FIRST_ROW, col=RIGHT_KNIGHTS_SPAWN_FIRST_COL), + width=KNIGHTS_SPAWN_WIDTH, + height=KNIGHTS_SPAWN_HEIGHT + ) + return grid + + +def main() -> None: + example_genome = genome() + print(example_genome) + + +if __name__ == '__main__': + main() diff --git a/requirements.txt b/requirements.txt index 82236198bdcfb899947d2ff58bc2acc8136e458a..973091af59ddbb4f1c65c30352b79a189f087cbd 100644 GIT binary patch delta 75 zcmbQjc!P1m6c=6wE`~gYQifcH0)|S4ItE(?Lk2wtBOugcFlGSB<}xHQlmKOO81jL1 T4nrnG5?GxvP=zTF8!`X@F2@Z8 delta 6 Ncmcb?IE8V-6aWb#0+Rp$