我希望有人能够回答我的问题。对于基于文本的视频游戏,我正在尝试获取一个敌人列表,以便在英雄击中我的地图上的某个位置时与英雄战斗。我创建了一个父类角色,然后是两个孩子类Hero和Enemy。我有一个敌人名单列表和另一个相应的curHp列表。我是python的新手,我正在努力知道在哪里放置敌人名单和他们的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
任何提示都会非常感激。谢谢
更新:敌人列表中的最后一个空列表最终将成为每个敌人的攻击点。
答案 0 :(得分:4)
要创建敌人列表,您无法使用值列表调用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]
或者,如果您有一系列攻击列表,例如名称列表和hp:
enemies = [Enemy(*props) for props in zip(enemy_names, enemy_hps, enemy_attacks)]
答案 1 :(得分:-1)
我会创建一个函数,返回带有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())
您还需要在类模块中以相反的方式更改setter。
应该阅读
def setName(self, newName):
self.__newName = newName
def setCurHp(self, newCurHp):
H = ""
self.__curHp = newCurHp