Логика или оператор не ведет себя как ожидалось

def Forest(Health,Hunger):
    print'You wake up in the middle of the forest'
    Inventory = 'Inventory: '
    Squirrel =  'Squirrel'
    while True:
        Choice1 = raw_input('You...\n')
        if Choice1 == 'Life' or 'life':
            print('Health: '+str(Health))
            print('Hunger: '+str(Hunger))
        elif Choice1 == 'Look' or 'look':
            print 'You see many trees, and what looks like an edible dead Squirrel, \na waterfall to the north and a village to the south.'
        elif Choice1 == 'Pickup' or 'pickup':
            p1 = raw_input('Pickup what?\n')
            if p1 == Squirrel:
                if Inventory == 'Inventory: ':
                    print'You picked up a Squirrel!'
                    Inventory = Inventory + Squirrel + ', '
                elif Inventory == 'Inventory: Squirrel, ':
                        print'You already picked that up!'
            else:
                print"You can't find a "+str(p1)+"."
        elif Choice1 == 'Inventory' or 'inventory':
            print Inventory

Я пытаюсь сделать так, чтобы, когда там говорилось: "Ты...", ты можешь напечатать Life, Pickup, Look или Inventory У меня есть намного больше кода в этой программе, я просто показываю вам часть. Но каждый раз, когда я запускаю его, он всегда показывает часть "Life", даже если вы набираете "Pickup", "Look" или "Inventory". Пожалуйста помоги! Спасибо Джон

РЕДАКТИРОВАТЬ: Я думаю, что это просто проблема пробелов, но я не уверен, что раньше все работало нормально...

3 ответа

Решение

Вы неправильно понимаете or выражение. Используйте это вместо:

if Choice1.lower() == 'life':

или, если вам нужно протестировать несколько вариантов, используйте in:

if Choice1 in ('Life', 'life'):

или, если вы должны использовать or затем используйте это так:

if Choice1 == 'Life' or Choice1 == 'life':

и расширить это на другой Choice1 тесты.

Choice1 == 'Life' or 'life' интерпретируется как (Choice1 == 'Life') or ('life')с последней частью, всегда являющейся Истиной. Даже если это было истолковано как Choice1 == ('Life' or 'life') тогда последняя часть будет оценивать 'Life' только (это правда, что булевы тесты), так что вы будете тестировать, если Choice1 == 'Life' вместо этого и настройка Choice в 'life' никогда бы не сдал тест.

У тебя есть:

    if Choice1 == 'Life' or 'life':

Что на самом деле эквивалентно:

    if (Choice1 == 'Life') or 'life':

Непустая / ненулевая строка ('life') всегда будет рассматриваться как истина, поэтому вы оказались там.

Вы либо хотите:

    if Choice1 == 'Life' or Choice1 == 'life':

или же:

    if Choice1.lower() == 'life':

Использование in:

elif Choice1 in ('Pickup', 'pickup'):

Кроме того, вы можете использовать регулярные выражения:

import re

elif re.match("[Pp]ickup", Choice1):

Отдельно я бы использовал set для вашего инвентаря:

Inventory = set()
Squirrel =  'Squirrel'
while True:
...
        if p1 == Squirrel:
            if not Inventory:
                print'You picked up a Squirrel!'
                Inventory.add(Squirrel)
            elif Squirrel in Inventory:
                print'You already picked that up!'
Другие вопросы по тегам