我正在使用Python和pygame
为学校项目制作RPG。为了创建少量地图,我选择了我在一些教程中看到的使用*.txt
文件的Tile Mapping技术。
然而,我必须将一些精灵(树木,房屋......)切成几块。问题是我用尽了所有人物代表他们!
我还记得,可以将多个字符合为一个(例如:将"100"
作为一个而不是一个"1"
和两个"0"
)和/或放置空格在文件中的字符之间(例如"170 0 2 5 12 48"
,它被读作六个精灵)。
但我真的不知道如何调整我的程序以这种方式。我很确定我需要修改文件的读取方式,但是如何?
这是阅读功能:
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
答案 0 :(得分:0)
我认为你想要的是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
会将所有连续的空格(包括标签'\t'
和换行符'\n'
)加入到单个拆分中。例如:
"\ta 13 b \t22 6e\n".split() == ['a', '13', 'b', '22', '6e']
请注意" sprites"不必具有相同的长度,因此不需要填充字符,例如额外0
或*
s。您还可以使用list comprehension简化:
def generer(self):
with open(self.fichier) as fichier:
self.structure = [ligne.split() for ligne in fichier]
或者,考虑使用逗号分隔值格式 - Python有whole module (csv
):
a,13,b,22,6e