[英]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內置函數,通過繼承來創建敵人的Wolf
和Cow
子類,以初始化適當的值:
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.