genetic_alg #34
@ -1,5 +1,6 @@
|
||||
from dataclasses import dataclass
|
||||
from random import randrange
|
||||
from typing import List
|
||||
|
||||
import numpy as np
|
||||
import numpy.typing as npt
|
||||
@ -37,6 +38,32 @@ class Position:
|
||||
col: int
|
||||
|
||||
|
||||
class Genome:
|
||||
grid: npt.NDArray
|
||||
knights_red: List[Position]
|
||||
knights_blue: List[Position]
|
||||
|
||||
def __init__(self):
|
||||
self.grid = np.zeros((ROWS, COLUMNS), dtype=int)
|
||||
self.knights_red = spawn_objects_in_given_area(
|
||||
grid=self.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
|
||||
)
|
||||
|
||||
self.knights_blue = spawn_objects_in_given_area(
|
||||
grid=self.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
|
||||
)
|
||||
|
||||
|
||||
def is_empty(grid: npt.NDArray, position: Position) -> bool:
|
||||
return grid[position.row, position.col] in [GRASS, SAND]
|
||||
|
||||
@ -52,55 +79,31 @@ def spawn_objects_in_given_area(grid: npt.NDArray, object_alias: KNIGHT_RED | KN
|
||||
objects_count: int = 1,
|
||||
spawn_position_start: Position = Position(row=0, col=0),
|
||||
width: int = 1,
|
||||
height: int = 1) -> None:
|
||||
height: int = 1) -> List[Position]:
|
||||
if is_invalid_area(spawn_position_start, height, width):
|
||||
raise ValueError("Invalid spawn area")
|
||||
|
||||
if objects_count > 0:
|
||||
objects_remaining = int(objects_count)
|
||||
positions = []
|
||||
|
||||
while objects_remaining > 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
|
||||
positions.append(position)
|
||||
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
|
||||
return positions
|
||||
|
||||
|
||||
def main() -> None:
|
||||
example_genome = genome()
|
||||
print(example_genome)
|
||||
example_genome = Genome()
|
||||
print(example_genome.knights_red)
|
||||
print(example_genome.knights_blue)
|
||||
print(example_genome.grid)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
Loading…
Reference in New Issue
Block a user