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 0
s 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