【问题标题】:How to change what object information is called for in a function如何更改函数中调用的对象信息
【发布时间】:2016-01-12 04:25:09
【问题描述】:

我正在制作基于文本的 RPG。我面临的问题是我想要单独的敌人值,即地精、兽人等,但我不知道如何允许函数从特定的类对象中获取特定情况下的信息。我的措辞可能很糟糕;我很抱歉。举个例子:如果我有一个单独的战斗函数,每次用户进入一个有敌人的房间时都会调用它,我该如何区分该函数应该根据房间调用哪些敌人信息。

我可以使用一个敌人变量吗?比如说,当一个特定的房间函数被调用,并且房间里有一个敌人时,一个名为敌人的全局变量可能会改变,并以某种方式允许战斗函数根据变量信息检索信息。换句话说,如果玩家进入一个有妖精的房间,该函数会将全局变量更改为“妖精”。 python有没有办法查看那个变量并说'哦!他要为地精对象加载数据!”?

这是我的代码的基本版本:

enemy = ' '
class Enemy(object):
    def __init__(self, name, health, damage):
        self.name = name
        self.health = health
        self.damage = damage

def room():
    print("You walk into a room and see a goblin.  You enter combat. ")
    enemy = goblin.name
    combat()

def combat():
    dieroll = random.randint(1, 20)
    attack = raw_input("Press [A] to attack.: ").lower()
    while attack:
        if attack == 'a':

            #Here is where I want the function to retrieve information from an
            #enemy object, to determine its name, health, and damage.  

            print("You did", dieroll, "damage to" #enemy name)
            #lower enemy health



goblin = enemy('goblin', 100, 15)            

我希望其中一些有意义,即使代码有点草率,即使我的解决方案想法可能很愚蠢。

感谢您的帮助。

【问题讨论】:

  • 通常你有一个基础的敌人类,它提供所有的函数和子类,这些函数和子类继承了具有该类型特殊属性的基础。如果你想要更多的数据驱动,你有一个类和一个定义类型属性的数据结构。这可能是一个字典。

标签: python python-2.7


【解决方案1】:

不要定义一堆函数并在前一个函数的末尾调用每个函数,而是使用函数来构建代码。你现在可以硬编码一些东西,但最终你会想要某种循环来推动游戏直到结束。

函数应该尽可能少地了解它们周围的环境 - 通常,您会将外部数据传递到函数中,进行某种计算并返回值。由于room() 依赖于goblin 的创建,因此如果您决定创建不同类型的敌人,或者稍后再创建敌人,或者只是有一个空房间,那么该功能将会中断。相反,传入任何敌人和对象以供该函数使用。

combat() 在这里会更有意义,如果它接受战斗人员的参数,修改它们,然后将一些结果返回给调用函数。这是一个例子:

class Enemy(object):
    def __init__(self, name, health, damage):
        self.name = name
        self.health = health
        self.damage = damage

def room(player, enemy=None):
    print "You walk into a room...",
    if enemy:
        print " and see a {}. You enter combat.".format(enemy.name)
        if combat(enemy, player):
            print 'You gain 3 experience.'
            player.xp += 3 # just for example
    else:
        print "there's nothing here."

def combat(enemy, player):
    attack = raw_input("Press [A] to attack.: ").lower()
    while attack and player.health:
        if attack == 'a':
            dieroll = random.randint(1, 20)
            player.health = max(player.health-dieroll, 0)
            print enemy.name, 'did', dieroll, 'damage to you!'
            dieroll = random.randint(1, 20)
            enemy.health -= dieroll
            print "You did", dieroll, "damage to", enemy.name)
    return player.health # just for example

player = Player('jim', 90, 18) # maybe make a Player class
goblin = enemy('goblin', 100, 15)
room(player, goblin)

还请注意,我已将 print 语句更正为实际上是 Python 2 样式的 print 语句。除非您要导入 Python 3 print() 函数,否则 print("You did", dieroll, "damage to" #enemy name) 之类的内容将打印 tuple,从而产生如下内容:

('You did', 14, 'damage to', 'goblin')

【讨论】:

  • 嘿!谢谢回复。这是很久以前我刚接触 Python 时的一个项目,所以我希望完成它。 Python 3 的东西是偶然出现的。我最初学习 Python 作为 3.x 变体,但我最近将一台旧笔记本电脑设置为 Ubuntu 装备,其中安装了 Python 2.7,所以我有点搞混了——我还在过渡哈哈。我不知道为什么我没有想到在战斗功能中添加一个参数。这是基本知识,您可以在调用函数时定义函数的参数。感谢您的帮助,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-31
  • 2018-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多