如何正确解析文本文件中的平铺地图?

时间:2014-05-03 13:27:50

标签: python maps pygame tile

我正在使用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

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