2017-05-23 7 views
1

学校プロジェクトのためにPythonで数字推測ゲームを作成しようとしています。私はかなりうまくいく基本的なゲームを作ったが、ユーザーが間違って何かを入力した場合には、例外処理を追加したい。'<'はケース間でサポートされていません - 番号推測ゲーム

def Normal_Guess(): 
    number = round(random.uniform(0.0, 100.0),2) 
    guess = "" 
    while guess != number: 
     try: 
      guess = float(input("Please guess a number between 0 and 100: ")) 
     except ValueError or TypeError: 
      print ("That isn't even a number!") 

     if guess < number and guess >= 0: 
      print ("You need to guess higher!") 
     elif guess > number and guess <= 100: 
      print ("You need to guess lower!") 
     elif guess == number: 
      print("Congratulations! You guessed the number!") 
     elif guess < 0 or guess > 100: 
      print ("The number you guessed is not between 0 and 100") 
     else: 
      print("That isn't even a number!") 
    New_Game() 

これにより、ユーザは「推測」としてフロートまたは整数値を入力したときに正常に動作し、試してみてください-除いて、私が持っている句は、ユーザが入力した場合捕まえるようだ:たとえば、これは私のコードのセクションです初めは数字以外の何ものでもありませんが、プログラムは "if"ステートメントにも引き継がれているようです。 "'str'と 'float'のインスタンス間で" '<'がサポートされていないというTypeErrorが発生しています。

私はTry-Except節でループ全体を網羅しようとしましたが、それは動作しません。私は何をしているのか分かりません。どんな助けも大歓迎です。

+5

、引き続き'使用します'を押してください。 – asongtoruin

+0

また、明示的に例外がない場合を処理するために、 'else'節を' try'-'except'ブロックに追加してください。 –

+0

あるいは、 'if else'チェーンを' try'ブロックの中に移動してください。なぜなら、それは論理的に所属しているからです。 –

答えて

3

まず、例外をキャッチする方法は無効です。式ValueError or TypeErrorの値は、ValueErrorになります。これは、2つの非False引数で短絡がどのように機能するかがわかるからです。両方のタイプのエラーを取得してブロックをトリガーするには、(ValueError, TypeError)のようにtupleを使用します。

問題は、コードに例外がキャッチされても、ブロックifに続きます。これはおそらく最もクリーンである

 
try: 
    guess = float(input("Please guess a number between 0 and 100: ")) 
except (ValueError, TypeError): 
    print ("That isn't even a number!") 
    continue 

  1. は、以下のif構造を処理せずに移動するためにループを伝えるためにexceptブロックでcontinueステートメントを使用します。あなたはこれを回避する4つの簡単なオプションがあります4つのオプションの中で最も簡単です。

  2. exceptブロックをエラーに応じて使用しないでください。代わりに、推測値がまだ""であるという事実に頼ってください。それはすべての中に初期化が必要なため、私はこのアプローチのファンではない個人的に

     
    while guess != number: 
        guess = "" 
        try: 
         guess = float(input("Please guess a number between 0 and 100: ")) 
        except (ValueError, TypeError): 
         pass 
        
        if guess == "": 
         print ("That isn't even a number!") 
        elif guess < number and guess >= 0: 
         ... 
    

    :これが機能するためには、ループの外の代わりに、一回のループの反復ごとにguessを事前に初期化する必要がありますループ。これは悪くない、オプション#1ほどきれいではない。

    このオプションのバリエーションは、guessstrのインスタンスであるかどうかを直接確認することです。その後、変換動作クリーナーを作り、ユーザーの入力にそれを初期化することができます。

     
    while guess != number: 
        guess = input("Please guess a number between 0 and 100: ") 
        try: 
         guess = float(guess) 
        except (ValueError, TypeError): 
         pass 
        
        if isinstance(guess, str): 
         print ("That isn't even a number!") 
        elif guess < number and guess >= 0: 
         ... 
    
  3. tryブロックの可能な要素の一つであるelse句を使用してください。例外が発生していない場合は、この句はのみを実行されます:このオプションは、インデントの追加層を作成し

     
    try: 
        guess = float(input("Please guess a number between 0 and 100: ")) 
    except (ValueError, TypeError): 
        print ("That isn't even a number!") 
    else: 
        if guess < number and guess >= 0: 
         ... 
    

    が、それは、プレーンcontinueが動作しませんこれらのケースのために心に留めておく価値可能性があります。これは、分岐する前に、エラーおよび非エラーの両方のケースに対して追加の処理を行う必要がある場合に発生することがあります。

  4. ブロックtryブロック全体にブロックifを置きます。このようにして、エラーがなければ実行されます。これは、私のtryブロックが、私が意図していなかった例外をキャッチするのを避けるためにできるだけトリムダウンされるのが好きなので、私の最も好きなオプションです。あなたの単純なケースのために、これはまだオプションですので、Pythonでは、tryは、Javaのような言語に比べてパフォーマンスキラーの比較的小さい:あなた `except`ループ内

     
    try: 
        guess = float(input("Please guess a number between 0 and 100: ")) 
        if guess < number and guess >= 0: 
         ... 
    except (ValueError, TypeError): 
        print ("That isn't even a number!") 
    
+0

4:tryブロックに余分なものを置くことの問題は、処理することを意味しなかった例外を捕らえる危険があることです。 – zstewart

+0

@zstewart。私はそれを追加しました。それを指摘してくれてありがとう。 –

+0

助けてくれてありがとう!私のコードは完璧に今働いています! – Cubemaster

0

else文を使用してみてください。

例外はキャッチプリントですが、スクリプトを実行し続けます。キャッチがヒットした場合でもif文のすべてに続きます。あなたがしたいことは、例外が当たったときに関数の主なロジックをスキップすることです。 try-catch-else-finallyブロックのELSE句を使用してください。

import random 

def Normal_Guess(): 
    number = round(random.uniform(0.0, 100.0),2) 
    guess = "" 
    while guess != number: 
     try: 
      guess = float(input("Please guess a number between 0 and 100: ")) 
     except (ValueError, TypeError): 
      print ("That isn't even a number!") 
     else: 
      if guess < number and guess >= 0: 
       print ("You need to guess higher!") 
      elif guess > number and guess <= 100: 
       print ("You need to guess lower!") 
      elif guess == number: 
       print("Congratulations! You guessed the number!") 
      elif guess < 0 or guess > 100: 
       print ("The number you guessed is not between 0 and 100") 
      else: 
       print("That isn't even a number!") 

Normal_Guess() 
+0

'ValueErrorまたはTypeError:exceptを除いて、(ValueError、TypeError):を除いて、「物理学者がMadの答えとして指摘したように。 – rrauenza

関連する問題