44 lines
1.1 KiB
Python
44 lines
1.1 KiB
Python
|
|
class Command:
|
||
|
|
def execute(self):
|
||
|
|
raise NotImplementedError
|
||
|
|
|
||
|
|
def undo(self):
|
||
|
|
raise NotImplementedError
|
||
|
|
|
||
|
|
|
||
|
|
class Player:
|
||
|
|
def __init__(self, position):
|
||
|
|
self.position = position
|
||
|
|
|
||
|
|
|
||
|
|
class MoveCommand(Command):
|
||
|
|
DIRS = {
|
||
|
|
"W": (0, -1),
|
||
|
|
"S": (0, 1),
|
||
|
|
"A": (-1, 0),
|
||
|
|
"D": (1, 0),
|
||
|
|
}
|
||
|
|
|
||
|
|
def __init__(self, maze, player, direction):
|
||
|
|
self.maze = maze
|
||
|
|
self.player = player
|
||
|
|
self.direction = direction.upper()
|
||
|
|
self.prev_position = None
|
||
|
|
|
||
|
|
def execute(self):
|
||
|
|
if self.direction not in self.DIRS:
|
||
|
|
return False
|
||
|
|
dx, dy = self.DIRS[self.direction]
|
||
|
|
current = self.player.position
|
||
|
|
nxt = self.maze.getCell(current.x + dx, current.y + dy)
|
||
|
|
if nxt is None or not nxt.isPassable():
|
||
|
|
return False
|
||
|
|
self.prev_position = current
|
||
|
|
self.player.position = nxt
|
||
|
|
return True
|
||
|
|
|
||
|
|
def undo(self):
|
||
|
|
if self.prev_position is not None:
|
||
|
|
self.player.position = self.prev_position
|
||
|
|
return True
|
||
|
|
return False
|