コード例 #1
0
ファイル: maze.py プロジェクト: bgodet/p3_openclassrooms
class Maze:

    ##########################
    # Creating the constructor
    ##########################

    def __init__(self, filepath):
        self.__maze_list = []
        self.__player = None
        self.__nbItem = 0

        #######################
        # Variables declaration
        #######################

        nbCorridor = 0
        nbPlayer = 0
        nbEnd = 0
        nbGuardian = 0

        #####################
        # Initialing the maze
        #####################

        if os.path.isfile(filepath):
            # Open file
            with open(filepath) as fp:
                # For each line on the  text file
                for x, line in enumerate(fp):
                    maze_line = []

                    #################################
                    # Getting lines element on memory
                    #################################

                    for y, character in enumerate(line):
                        if (character == 'X'):
                            maze_line.append(Wall())
                        elif (character == 'G'):
                            maze_line.append(Guardian())
                            nbGuardian += 1
                        elif (character == 'E'):
                            maze_line.append(End())
                            nbEnd += 1
                        elif (character == ' '):
                            maze_line.append(Corridor())
                            nbCorridor += 1
                        elif (character == 'P'):
                            self.__player = Player(x, y)
                            maze_line.append(self.__player)
                            nbPlayer += 1

                    # Adding the line on memory
                    if nbPlayer > 1:
                        raise ValueError(
                            'Erreur : Votre niveau contient trop de joueurs !')
                    elif nbGuardian > 1:
                        raise ValueError(
                            'Erreur : Votre niveau contient trop de gardiens !'
                        )
                    elif nbEnd > 1:
                        raise ValueError(
                            'Erreur : Votre niveau contient trop de sorties')
                    else:
                        self.__maze_list.append(maze_line)

            ################
            # Item placement
            ################

            items = [Needle(), Tube(), Ether()]
            # With this attribute, the Maze already know how much items exist and how much is required
            self.__nbItem = len(items)
            randomCorridors = self.randomItem(len(items))

            if randomCorridors is not None:
                for i, (line, col) in enumerate(randomCorridors):
                    self.__maze_list[line][col] = items[i]

        else:
            raise FileNotFoundError('Aucun fichier existant sur le chemin:' +
                                    filepath)

    def getMaze(self):
        return tuple(self.__maze_list)

    ##################################
    # Display function for the console
    ##################################

    def __str__(self):
        string = ""
        for row in self.__maze_list:
            for item in row:
                string += ' {} '.format(item)
            string += '\n'
        return string

    def __repr__(self):
        return self.__str__()

    ##################################
    # Function to place Items randomly
    ##################################

    def randomItem(self, nbItems):
        nbLine = 0
        nbCorridors = []

        for line in self.__maze_list:
            nbColonne = 0
            for element in line:
                if isinstance(element, Corridor):
                    nbCorridors.append((nbLine, nbColonne))
                nbColonne += 1
            nbLine += 1
        # Getting numbers of corridors
        if len(nbCorridors) >= nbItems:
            return random.sample(nbCorridors, nbItems)
        else:
            return None

    ###################################
    # Core function for player movement
    ###################################

    def __movePlayer(self, x, y):

        newX = self.__player.getX() + x
        newY = self.__player.getY() + y
        if (isinstance(self.__maze_list[newX][newY], Wall)):
            print("Impossible move.")

        # Adding items on the player condition
        # If the class is and Item
        elif (isinstance(self.__maze_list[newX][newY], Item)):
            item = self.__maze_list[newX][newY]
            # Adding items in the inventory list
            self.__player.addInventory(item)
            # Replace player element by a corridor
            self.__maze_list[self.__player.getX()][
                self.__player.getY()] = Corridor()
            self.__player.setX(newX)
            self.__player.setY(newY)
            # Set the new player position
            self.__maze_list[self.__player.getX()][
                self.__player.getY()] = self.__player
            print("You picked up " + item.description)

        # The game exit when player on the End cell
        elif (isinstance(self.__maze_list[newX][newY], End)):
            self.__maze_list[self.__player.getX()][
                self.__player.getY()] = Corridor()
            self.__player.setX(newX)
            self.__player.setY(newY)
            # Set the new player position
            self.__maze_list[self.__player.getX()][
                self.__player.getY()] = self.__player
            print("You getted out of the maze !")
            exit()

        elif (isinstance(self.__maze_list[newX][newY], Guardian)):
            if self.__player.countInventory() != self.__nbItem:
                print("You LOOSE")
                exit()
            else:
                self.__maze_list[self.__player.getX()][
                    self.__player.getY()] = Corridor()
                self.__player.setX(newX)
                self.__player.setY(newY)
                # Set the new player's position
                self.__maze_list[self.__player.getX()][
                    self.__player.getY()] = self.__player
                print("You WIN")

        # Natural player moving
        else:
            self.__maze_list[self.__player.getX()][
                self.__player.getY()] = Corridor()
            self.__player.setX(newX)
            self.__player.setY(newY)
            self.__maze_list[self.__player.getX()][
                self.__player.getY()] = self.__player

    ##############################
    # Function for player movement
    ##############################

    def moveDown(self):
        self.__movePlayer(1, 0)

    def moveUp(self):
        self.__movePlayer(-1, 0)

    def moveLeft(self):
        self.__movePlayer(0, -1)

    def moveRight(self):
        self.__movePlayer(0, 1)