1

だから私は「PythonTheHardWayを学ぶ」でPythonを学んでいます。現在、簡単なテキストアドベンチャーを書いています。

私の問題は、コードの「戦闘」部分にあります(以下に提供)。数字の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
4

3 に答える 3

1

あなたが持っている:

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'終了など)。

于 2013-02-02T19:41:58.077 に答える
0

これを処理する方法はいくつかあります。

簡単な解決策は例外があると思います。

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

choiceをint型にキャストしようとするだけです。失敗した場合、exceptブロックが実行され、choiceがNoneに設定されるため、if/elifブロックは実行されません。

OK、最も単純ではありませんが、@jimharkのアプローチは単純です。

この場合、入力を整数に変換することにはほとんど価値がないようです。

于 2013-02-02T19:40:07.047 に答える
0

私は同様の質問https://stackoverflow.com/a/14644220/1481060cmdに回答し、これらの種類のコマンドループを処理する標準モジュールを使用することを提案しました。

これにより、 killlookなどの動詞をゲームに追加できるようになります。

-

また、ゲームをオブジェクトとしてモデル化して、変数が多すぎないようにすることもできます。これは、何かがhit発生すると、ダメージやスタミナなどのようにヘルスが低下することを想像できるためです。

于 2013-02-02T20:01:47.910 に答える