Skip to content
Advertisement

How to correctly parse a tiled map in a text file?

I’m making a RPG with Python and pygame for a school project. In order to create the few maps, I have chosen the Tile Mapping techniques I have seen in some tutorials, using a *.txt file.

However, I have to cut some sprites (trees, houses, …) into several pieces. The problem is that I’m running out of characters to represent them all!

I also remember that it’s possible to take several characters as one (ex : take "100" as one an not as one "1" and two "0"s) and/or to put spaces between characters in the file (e.g. "170 0 2 5 12 48" which is read as six sprites).

But I really don’t know how to adapt my program to do this way. I’m pretty sure that I need to modify the way the file is read, but how?

Here’s the reading function :

class Niveau:
    def __init__(self, fichier):
        self.fichier = fichier
        self.structure = 0

    def generer(self):
        """Méthode permettant de générer le niveau en fonction du fichier.
        On crée une liste générale, contenant une liste par ligne à afficher"""     
        #On ouvre le fichier
        with open(self.fichier, "r") as fichier:
            structure_niveau = []
            #On parcourt les lignes du fichier
            for ligne in fichier:
                ligne_niveau = []
                #On parcourt les sprites (lettres) contenus dans le fichier
                for sprite in ligne:
                    #On ignore les "n" de fin de ligne
                    if sprite != 'n':
                        #On ajoute le sprite à la liste de la ligne
                        ligne_niveau.append(sprite)
                #On ajoute la ligne à la liste du niveau
                structure_niveau.append(ligne_niveau)
            #On sauvegarde cette structure
            self.structure = structure_niveau

    def afficher(self, fenetre):
        """Méthode permettant d'afficher le niveau en fonction 
        de la liste de structure renvoyée par generer()"""
        #Chargement des images (seule celle d'arrivée contient de la transparence)
        Rocher = pygame.image.load(image_Rocher).convert()
        Buisson = pygame.image.load(image_Buisson).convert()

        #On parcourt la liste du niveau
        num_ligne = 0
        for ligne in self.structure:
            #On parcourt les listes de lignes
            num_case = 0
            for sprite in ligne:
                #On calcule la position réelle en pixels
                x = (num_case+0.5) * taille_sprite
                y = (num_ligne+1) * taille_sprite
                if sprite == 'R':                  #R = Rocher
                    fenetre.blit(Rocher, (x,y))
                if sprite == 'B':
                    fenetre.blit(Buisson,(x,y))

                num_case += 1
            num_ligne += 1

Advertisement

Answer

I think what you want is str.split():

for ligne in fichier:
    ligne_niveau = []
    #On parcourt les sprites (lettres) contenus dans le fichier
    for sprite in ligne.split(): # note split here
        ligne_niveau.append(sprite) # no need to check for line end
    #On ajoute la ligne à la liste du niveau
    structure_niveau.append(ligne_niveau)

split without any arguments will join all consecutive whitespace (including tabs 't' and newlines 'n') into a single split. For example:

"ta 13 b t22     6en".split() == ['a', '13', 'b', '22', '6e']

Note that the “sprites” don’t have to be the same length, so there’s no need for fill characters like extra 0s or *s. You can also simplify using a list comprehension:

def generer(self):
    with open(self.fichier) as fichier:
        self.structure = [ligne.split() for ligne in fichier]

Alternatively, consider using a comma-separated value format – Python has a whole module (csv) for that:

a,13,b,22,6e
User contributions licensed under: CC BY-SA
6 People found this is helpful
Advertisement