2012-05-08 4 views
0

Недавно я создавал игру, но у меня проблема. Чтобы вычислить, что вы нанесли противнику, он использует переменную меч.Как оправдать необъявленную переменную в Python?

В этот момент игрок может купить или не купить меч, поэтому я получаю сообщение об ошибке: «variable not declaration». Есть ли способ обойти переменную, которая еще не была объявлена?

+2

Можем ли мы увидеть пример кода, возможно? – kevin628

+1

Или точное сообщение об ошибке? –

+2

Лучший способ - убедиться, что вы инициализируете переменные, прежде чем пытаться их использовать. –

ответ

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.' 

Ваш второй вариант, чтобы обернуть каждую ссылку на переменную меча в Ьгу блок и проглотить NameError, который может быть поднят:

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

Первое решение (много) лучше.

+1

'если меч = 10, то:' ??? – wim

+0

Если вы имеете в виду недостающий знак second =, я исправил его. Если вы спрашиваете, почему меч сравнивается с целым значением, это просто пример. Такие игры обычно присваивают оружию оружие, которое может быть просто значением, назначенным мечу, или, если меч - более богатый объект, можно взглянуть на «меч-оскорбление» или что-то подобное. –

+0

также, 'then' слово не python – wim

1

Не видя больше своего кода, я бы сказал, что обычный способ «извинить переменную, которая еще не была объявлена», была бы связана с возможностью исключения NameError.

try: 
    # variable sword may or may not exist here.. 
    sword 
except NameError: 
    # handle this 
1

Существует несколько вариантов. Что Wim предложил это хорошо, но если ваша переменная на самом деле является ключевым в Словаре, то вы можете сократить его следующим образом:

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

Второе значение в методе get() значение по умолчанию, когда ключ меч Безразлично» t существует.

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!" 
0

Вы можете проверить, если переменные существуют в ваших глобал или местных Сыроватское, или использование:

try: 
    a = b 
except NameError: 
    a = b = 1 
0

Я не уверен в полной мере вашей игры. Является ли «меч» единственным предметом, который может иметь персонаж игрока, или является ли им подразумеваемый запас, который открыт? (например, персонаж игрока имеет мешок или рюкзак и может забрать предметы во время игры.)

Если вы хотите дать персонажу инвентарь, вы можете использовать простой список или, если все предметы уникальны, т.е. у персонажа может быть только один меч за раз, тогда набор будет уместным.

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!" 
Смежные вопросы