簡體   English   中英

如何從 class 方法中更新字典?

[英]How can I update a dictionary from within a class method?

我正在嘗試編寫一些基本的類和交互來練習並最終將其變成一個工作游戲(類似於 OGame)。 在我的代碼中,每個玩家都有一些船(我希望它們是類而不是字典,但也不能讓它工作)和他們自己的鍵。 我希望字典通過使用build_ships() function 來更新船舶數量及其類型,這樣做感覺是正確的方法,但它目前不起作用......

免責聲明:總的來說,我在編碼方面還很陌生,但是找不到任何可以很好地擴展的好的解決方案,或者像這樣的東西的最佳結構是什么。

class Player:
    def __init__(self, name, ships=None):
        self.name = name
        if ships is None:
            self.ships = {}
        else:
            self.ships = ships

    def build_ships(self, ship, quantity):
        self.ships[ship] = quantity


small_cruiser = {
"name":'SMALL CRUISER',
"size":5,
"attack":10,
"defense":7,
"speed":30
}

big_cruiser = {
"name":'BIG CRUISER',
"size":7,
"attack":15,
"defense":9,
"speed":25
}

player_1 = Player('TheLegend27')
player_1.build_ships(small_cruiser, 5)

您不能將字典用作另一個字典中的鍵,因為字典是可變的,並且字典鍵必須是可散列的(不可變的)。

在我看來,將self.ships作為船舶列表而不是字典更有意義。 然后您的build_ships方法只需要將 append 運送到該列表。

考慮以下代碼:

class Player:
    def __init__(self, name, ships=None):
        self.name = name
        if ships is None:
            self.ships = []
        else:
            self.ships = ships

    def build_ships(self, ship, quantity):
        for _ in range(quantity):
            s = ship.copy()
            self.ships.append(s)


small_cruiser = {
    "name":'SMALL CRUISER',
    "size":5,
    "attack":10,
    "defense":7,
    "speed":30
}

big_cruiser = {
    "name":'BIG CRUISER',
    "size":7,
    "attack":15,
    "defense":9,
    "speed":25
}

player_1 = Player('TheLegend27')
player_1.build_ships(small_cruiser, 5)

請注意,我們需要添加行s = ship.copy()以創建作為參數傳遞給build_ships的原始字典的副本。 否則,您將一遍又一遍地附加同一個字典,並且對self.ships中的任何字典所做的任何修改都會反映在其他字典上。

字典中的鍵必須是可散列的。 因此,您不能將字典作為第二個字典中的鍵。 一種方法是,如果您知道船只的名稱是唯一的,那么您可以讓玩家 object 只保留名稱和數量。

def build_ships(self, ship, quantity):
        self.ships[ship] = quantity

將由以下人員調用:

player_1.build_ships("SMALL CRUISER", 5)

然后你可以有一個單獨的字典來維護船舶的類型,比如:

ships = {"SMALL CRUISER":{"size":5,
                          "attack":10,
                          "defense":7,
                          "speed":30},
         "BIG CRUISER":{"size":7,
                        "attack":15,
                        "defense":9,
                        "speed":25},
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM