Beispiel #1
0
class Game:
    def __init__(self):
        self._maze = Maze()
        self._player = Player(self._maze)
        pass

    def start(self):
        self.notify_first_player()
        while not self.game_ended():
            self.draw()
            while self._player.steps_left > 0:
                self.wait_player_step()
                self.do_room_action()
                self.draw()
            self.notify_next_player()

    def load_maze(self):
        pass

    def draw(self):
        pass

    def wait_player_step(self):
        step_done = False
        while not step_done:
            direction = input('where move [(U)p, (L)eft, (R)ight, (D)own)? ').lower()
            if direction in ['u', 'up']:
                delta = (0, -1)
            elif direction in ['l', 'left']:
                delta = (-1, 0)
            elif direction in ['r', 'right']:
                delta = (1, 0)
            elif direction in ['d', 'down']:
                delta = (0, 1)
            else:
                print('wrong direction "{}"'.format(direction))
                continue
            if self._player.move(delta):
                step_done = True
            else:
                print('cannot move in this direction.')

    def do_room_action(self):
        room = self._maze[self._player.position]
        if room.has_treasure():
            self._player._treasure = True
            room.reset_feature()
        elif room.has_ammo():
            self._player._ammo += 2
        elif room.has_plant():
            self._player._steps = -3
        elif room.has_mine():
            if self._player.has_treasure():
                old_x, old_y = self._player.position
                treasure_placed = False
                while not treasure_placed:
                    new_treasure_x = max(min(old_x + random.randint(-2, 2), 9), 0)
                    new_treasure_y = max(min(old_y + random.randint(-2, 2), 9), 0)
                    new_treasure_pos = (new_treasure_x, new_treasure_y)
                    new_room = self._maze[new_treasure_pos]
                    if not new_room.has_feature():
                        new_room._type = Room.TYPE_TREASURE
                        treasure_placed = True

            new_x = random.randint(0, 9)
            new_y = random.randint(0, 9)
            self._player._pos = (new_x, new_y)
        elif room.has_exit():
            pass
        room.reset_feature()

    def game_ended(self):
        return self._player.has_treasure() and \
               self._player.position == self._maze.get_exit_point()

    def notify_next_player(self):
        if self._player._steps <= 0:
            self._player._steps += 3

    def notify_first_player(self):
        self._player._steps = 3