我目前正在开发一个简短的基于文本的冒险,所以我可以学习如何在Python中使用Classes。作为其中的一部分,我正在尝试创建一个战斗系统,玩家可以选择NPC进行攻击。
目标是玩家可以输入NPC的名称和他们想要使用的武器。然后将调用目标类中的方法,以根据武器的伤害失去健康。
我目前的代码如下:
class npc:
def __init__(self, name, alliance):
self.name = name
self.alliance = alliance
def loseHealth(self, health, dmg):
self.dmg = dmg
self.health = self.health - dmg
def usePotion(self, health, pType):
if pType == "great":
self.health = min(self.health + 50,self.maxHealth)
elif pType == "normal":
self.health = min(self.health + 25,self.maxHealth)
else:
pass
def attack(self, target, weaponDmg):
if target in npcList:
target.loseHealth(self.health, weaponDmg)
class human(npc):
maxHealth = 100
health = 100
def __init__(self, name, alliance):
super().__init__(name, alliance)
class orc(npc):
maxHealth = 200
health = 200
def __init(self, name, alliance):
super().__init__(name, alliance)
weaponDmg = {'sword':10,'axe':20}
alice = human("alice","good")
bob = orc("bob","evil")
npcList = [alice, bob]
target = input("Enter Target:")
weapon = input("Enter weapon:")
for x in range(3):
alice.attack(target,weaponDmg[weapon]) #using alice temporarily until I have a person class sorted
print(target.health)
答案 0 :(得分:0)
您可以使用getattr
在实例上调用方法,这是一个示例:
>>> class Test:
... def my_method(self, arg1, arg2):
... print(arg1, arg2)
...
>>> t = Test()
>>> getattr(t, 'my_method')('foo', 'bar')
foo bar
答案 1 :(得分:0)
简单和pythonic的答案是使用一个由姓名键入的NPC字典,就像你已经用武器做的那样:
npcs = {‘alice’: alice, ‘bob’: bob}
target = input("Enter Target:")
weapon = input("Enter weapon:")
for x in range(3):
alice.attack(npcs[target], weaponDmg[weapon])
print(target.health)
如果你想通过用户提供的名字以及攻击者查找攻击NPC,你可以在那里做同样的事情:
npcs[attacker].attack(npcs[target], weaponDmg[weapon])
如果您真的想在attack
方法中执行此操作,可以继续将target
作为名称(字符串)传递并执行此操作:
if target in npcs:
npcs[target].loseHealth(self.health, weaponDmg)
......但这可能不是一个很好的设计。这意味着你正在共享一个全局变量,你的NPC对象都“知道”了全局字典及其中的所有NPC,这似乎不是他们责任的一部分。
你可以通过理解创建字典来减少重复次数:
npcs = {npc.name: npc for npc in (alice, bob)}
...或者直接在dict中创建它们而不是在你可能永远不会使用的变量中:
npcs = {}
npcs[‘alice’] = human("alice","good")
npcs[‘bob’] = orc("bob","evil")