如何根据输入获取输入并调用类的实例?

时间:2018-03-26 14:21:28

标签: python class oop inheritance

我目前正在开发一个简短的基于文本的冒险,所以我可以学习如何在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)

2 个答案:

答案 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")