1

我想我的问题中的所有术语都是正确的……但我不确定。基本上我想做的是在文本游戏中获取我的库存和设备设置的小细节。

我想要做的是拥有一把武器,让我们带着一把剑去吧,我希望它能够改变角色本身的某些方面。让角色的 hp 增加 ...5,在这种情况下我会拥有的是,(不要介意马虎的工作!)

global basehp
basehp = 10
global armorhp
armorhp = 0
global skillhp
skillhp = 0
global hpmod
hpmod = (skillhp + armorhp)
global righthand
righthand = 0

所以用 hp 设置示例这是我在程序中实际拥有的,现在我想做的是更改 armourhp 以匹配盔甲将其更改为的内容,比如我的剑可以为我的 hp 增加 5 对吗?我现在正在使用的东西是行不通的,起初我以为只是装备它并为装甲加5,然后我开始考虑取消装备它...效果会一样...我会告诉你什么我的意思是

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?好,装备,耶 10 !

如果我有任何意义,我会感到震惊......但如果有人能弄清楚我的意思并给我一些建议,那就太好了!

编辑:

阅读评论中留下的内容,(感谢那个 Eevee!)我想我开始对课程有所了解......非常少。

那么新的问题,然后我会为主角上课吗,比如,

class character(object):

然后在初始化中添加

def __init__(self)

那么我会定义库存吗,

def __init__(self)

def inventory

还是我会这样做,

def __init__(self, inventory)

抱歉,如果我问了太多问题,只是想弄清楚它,我注意到这里的人足够好,至少可以看看像我这样的想成为程序员的问题:D

另一个编辑!!!!

再次感谢一吨伊布!这是有道理的,尽管通读它,我仍然对如何将它添加到我的代码以及我需要为一些不同的项目更改什么感到有些困惑。

尝试解释一些,当我说不同的项目时,你给了我

class Sword(object):
    def visit_health_bonus(self, character):
        return 5

如果我想要一把能做不同事情的剑,我会创建一个不同名称的新类,但基本上是一样的吗?

class Sword2(object):
    def visit_strength_bonus(self, character):
        return 2

那会给我一把剑,可以让我的力量增加2,对吧?

现在谈谈我的另一个问题,当我尝试使用它时,我真正需要什么才能让它正常工作,我看到很多我认为如果没有其他一些东西就不会运行的东西

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)
4

3 回答 3

1

听起来你错过了面向对象编程的一些很棒的实用程序,类似于 Marcin 所说的你可能会像这样制作一系列类:

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确保正确增加和减少hp的方法Hero,同时跟踪游戏的逻辑,即你不能一只手有两把武器,如果你没有武器就不能取消装备。装备等。这有助于消除你提到的那些丑陋的 100 行代码。

祝你好运!希望这可以帮助

于 2013-09-09T22:24:44.847 回答
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)

现在您可以在每次需要时计算总生命值,因此您不必担心在玩家升级时更新它。您也不必担心在某些设备未配备时进行任何额外的簿记:一旦它从设备列表中消失,它就会停止贡献。

这仍然有点不灵活,因为它不容易支持例如在与龙战斗时使您的攻击力加倍的剑。解决这个问题的最通用方法涉及大量纠缠和额外的对象,并弄清楚首先需要发生什么效果,但我还没有让它令我满意。希望上述方法是一个足够好的起点。:)

解决这个问题的最灵活的方法是让“装备武器攻击”的动作本身成为一个对象,让装备、玩家、目标等都通过增加属性来对攻击做出反应。但是你有一些需要解决的优先级问题,所以我们不要这样做。

于 2013-09-09T21:59:42.437 回答
0

有几件事:

  1. 您有 5 个全局变量。这些应该被移动到一个类中,并且您的函数成为该类的方法。

  2. 像这样工作的通常方法是让剑支持特定的接口,定义它所做的修改,字符类可以读取这些修改。或者,使用访客模式,并让角色将自己传递给装备/取消装备的剑法。

于 2013-09-09T21:35:18.700 回答