最近我一直在制作游戏,但我遇到了问题。要计算你对敌人的击中,它使用变量剑。
此时玩家可能购买或未购买过剑,因此我收到一条错误消息:“未声明变量”。有没有办法解决尚未声明的变量?
答案 0 :(得分: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块中包含对sword变量的每个引用,并吞下可能引发的NameError:
try:
if sword == 10:
print 'Choppity chop chop chop.'
except NameError:
pass
第一种解决方案(更好)。
答案 1 :(得分:1)
在没有看到更多代码的情况下,我会说通常的方法是“原谅尚未声明的变量”将通过处理NameError
异常的可能性。
try:
# variable sword may or may not exist here..
sword
except NameError:
# handle this
答案 2 :(得分:1)
有几种选择。 wim提供的很好但是如果你的变量实际上是dict中的一个键,那么你可以像这样缩短它:
has_sword = my_items.get('sword', False)
get()
方法中的第二个值是剑键不存在时的默认值。
PRO TIP: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!"
答案 3 :(得分: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!"
答案 4 :(得分:0)
您可以检查变量是否存在于globals或locals dict中,或使用:
try:
a = b
except NameError:
a = b = 1