diff --git a/tasks/19 - findpath.py b/tasks/19 - findpath.py new file mode 100644 index 0000000..5c4711c --- /dev/null +++ b/tasks/19 - findpath.py @@ -0,0 +1,103 @@ +from enum import Enum +import numpy as np + + +class Direction(Enum): + UP = 0 + LEFT = 1 + RIGHT = 2 + DOWN = 3 + + +class Field(Enum): + NOTHING = 0 + WIN = 1 + + def __str__(self) -> str: + match self: + case Field.NOTHING: return "" + case Field.WIN: return "" + case _: raise NotImplementedError("field type not implemented") + + +class Player: + x_pos: int + y_pos: int + + def __init__(self, start_x: int, start_y: int) -> None: + self.x_pos = start_x + self.y_pos = start_y + + def __str__(self) -> str: + return "󰳆 " + + +class Map: + map: np.ndarray + x: int + y: int + + def __init__(self, x: int, y: int) -> None: + self.map = np.array([Field.NOTHING] * (x*y)).reshape(y, x) + self.map[0][0] = Field.WIN + self.map[-1][-1] = Field.WIN + self.x = x + self.y = y + + def make_player(self) -> Player: + return Player(int(self.x/2), int(self.y/2)) + + def __str__(self) -> str: + buf = "-" + "-" * (self.x * 3) + "\n" + for row in self.map: + for field in row: + buf += (f"|{field} ") + buf += ("|\n") + buf += "-" + "-" * self.x * 3 + return buf + + def render(self, player: Player) -> str: + buf = "-" + "-" * self.x * 3 + "\n" + for y, row in enumerate(self.map): + for x, field in enumerate(row): + if (player.x_pos, player.y_pos) == (x, y): + buf += ("|󰳆 ") + else: + buf += (f"|{field} ") + buf += ("|\n") + buf += "-" + "-" * self.x * 3 + return buf + + def set_position(self, player: Player, x: int, y: int) -> bool: + if not 0 <= x <= self.x and 0 <= y <= self.y: + return False + else: + player.x_pos = x + player.y_pos = y + return True + + def move(self, player: Player, direction: Direction) -> bool: + match direction: + case Direction.UP: return self.set_position(player, player.x_pos, + player.y_pos-1) + case Direction.DOWN: return self.set_position(player, player.x_pos, + player.y_pos+1) + case Direction.LEFT: return self.set_position(player, player.x_pos-1, + player.y_pos) + case Direction.RIGHT: return self.set_position(player, player.x_pos+1, + player.y_pos) + + +def main(): + map = Map(5, 5) + p = map.make_player() + print(map.render(p)) + assert map.move(p, Direction.UP) + print(map.render(p)) + assert map.move(p, Direction.LEFT) + assert map.move(p, Direction.LEFT) + print(map.render(p)) + + +if __name__ == "__main__": + main()