2016-09-03 12 views
1

私のゲームのコンセプトは以下の通りです。コンピューターはランダムに1-100の数字を生成し、プレーヤーはその数字を推測しなければなりません。彼らが推測する数字が高いか低い場合、コンピュータはそれを指示します。数字推測ゲーム、次の推測を取ることができない

ユーザーが入力した推測が数字であることを確認するためにいくつかのコードを追加しましたが、何らかの理由で最初の推測でのみ機能します。

import random 

x = random.randint(1, 100) 
guess = input("Guess the number") 

while guess.isnumeric() == True: 

    if x > int(guess): 
     print("Too low, guess again") 
     guess = input("Guess the number") 

    if x < int(guess): 
     print("Too high, guess again") 
     guess = input("Guess the number") 

    if x == int(guess): 
     print ("That is correct!") 
     break 

if guess.isnumeric() == False: 
     print("Please enter a valid number") 
     guess = input("Guess the number") 

私は本当にそれを説明する方法を知らない。しかし、例えば、私が最初の推測として数字20を推測すると、ランダムに生成された数字に応じて高すぎたり小さすぎたりするかもしれませんが、その後、ランダムな文字を入力すると、ランダムに生成された数と比較することはできませんでした。

+0

あなたの質問には、*完全なトレースバック*を含めてください。あなたは、2番目または3番目の 'if'ステートメントで' ValueError'例外が発生していると思います。 –

+0

各ifステートメントの終わりにcontinueを入れてください。 –

答えて

2

私はあなたのためにあなたのコードを修正しました。これを試してみてください:

すべての推測の後にユーザーに入力を促す必要はありません。これが最初の入力プロンプトです。 while Trueを指定しているため、正しい番号を入力しない限り、毎回入力するように求めるメッセージが表示されます。その場合は、無限ループがbreakです。

さらに入力文をtryブロックに入れることができます。これは入力を正しい整数として入力しているためです。ユーザーが文字列を入力した場合、整数としてキャストしようとするとプログラムは失敗しますが、except ValueError:、次にcontinueの場合は、入力が無効であることをユーザーに警告し、再度入力を促します。

1

推測論理が正しいと判断されるまで、推測ロジックを別のループで囲む必要があります。

擬似コード:

choose_target_answer 
while player_has_not_guessed_answer 
    get_player_guess 
    if player_guess_is_valid 
     respond_to_player_guess 
    else 
     give_error_message 
2

あなたif文はすべて独立している:

if x > int(guess): 
    print("Too low, guess again") 
    guess = input("Guess the number") 

if x < int(guess): 
    print("Too high, guess again") 
    guess = input("Guess the number") 

if x == int(guess): 
    print ("That is correct!") 
    break 

第二と第三if文は常にテストguess再び、最初ifテストはマッチします場合でも。最初のifテストが一致し、数値以外のguess値を入力した場合、int()コールがValueError例外をスローするため、2つのテストは失敗します。

elifelseを使用すると、テストが相互依存することをPythonに伝えることができます。今Pythonは唯一最初のマッチングブロックを実行し、完全に他人をスキップ:

if x > int(guess): 
    print("Too low, guess again") 
    guess = input("Guess the number") 

elif x < int(guess): 
    print("Too high, guess again") 
    guess = input("Guess the number") 

else: 
    print ("That is correct!") 
    break 

これはelseブロックの後連続実行が意味のいずれかifまたはelifテストが一致したとき。

最後にelseを使用しました。数字が高すぎないか低すぎない場合は、と等しくなければなりません。他のオプションはありません。それを明示的にテストする必要はありません。

あなたは今は自分自身を繰り返しています。あなたは3つの場所で推測を求めています。あなたは一度を尋ねると、ループが新たな価値を求めての世話をしてみましょうことができます:すでにはるかに少ない繰り返しをだ

while True: 
    while True: 
     guess = input("Guess the number:") 
     if guess.isnumeric(): 
      break 
     print("Not a valid number, try again!") 

    guess = int(guess) 

    if x > guess: 
     print("Too low, guess again") 

    elif x < guess: 
     print("Too high, guess again") 

    else: 
     print ("That is correct!") 
     break 

。別のwhileループは実際に数字になるまで番号を要求し、guessint()に一度だけ変換されます。

あなたはそのネストされたwhile True:を削除し、ちょうどここに外1を使用することができ、その結果、あなたが数値を持っていないときは、ループの残りの部分をスキップするcontinueキーワードを使用して、同じになります

while True: 
    guess = input("Guess the number:") 
    if not guess.isnumeric(): 
     print("Not a valid number, try again!") 
     continue # skip to the top of the loop again, so ask again 

    guess = int(guess) 

    if x > guess: 
     print("Too low, guess again") 

    elif x < guess: 
     print("Too high, guess again") 

    else: 
     print ("That is correct!") 
     break