104 lines
2.8 KiB
Python
104 lines
2.8 KiB
Python
|
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()
|