Exemple #1
0
class Map:

    def __init__(self, file_name, index):

        # Action handling
        self.action_handler = ActionHandler()

        # Create mapview
        self.view = MapView(self.action_handler, index)

        # Dictionary
        self.dct = {-1: Border,
                    1:  Floor,
                    2: partial(self.build_goal, 1),
                    3: partial(self.build_goal, 2),
                    4: partial(self.build_player, 1),
                    5: partial(self.build_player, 2),
                    6: Block,
                    7: Hole,
                    8: "mirrorDU",
                    9: "mirrorUD",
                    10: "memory",
                    11: "p1Wall",
                    12: "p2Wall" }


        # Parse file
        self.mat = add_border(parse(file_name))
        self.width = TileView.nb_lines = len(self.mat)
        self.height = len(self.mat[0])
        self.players = {}
        self.goals = {}
        self.tiles = {pos: self.dct[element](pos, self.get_id(pos))
                          for i, line in enumerate(self.mat)
                              for j, element in enumerate(line)
                                  for pos in [(i,j)]}

        for id_player, player in self.players.items():
            self.action_handler.add_player(id_player, player)


    def build_player(self, player_id, pos, pid):
        floor = Floor(pos, pid)
        self.players[player_id] = Player(player_id, pos, self, floor)
        return floor


    def build_goal(self, goal_id, pos, pid):
        self.goals[goal_id] = Goal(goal_id, pos, pid)
        return self.goals[goal_id]


    def get_id(self, pos):
        pos = XY(*pos)
        return pos.x * self.width + pos.y

    def projection(self, player_id):
        # Init variables
        result = []
        player = self.players[player_id]
        current_pos = player.pos
        other_pos = next(p.pos for i,p in self.players.items() if i!=player_id)

        # Loop over valid positions
        stop = False
        while not stop:
            # Append and update current position
            result.append(current_pos)
            current_pos += player.dir
            # Test new position
            next_tile = self.tiles[current_pos]
            stop = isinstance(next_tile, (Block, Border, Hole))
            stop = stop or current_pos == other_pos

        # Black hole case
        if isinstance(next_tile, Hole):
            result.append(current_pos)

        # Return result
        return result

    def get_success(self):
        # Inint result
        result = []
        # Get results
        for i in (1,2):
            goal = self.goals[i]
            player = self.players[i]
            success = (goal.pos == player.pos)
            goal.set_active(success)
            result.append(success)
        # Return the result
        return tuple(result)

    def win(self):
        self.view.win()

    def lose(self, nb_tiles):
        self.view.lose(nb_tiles)