0

最近我一直在创建一个游戏,但我遇到了一个问题。要计算你对敌人的打击,它使用变量Sword

此时玩家可能购买了也可能没有购买剑,因此我收到一条错误消息:“未声明变量”。有没有办法解决尚未声明的变量?

4

5 回答 5

8

你有两个选择。

首先是确保玩家总是有一个sword变量。设置为None在玩家获得剑之前,当你需要知道玩家是否有剑时,检查变量是否为None

 sword = None

 # do lots of stuff here

 if sword is None:
    print 'Hey, no sword!'
 else:
    print 'Chop, chop, chop!'

如果剑不允许为空字符串或整数值 0,则另一种写法是:

 if sword:
    print 'Chop, chop, chop.'

您的第二个选择是将每个对剑变量的引用包装在 try 块中并吞下可能引发的 NameError :

 try:
    if sword == 10:
        print 'Choppity chop chop chop.'
 except NameError:
    pass

第一个解决方案(好得多)。

于 2012-05-08T01:26:29.297 回答
1

在没有看到更多代码的情况下,我会说“原谅尚未声明的变量”的常用方法是处理NameError异常的可能性。

try: 
  # variable sword may or may not exist here..
  sword
except NameError:
  # handle this
于 2012-05-08T01:23:30.167 回答
1

有几种选择。wim 提供的很好,但是如果您的变量实际上是 dict 中的键,那么您可以像这样缩短它:

has_sword = my_items.get('sword', False)

get()方法中的第二个值是剑键不存在时的默认值。

专业提示: globals() 和 locals() 分别提供对在全局范围和函数中声明的变量的直接访问。这意味着globals().get('sword', False)应该对您全局声明的变量有效。

最后,正如 wim 所建议的那样,您并没有真正以正确的方式解决这个问题。一种更 Pythonic 的方法是使用这样的类:

class Player():
  def __init__(self)
    self.sword = None

player = Player()
if player.sword:
  print "Off with his head!"
于 2012-05-08T01:26:04.863 回答
1

我不确定你的游戏的全部范围。“剑”是玩家角色可以携带的唯一物品,还是它们是开放式的隐含物品栏?(例如,玩家角色有一个麻袋或背包,并且可以在游戏过程中捡起物品。)

如果你想给角色一个物品栏,你可以使用一个简单的列表,或者,如果所有的物品都是独一无二的——即角色一次只能有一把剑,那么一套是合适的。

class Player(object):
    def __init__(self):
        self.inventory = set( )

    @property
    def has_sword(self):
        return ('sword' in self.inventory)

me = Player( )
me.inventory.add('sword')
if me.has_sword:
    print "swish!"
于 2012-05-08T03:17:54.530 回答
0

您可以检查变量是否存在于全局或本地字典中,或使用:

try:
    a = b
except NameError:
    a = b = 1 
于 2012-05-08T01:29:50.743 回答