2015-06-30 46 views
1

我試圖生成一個大的瓷磚地圖,然後將顯示在屏幕上。地圖應該是隨機的,目前只包含兩種類型的貼圖。在Python中用於平面貼圖for循環的問題

但是,現在發生的情況是Tile Map的每一行都會被高度圖中的第一行覆蓋,以便我的地圖在顯示時顯示類似tile的直線列。

我相信這是由於我寫了我的循環,它遍歷整個高度圖,甚至在達到第二個貼圖列表之前。雖然由於我的嘗試包含了一些隨機元素,所以應該至少有一些噪聲引入到地圖中,但似乎沒有任何元素。

這裏是一個鏈接,顯示當我運行我的代碼時顯示的內容。

import pygame, random 



class Map(object): 

    MAPWIDTH = 64 
    MAPHEIGHT = 48 
    HEIGHTS = [0, 1, 2, 3, 4, 5, 6, 7, 8] 

    def __init__(self): 
     self.heightmap = [[random.choice(self.HEIGHTS) for w in range(self.MAPWIDTH)] for h in range(self.MAPHEIGHT)] 
     self.Tiles = [['' for w in range(self.MAPWIDTH)] for h in range(self.MAPHEIGHT)] 
     for rows in self.Tiles: 
      for row in self.heightmap: 
       i = 0 

       for height in row: 
         # 100% water block 
         if height == 0: 
          rows[i] = 'WATER' 
         # 70% water block 
         if height == range(1, 3): 
          if random.randint(0, 9) == range(0, 6): 
           rows[i] = 'WATER' 
          else: 
           rows[i] = 'GRASS' 
         # 50% water block 
         if height == 4: 
          if random.random() == 0: 
           rows[i] = 'WATER' 
          else: 
           rows[i] = 'GRASS' 
         # 80% grass block 
         if height == range(5, 7): 
          if random.randint(0, 9) == range(0, 6): 
           rows[i] = 'GRASS' 
          else: 
           rows[i] = 'WATER' 
         # 100% grass block 
         if height == 8: 
          rows[i] = 'GRASS' 
         i += 1 

http://i.stack.imgur.com/zboQK.png

回答

0

你寫了很多像行:

if height == range(1, 3): 

但是這不符合你的想法。

range(1, 3)返回列表[1, 2](或產生12如果你使用python3可迭代),這是永遠不會等於一個整數。


你可能想使用一種模式,如:

if height == 1 or height == 2 

if 1 <= height <= 2: 

if height in range(1, 2): 

Nonethe少,你可以通過創建一個返回草磚的一個給定的高度的機會一個輔助函數簡化代碼:

def chance_of_grass(height): 
    if height == 0: return 0 
    elif height <= 3: return 30 
    elif height <= 4: return 50 
    elif height <= 7: return 80 

    return 100 

,並呼籲在你的循環:

def __init__(self): 
    self.heightmap = [[random.choice(self.HEIGHTS) for w in range(self.MAPWIDTH)] for h in range(self.MAPHEIGHT)] 
    self.Tiles = [['' for w in range(self.MAPWIDTH)] for h in range(self.MAPHEIGHT)] 

    r_i = 0 # index of row 
    for h_row in self.heightmap: 
     c_i = 0 # index of column 
     for height in row: 
      is_grass = change_of_grass(height) >= random.randint(1, 100) 
      self.Tiles[r_i][c_i] = 'GRASS' if is_grass else 'WATER' 
      c_i += 1 
     r_i += 1 
+0

太感謝你了,讓我知道我錯在哪裏,然後無論如何給我一個更有效的解決方案!我遇到的一個後續問題是chance_of_grass是否是Python代碼的首選樣式? 也就是說,在編寫python方法時,我應該使用下劃線還是camelcase(chanceOfGrass)? – PKJamoo

+0

@PKJamoo在python中,你通常使用下劃線作爲函數。從python樣式指南:*函數名稱應該是小寫字母,必要時用下劃線分隔以提高可讀性。 – sloth

0
self.heightmap = [[random.choice(self.HEIGHTS) for w in range(self.MAPWIDTH)] for h in range(self.MAPHEIGHT)] 
self.Tiles = [['' for w in range(self.MAPWIDTH)] for h in range(self.MAPHEIGHT)] 

我不完全相信你正在試圖做的與^但嘗試這樣的:

self.heightmap=[] 
self.Tiles=[] 
q=[] 
for w in range(self.MAPWIDTH): 
    for h in range(self.MAPHEIGHT): q.append(random.choice(self.HEIGHTS)) 
    self.heightmap.append(q) 
    q=[] 
for w in range(self.MAPWIDTH): 
    for h in range(self.MAPHEIGHT): q.append('') 
    self.Tiles.append(q) 
    q=[] 
for rows in self.Tiles: 
    for row in self.heightmap: 
     i = 0 
     for height in row: 
       rows.pop(i) 
       # 100% water block 
       if height == 0: 
        rows.insert(i,'WATER') 
       # 70% water block 
       if height in range(1, 3): 
        if random.randint(0, 9) in range(0, 6): 
         rows.insert(i,'WATER') 
        else: 
         rows.insert(i,'GRASS') 
       # 50% water block 
       if height == 4: 
        if random.random() > 0.5: 
         rows.insert(i,'WATER') 
        else: 
         rows.insert(i,'GRASS') 
       # 80% grass block 
       if height in range(5, 7): 
        if random.randint(0, 9) in range(0, 6): 
         rows.insert(i,'GRASS') 
        else: 
         rows.insert(i,'WATER') 
       # 100% grass block 
       if height == 8: 
        rows.insert(i,'GRASS') 
       i += 1