2014-05-03 72 views
1

我正在爲一個學校項目製作一個使用Python的RPG和pygame。爲了創建少量地圖,我選擇了我在一些教程中看到的Tile Mapping技術,使用*.txt文件。如何正確解析文本文件中的平鋪地圖?

但是,我必須將一些精靈(樹木,房屋......)切成幾塊。問題是我沒有足夠的人物來代表他們!

我還記得,它可能需要幾個字符作爲一個(例如:採取"100"爲一體的不是一個"1"和兩個"0" S)和/或把字符之間空格的文件中(如"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

所以目前你的文件看起來像'1a13b'你'd喜歡它是'1 a 1 3 b'而不是,以支持例如'1 a 1 3 b 22 a6'? – jonrsharpe

+0

就是這樣。我正在考慮使用一個不會得到幫助的角色(例如:1 ** a ** 1 ** 3 ** b ** 22 * a6 *),但這個空間仍然是個問題。 – user3599170

回答

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'] 

注意「精靈」不必須是相同的長度,所以沒有必要填充字符,例如額外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