我想我的所有条款都在我的问题中......但我不确定。基本上我要做的是在文本游戏中获取我的库存和设备的小细节。
我想要做的就是拥有一把武器,让我们用剑,我希望它能改变角色本身的某些方面。让我们用角色的hp增加... ... 5,在这种情况下我会有,(不介意草率的工作!)
global basehp
basehp = 10
global armorhp
armorhp = 0
global skillhp
skillhp = 0
global hpmod
hpmod = (skillhp + armorhp)
global righthand
righthand = 0
所以用hp设置示例这就是我在程序中实际拥有的内容,现在我要做的就是更改armorhp以匹配盔甲会改变它的内容,说我有我的剑为我的hp加5 ?我现在正在使用的只是不工作,起初我想只是装备并加上5来armorhp,然后我开始考虑取消它...效果会一样......我会告诉你什么我的意思是
def hpsword:
armorhp = (armorhp + 5)
def prompt():
x = raw_input("Type command>>")
if x == 'equip':
print "equip what?"
print inventory
y = raw_input(">>>>")
if y == 'sword':
if 'hpsword' in inventory:
global righthand
righthand = 1
inventory.remove ('hpsword')
equipmentlist.append ('hpsword')
现在从这里你会注意到我留下了一些东西,比如我的清单,我已经达到了这个但是这里我可以真正解释我的意思,我想要使用这样的每个项目,但是我无法弄清楚...我很困惑,我知道,我有很多想法,但我想做一些像....
def this sword():
this sword does this thing!
然后当它被装备时添加它所做的效果,例如+5生命值,然后删除它并使用它生效,而不必使用一堆语句来添加100行代码,但是添加此效果但是然后,当你不想再使用它时,将右手重置为0然后如果是这个数字,那么在你将它改为数字2并再增加10之前,需要将其与之相隔很多。
我也试图避免装备剑,获得5点生命值,不等,仍然是5点?好,装备,YAY 10 !!!
如果我有任何意义,我会感到震惊......但如果有人能弄清楚我的意思并给我一些指针,那就太棒了!
编辑:
阅读评论中留下的内容,(感谢Eevee!)我想我开始认为课程有点......很少。
然后,新问题,我会为主角创建一个类,比如,
class character(object):
然后添加 init
def __init__(self)
然后我会定义库存,
def __init__(self)
def inventory
或者我会这样做,
def __init__(self, inventory)
对不起,如果我问了太多问题,只是想弄明白,我注意到这里的人都很好,至少可以看看像我这样的想要程序员的问题:D
另一个编辑!!!!
再次感谢Eevee!这是有道理的,虽然阅读它我仍然有点困惑,我将如何将它添加到我的代码,然后我需要改变一些不同的项目。
尝试解释一些,当我说不同的项目时,你给了我
class Sword(object):
def visit_health_bonus(self, character):
return 5
如果我想要一把不同的剑,我会创建一个具有不同名称的新类,但基本上是相同的东西?
class Sword2(object):
def visit_strength_bonus(self, character):
return 2
这会给我一把能增加2点力量的剑吗?
现在谈到我的另一个问题,当我尝试使用它时,我真的需要让它正常工作,我看到很多我不认为没有其他位的东西< / p>
class Sword(object):
def visit_health_bonus(self, character):
return 5
# Then, every turn, recalculate health:
health = player.base_health
for equipment in player.equipment: //would i need another class here? (player)
# Pretend this lists everything the player has equipped; you might
# have to check each hand manually
health += equipment.visit_health_bonus(player) //also going to think a class (equipment)
答案 0 :(得分:1)
我假设你熟悉物体。如果没有,你应该继续阅读它们(LPTHW真的很好),因为它们是Python的核心。如果是这样,你应该使用Player对象而不是半打全局变量。
真正简单的方法是让剑成为装备和装备时的东西:
class Sword(object):
health_bonus = 5
def on_equip(self, character):
character.health += self.health_bonus
def on_unequip(self, character):
character.health -= self.health_bonus
然后你在玩家装备剑时调用on_equip
,当玩家装备剑时调用on_unequip
。其他武器可能有类似的事件挂钩,可能是不同的统计数据。
这一切都很好,但有关它的一些事情让我感到困惑:每当玩家丢失一个项目时你必须记住调用on_unequip
,并且可能有不止一种方式发生。你还必须分别跟踪玩家的“基础”健康状况,如果它发生变化,更新“计算”的健康状况需要无需重新装备并重新装备武器,这没有多大意义。
所以让我们尝试别的东西。 “访客模式”Marcin指的是(大致)循环遍历更大整体的所有部分并在它们上调用相同的方法。在这种情况下,你想要询问所有玩家的设备,它会给予多少额外的健康。
class Sword(object):
def visit_health_bonus(self, character):
return 5
# Then, every turn, recalculate health:
health = player.base_health
for equipment in player.equipment:
# Pretend this lists everything the player has equipped; you might
# have to check each hand manually
health += equipment.visit_health_bonus(player)
现在您每次需要时计算总生命值,因此您不必担心在玩家升级时更新它。当一些东西没有装备时,你也不必担心做任何额外的簿记:一旦它从设备列表中消失,它就会停止贡献。
这仍然有点不灵活,因为它不容易支持,例如在与龙战斗时使你的攻击力加倍的剑。解决这个问题的最常见方法涉及大量纠结和额外的对象,并弄清楚首先需要发生什么样的效果,而且我还没有让它让我满意。希望上述方法是一个很好的起点。 :)
解决这个问题最灵活的方法是让“装备武器攻击”本身成为一个物体并拥有装备,玩家,目标等等都会通过增加统计数据来对攻击作出反应。但是,你有优先权的问题,真的很难解决,所以我们不要这样做。
答案 1 :(得分:1)
class Weapon:
def __init__(self, name, armor_hp_bonus = 0, skill_hp_bonus = 0):
self.skill_hp_bonus = skill_hp_bonus
self.armor_hp_bonus = armor_hp_bonus
self.__name__ = name
class Hero:
def __init__(self):
self.basehp = 10
self.armorhp = 0
self.skillhp = 0
self.righthand = None
self.inventory = []
def choose_weapon(self):
while True:
for idx, item in enumerate(self.inventory):
print '{i}: {weapon}'.format(i=idx, weapon=item.__name__)
choice = raw_input("Pick your weapon: ")
try:
self.equip(self.inventory.pop(int(choice)))
return
except IndexError:
print "Invalid choice"
continue
def equip(self, weapon):
if self.righthand:
print "Weapon already equipped to right hand!"
return
else:
self.righthand = weapon
self.armorhp += weapon.armor_hp_bonus
self.skillhp += weapon.skill_hp_bonus
def unequip(self):
if not self.righthand:
print "No weapon to unequip!"
return
self.skillhp -= self.righthand.skill_hp_bonus
self.armorhp -= self.righthand.armor_hp_bonus
self.inventory.append(self.righthand)
self.righthand = None
def acquire_weapon(self, weapon):
self.inventory.append(weapon)
def calc_effective_hp(self):
return self.basehp + self.skillhp + self.armorhp
通过课程,您可以保留在一个地方无法跟踪的所有变量。一个武器的技能加值永远不会与另一种武器的技能加成相混淆,因为存储该信息的变量包含在对象中。一个你正确设置你的类,你的代码的其余部分更短更干净,因为你可以调用一个方法,并确保一切都正确完成:
sword_of_1000_truths = Weapon('sword_of_1000_truths', skill_hp_bonus = 1337)
gandalf = Hero()
gandalf.acquire_weapon(sword_of_1000_truths)
gandalf.choose_weapon()
>> 0 sword_of_1000_truths
>> Pick your weapon: 0
print gandalf.calc_effective_hp()
>> 1347
gandalf.unequip()
print gandalf.calc_effective_hp()
>> 10
equip
和unequip
之类的方法确保正确地递增和递减Hero
的hp,同时跟踪游戏的逻辑,即你不能有两个一方面是武器,如果你没有配备武器就不能装备武器。这有助于消除你提到的那些丑陋的100行代码。
答案 2 :(得分:0)
有几件事:
您有5个全局变量。这些应该移到一个类中,你的函数成为该类的一个方法。
通常的工作方式是剑支持特定的接口,定义它所做的修改,字符类可以读取。或者,使用访客模式,让角色在装备/解除装备时将其自身传递给剑的方法。