1

自分のコードで、単純に理解できない問題が発生しました。

コードの以下のセクションに従って:

クラスで2 番目の辞書を作成した後(worldmap)Generate_Game_WorldHQ の場所は次の場所に保存されます。

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)
4

1 に答える 1

2

すべての辞書値は、1 つのclass-attributeへの参照ですregionData

代わりにコピーを作成します。

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

これはdict.copy()メソッドを使用して、代わりに浅いコピーを作成します。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"

于 2013-08-17T21:59:57.570 に答える