如何正确解析文本文件中的平铺映射?

2024-09-30 06:12:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python和pygame为学校项目制作一个RPG。为了创建少数地图,我选择了一些教程中介绍的Tile映射技术,使用了*.txt文件。在

然而,我不得不把一些精灵(树,房子,…)切成几块。问题是我没有足够的字符来代表他们!在

我还记得可以将几个字符作为一个(例如:将"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

Tags: selfleondestructurenumlales
1条回答
网友
1楼 · 发布于 2024-09-30 06:12:10

我想你想要的是^{}

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')合并为一个拆分。例如:

^{pr2}$

请注意,“sprite”的长度不必相同,因此不需要额外的0s或*s等填充字符

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

或者,考虑使用逗号分隔的值格式-Python有一个whole module (^{})

a,13,b,22,6e

相关问题 更多 >

    热门问题