2013-08-17 106 views
1

我遇到了我的代碼問題,我根本無法弄清楚。詞典沒有正確填充

由於每個代碼以下部分:

Generate_Game_World類創建第二個字典(worldmap)後,HQ位置存儲在

self.worldmap[HQLOCATIONX,HQLOCATIONY]["Region_Type"] = "HQ" 

但是,這樣做後,它似乎填補整個陣列具有「HQ」值,如測試窗口中所示。我簡直無法弄清楚爲什麼會發生這種情況。

import pygame 
from tkinter import * 

test = Tk() 
test.geometry = ("640x480") 

pygame.init() 

WORLDSIZE = 499 
HQLOCATIONX = int(WORLDSIZE/2) 
HQLOCATIONY = int(WORLDSIZE/2) 

class Generate_Game_World(): 

    regionData = {"Region_Type" : "None", 
        "Region_Level" : 0} 

    def __init__(self, mapSize): 
     self.mapSize = mapSize 

    def main (self): 
     # creates 2d map 
     self.worldmap = {(x,y) : self.regionData for x in range(self.mapSize) for y in range (self.mapSize)} 

     # Sets the HQ to worldmap(249,249) 
     self.worldmap[HQLOCATIONX,HQLOCATIONY]["Region_Type"] = "HQ" 

     # checks worldmap(0,0) --> (10,10) for its Region Type 
     for x in range (10): 
      for y in range (10): 
       label = Label (text=self.worldmap[x,y]["Region_Type"]).grid(row = x, column=y) 

class Game (object): 
    def main (self, screen): 
     gameworld = Generate_Game_World(WORLDSIZE)  
     gameworld.main() 

     while 1: 

      for event in pygame.event.get(): 
       if event.type == pygame.QUIT: 
        return 

       if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: 
        return 

      test.mainloop() 
      pygame.display.flip() 

if __name__ == "__main__": 
    screen = pygame.display.set_mode((1024, 768)) 
    Game().main(screen) 

回答

2

所有你的字典值是與一個類屬性regionData引用。

你想創建副本代替:

self.worldmap = {(x,y): self.regionData.copy() for x in range(self.mapSize) for y in range (self.mapSize)} 

它使用dict.copy() method,而不是創建一個淺表副本;這是足夠的,因爲Generate_Game_World.regionData的值僅僅是字符串,並且這些是不可變的,因此可以共享。

您也可以使用字典文字從零開始創建一個新字典;你似乎沒有使用self.regionData其他任何地方,所以內聯是一種可能性:

self.worldmap = {(x,y): {"Region_Type" : "None", "Region_Level" : 0} 
       for x in range(self.mapSize) for y in range (self.mapSize)} 

最後但並非最不重要的,你的意思是使用None單而不是一個字符串"None"也許嗎?

+0

我提供的代碼只是項目較大部分的一個片段,它隔離了給我帶來麻煩的區域。 這些鍵用於在引用它們時顯示拼貼。 None.png,HQ.png等 – Jess

+0

@Jess:對,在這種情況下,你想創建字典的副本。如果您的'regionData'字典包含其他可變值,請改爲使用'copy.deepcopy()'。 –

+0

我已經浪費了2個多小時試圖弄清楚這一點,並且幫助我節省了很多很多時間。謝謝 :) – Jess