Поэтому я изучаю Python с помощью «Learn Python The Hard Way», в настоящее время я пишу простое текстовое приключение.

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

Заранее спасибо :)

        while True:
            player_dmg = randint(1, 10)
            enemy_dmg = randint(1, 10)

            if enemy_hp < 0:
                os.system('clear')
                print "[ENEMY NUTRALISED]"
                print
                print hit_e
                raw_input()
                return 'forth_area'
            elif player_hp < 0:
                return 'death'

            else:
                print "[COMBAT OPTIONS]"
                print "1. Attack"
                print "2. Defend"
                print
                choice = raw_input("*>>*")
                choice = int(choice)
                print
            if choice == 1:
                enemy_hp = enemy_hp - player_dmg
                print "[ENEMY STATUS: %d]" % enemy_hp
                print "[DAMAGE DONE: %d]" % player_dmg
                print
                player_hp = player_hp - enemy_dmg
                print "[DAMAGE RECIVED: %d]" % enemy_dmg
                print "[CURRENT STATUS: %d]" % player_hp
            elif choice  == 2:
                enemy_hp = enemy_hp - player_dmg / 2
                print "[ENEMY STATUS %d]" % enemy_hp
                print "[DAMAGE DONE %d]" % player_dmg
                print
                player_hp = player_hp - enemy_dmg
                player_hp = player_hp + 3
                print "[DAMAGE RECIVED: %d]" % enemy_dmg
                print "[CURRENT STATUS: %d]" % player_hp
                print
            else:
                print no_understand
1
samsam 2 Фев 2013 в 23:35

3 ответа

Лучший ответ

У тебя есть:

choice = raw_input("*>>*")
choice = int(choice)
# . . .
if choice == 1:
# . . .
elif choice == 2:

Самое простое решение - использовать:

choice = raw_input("*>>*")
# . . .
if choice == '1':
# . . .
elif choice == '2':

raw_input возвращает строку. Зачем конвертировать его в число? Просто проверьте текст '1' и '2' и т. Д. Это также упрощает добавление символьных команд (например, 'q' для выхода).

1
jimhark 2 Фев 2013 в 19:41

Я ответил на аналогичный вопрос https://stackoverflow.com/a/14644220/1481060 и предложил использовать стандартный модуль cmd, который обрабатывает эти виды командных циклов.

Он должен дать вам возможность добавлять в игру глаголы типа kill , look и т. Д.

-

Вы также можете смоделировать свою Игру как Объекты, чтобы не хранить слишком много переменных, так как я могу себе представить, что когда что-то получает hit, здоровье ухудшается, как и урон, выносливость и т. Д. И т. Д. И т. Д.

0
Community 23 Май 2017 в 11:56

Есть несколько способов справиться с этим.

Я думаю, что простое решение будет за исключением.

try:
    choice = int(choice)
except:
    choice = None

Он просто пытается преобразовать choice в тип int. В случае сбоя запускается блок исключения, и для параметра устанавливается значение Нет, поэтому блоки if / elif не будут выполняться.

Хорошо, не самый простой, у @jimhark более простой подход.

Кажется, в этом случае мало смысла преобразовывать входные данные в целое число.

0
jgritty 2 Фев 2013 в 19:47