【问题标题】:Getting a list of enemies to battle one at a time一次获得一个要与一个敌人战斗的敌人列表
【发布时间】:2018-05-13 19:29:23
【问题描述】:

我希望有人能够回答我的问题。对于我正在制作的基于文本的视频游戏,我试图在英雄击中我地图上的某个位置时获取与英雄战斗的敌人列表。我创建了一个父类 Character,然后创建了两个子类 Hero 和 Enemy。我有一个敌人名称列表和另一个对应的 curHp 列表。我是 python 新手,正在努力知道将敌人名称 List 和他们的 curHp 列表放在哪里。任何帮助将不胜感激。

class Character (object):

    def __init__(self, name, curHp):
        self.__name = name
        self.__curHp = curHp


    def getName(self):
        return self.__name
    def getCurHp(self):
        return self.__curHp

    def setName(self, newName):
        newName= self.__newName

    def setCurHp(self, newCurHp):
        H = ""
        self.__newCurHp=self.__curHp + 20

class Hero (Character):

    def __init__(self, name, curHp, stun, laser, vsurge):
        super().__init__(name, curHp, stun, laser, vsurge)
        self.__stun=stun
        self.__laser= laser
        self.__vsurge= vsurge


    def getStun(self):
        return self.__stun
    def getLaser(self):
        return self.__laser
    def getVsurge(self):
        return self.__vsurge


    def setStun(self,newStun):
        self.__newStun=self.__newStun
    def setLaser (self,newLaser):
        self.__newLaser= self.__newLaser
    def setVsurge(self, newVsurge):
        self.__newVsurge = self.__vsurge + 25

class Enemy(Character):

    def __init__(self, name, curHp, attack):
        super().__init__(name, curHp, attack)
        self.__attack=attack


    def getAttack(self):
        return self.__attack


    def setAttack (self, newAttack):
        newAttack= self.__newAttack

我尝试将列表放入 def main(): 但我不断收到错误

player=Hero ("Agent Five", 120, 20 ,10 ,25 )
enemy=Enemy (name=["Raptor", "T-Rex", "Enemy Solider", "General", "Dual Sentience", "Empty Robot", "The Sentience", "GOD"],curHp=[40, 100, 25, 60, 75, 45, 130, 200], []  )

 At line:1 char:2
+ [40, 100, 25, 60, 75, 45, 130, 200]cd 'd:\Time Breakers Game\TimeBrea ...
+  ~
Missing type name after '['.
At line:1 char:4
+ [40, 100, 25, 60, 75, 45, 130, 200]cd 'd:\Time Breakers Game\TimeBrea ...
+    ~
Missing argument in parameter list.
    + CategoryInfo          : ParserError: (:) [],         ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MissingTypename

任何提示将不胜感激。谢谢

更新:敌人列表中最后一个空列表最终将是每个敌人的攻击点。

【问题讨论】:

  • 附带说明:您几乎肯定不想要像__hp 这样的双下划线名称。或者像getHp 这样的吸气剂。而你使用它们的事实几乎总是表明教你的人并不真正了解 Python,而是试图教你 Java,所以你应该找到一个更好的资源来学习。 (如果是学校里的老师,你可以做的不多,但如果是书籍或在线教程或视频系列,就另找一个。)
  • 与@abarnert 的回答相同。并且不要向super发送攻击、眩晕、激光等。
  • 另外,你用什么解释器运行这个?这些看起来不像来自 CPython、PyPy、Jython 或 IronPython 的错误。
  • @abarnert 我正在向一位老师学习,他提到我们应该为我们编写的所有内容执行 __hp,但我一定会牢记,有更好的方法可以做到这一点。我正在使用带有 Python 添加的 Visual Studio Code
  • @K.Camp 然后把它当作一个警告,你的老师不知道他在用 Python 做什么,你可能想找到更好的(课外)资源来学习。不幸的是,您必须学习他的方法才能在课堂上取得好成绩,并且将差异保持在头脑中,这会让您的生活更加艰难。在 Python 中,有一个糟糕的老师实际上并不像在集合论或小说写作中那样糟糕,因为至少自学更容易,但仍然很痛苦。

标签: python python-3.x list


【解决方案1】:

要创建敌人列表,您不能使用值列表调用Enemy 构造函数;相反,您必须为敌人调用一次Enemy 构造函数。您可以使用zip 来简化此操作。

此外,您不能将位置参数放在关键字参数之后——要么使用name=…, curHp=…, attack=…,要么只使用…, …, …,而不是name=…, curHp=…, …

最后,我不确定你想让[] 为攻击做什么。也许每个人都为 0?无论你想要什么,你都必须明确地说出来。

所以:

enemy_names = ["Raptor", "T-Rex", "Enemy Solider", "General", "Dual Sentience", "Empty Robot", "The Sentience", "GOD"]
enemy_hps = [40, 100, 25, 60, 75, 45, 130, 200]

enemies = []
for name, hp in zip(enemy_names, enemy_hps):
    enemies.append(Enemy(name, hp, 0)) 

如果你知道什么是列表推导式,你可能会发现最后三行可以重写:

enemies = [Enemy(name, hp, 0) for name, hp in zip(enemy_names, enemy_hps]

或者,如果你有一个攻击列表,比如名字和生命值列表:

enemies = [Enemy(*props) for props in zip(enemy_names, enemy_hps, enemy_attacks)]

【讨论】:

  • 感谢您的帮助。我希望可以再问一个问题:我应该把这个列表放在敌人类还是 def main(): 中?
  • @K.Camp 通常,应该将另一个问题作为一个新问题提出,而不是在答案上提出 cmets。但是这个很简单,所以……我认为把它放在main 中更有意义。敌人名称列表实际上不是Enemy 类型的属性,敌人对象列表也不是。
  • @abarnet 抱歉,我不知道。我是 Stack Overflow 的新手,仍在学习。再次感谢您的所有帮助,我真的很感激。
【解决方案2】:

我会创建一个函数,它会返回一个带有 HP 的字符字典。

你不需要在init

中声明攻击
class Enemy(Character):

    def __init__(self, name, curHp, attack):
        super().__init__(name, curHp)
        self.__attack = attack

    def enemy_dict(self, names, hps):
        """ Takes in a list of names and a list of HP and returns a dictionary of pairs"""
        return dict(zip(names, hps))

让敌人一次一个地攻击玩家。在字典上调用 for 循环,在这种情况下,我使用 random.choice 来选择一个随机数量,然后将其作为对玩家的伤害

import random

print(player.getName(), player.getCurHp())

for k, v in enemy.enemy_dict(enemy.getName(), enemy.getCurHp()).items():
    att_damage = random.choice(range(0, v, 5))
    if att_damage == 0:
        print('No Damage Taken')
    else:
        new_hp = player.getCurHp() - att_damage
        player.setCurHp(new_hp)
        print(player.getName(), "Took Damage of ", new_hp, "From Enemy", k)\

print(player.getName(), player.getCurHp())

您还需要在类模块中以相反的方式更改设置器。

它应该是

def setName(self, newName):
    self.__newName = newName 

def setCurHp(self, newCurHp):
    H = ""
    self.__curHp = newCurHp

【讨论】:

  • 为什么要使用Character.__init__ 而不是super?这不是惯用的(它向读者暗示这是旧式类的旧 Python 2.x 代码,这是不正确的)。另外,为什么要使用实例方法来创建敌人的字典?这意味着在你已经创造了一个敌人之前,你不能创造任何敌人。另外,“你还没有为角色声明一个类型,所以传入一个列表就可以了”……这是什么意思?您似乎是在说 OP 代码中实际损坏的部分,即他们遇到错误并寻求帮助的部分,可以吗?
  • 另外,为什么[i for i in range(v)] 而不仅仅是range(v)。为什么还要创建一个范围来调用choice 而不仅仅是使用randrange
猜你喜欢
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-09
  • 1970-01-01
  • 2019-11-29
  • 1970-01-01
  • 2020-11-02
相关资源
最近更新 更多