簡體   English   中英

我的python類有問題

[英]I have a issue with python classes

好的,所以我正在做一個基於文本的RPG游戲,但是我遇到了python類的問題,我不確定如何解決我嘗試了查找此問題,但是找不到與該問題有關的任何帖子也許我在找錯東西? 我不知道。 無論如何,這是我的問題,我在名為subfiles的文件夾中的名為unit.py的文件中擁有此類

class Enemy(object):
    def __init__(self,name,hp,atk):
        self.name = name
        self.hp = hp
        self.atk = atk

在我的主文件中,我有這個

from subfiles.unit import *
wolf = Enemy("Wolf", 100, 10)
cow = Enemy("Cow", 50, 0)
NMElist = [wolf,cow]
def gennme():
    global NME
    ##Choose a enemy to fight
    NME = random.choice(NMElist)
def attack():
    NME.hp -= 10
    print NME.hp
attack()

當我運行攻擊定義時,它會像應有的那樣從wolf.hp中減去,但這並不是我想要達到的目標,因為下次與狼進行戰斗時,它已經死了,我怎么能在其中wolf = Enemy(“ Wolf”,100,10)只是設定的默認值,在戰斗結束並且狼被殺死之后,下次我與狼戰斗時,它將從默認值加載。 我希望我在這里有道理,我敢肯定有一種簡單的方法可以做到這一點,這只是在逃避我的理解,也許我對類的工作方式的理解是有缺陷的? 無論如何,我期待着您的回復和建議,哦,這同樣適用於牛和狼。

是的,也許是一種做法,那就是在殺死一頭狼后再制造一頭新狼。 但是您沒有活着的旗幟,那么它還活着嗎?


如果hp為0,則可能使敵方對hp無效。這種方式可以讓您檢查狼是否被殺死。 一種方法是:

class Enemy(object):
    def __init__(self,name,hp,atk):
        self.name = name
        self._hp = hp
        self.atk = atk
        self._deafult_hp = hp

    @property
    def hp(self):
        return self._hp

    @hp.setter
    def hp(self, value):
        if not self._hp:
            self._hp = self._deafult_hp
        self._hp = value

現在,在戰斗中,您可以檢查狼的hp是否為0,在下一次戰斗中,狼的hp將默認為100 hp或您選擇的任何值。 ^^

每次遇到新的敵人時,您可以創建一個單獨的Enemy實例。 您可以通過將實際實例包裝在可調用對象中來推遲實際實例的創建:

NMElist = [lambda : Enemy("Wolf", 100, 10),
           lambda : Enemy("Cow", 50, 0)]

這是一個敵人工廠的簡單例子。 要獲得新的隨機敵人,您需要調用返回的函數以生成新的牛或狼:

NME = random.choice(NMElist)()

請注意最后的括號() ,該括號執行random.choice返回的隨機敵人工廠以創建實際對象。 您可以添加的另一層是使用super Python內置函數,通過繼承來創建敵人的WolfCow子類,以初始化適當的值:

class Enemy(object):
   def __init__(self,name,hp,atk):
       self.name = name
       self.hp = hp
       self.atk = atk

class Wolf(Enemy):
    def __init__(self):
        super(Wolf, self).__init__("Wolf", 100, 10)

class Cow(Enemy):
    def __init__(self):
        super(Cow, self).__init__("Cow", 50, 0)

然后NMElist可以包含為遇到的每個敵人實例化的類

NMElist = [Wolf,Cow]
def gennme():
    global NME
    ##Choose a enemy to fight
    NME = random.choice(NMElist)()

您的隨機函數將在NMElist中包含的現有uniq對象中進行選擇(具有其先前的狀態)

加強牛和牛的基因組功能可以解決此問題。

from subfiles.unit import *

def gennme():
    global NME
    ##Choose a enemy to fight
    wolf = Enemy("Wolf", 100, 10)
    cow = Enemy("Cow", 50, 0)
    nme_list = [wolf,cow]
    NME = random.choice(nme_list)
def attack():
    NME.hp -= 10
    print NME.hp
attack()

這遠非最佳的實現方式,但可以使您更好地理解自己的錯誤。

我喜歡亞瑟的答案,但是另一種做同一件事的方法是:

NMElist = [("Wolf", 100, 10),("Cow", 50, 0)]

然后,在您的gennme()函數中,隨機選擇一個,並將其中的值傳遞給Enemy類:

enemySelection = random.choice(NMElist)
NME = Enemy(*enemySelection)

基本上,如果要將Enemy()類的實現與與Enemy屬性關聯的值隔離開來,則此方法會很好。 使用* ,可以將列表項的值一起作為參數傳遞給Enemy類。 通過在這一點上實例化敵人,您將確保在再次調用gennme()函數時生成另一個新gennme()

人們對SO的回答很快。 我花了一段時間才解決這個問題:)

暫無
暫無

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

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