38 lines
972 B
Python
38 lines
972 B
Python
|
|
from commands.command import Command
|
||
|
|
|
||
|
|
|
||
|
|
class MoveCommand(Command):
|
||
|
|
DIRECTION_TO_DELTA = {
|
||
|
|
"W": (0, -1),
|
||
|
|
"A": (-1, 0),
|
||
|
|
"S": (0, 1),
|
||
|
|
"D": (1, 0),
|
||
|
|
}
|
||
|
|
|
||
|
|
def __init__(self, player, maze, direction):
|
||
|
|
self.player = player
|
||
|
|
self.maze = maze
|
||
|
|
self.direction = direction.upper()
|
||
|
|
self.previousCell = None
|
||
|
|
|
||
|
|
def execute(self):
|
||
|
|
if self.direction not in self.DIRECTION_TO_DELTA:
|
||
|
|
return False
|
||
|
|
|
||
|
|
dx, dy = self.DIRECTION_TO_DELTA[self.direction]
|
||
|
|
current = self.player.currentCell
|
||
|
|
new_cell = self.maze.getCell(current.x + dx, current.y + dy)
|
||
|
|
|
||
|
|
if new_cell is None or not new_cell.isPassable():
|
||
|
|
return False
|
||
|
|
|
||
|
|
self.previousCell = current
|
||
|
|
self.player.setCell(new_cell)
|
||
|
|
return True
|
||
|
|
|
||
|
|
def undo(self):
|
||
|
|
if self.previousCell is None:
|
||
|
|
return False
|
||
|
|
self.player.setCell(self.previousCell)
|
||
|
|
return True
|