2016-04-27 10 views
0

私はセレクション4に問題があるようです。main()で呼び出すことができるメインメニューに戻したいと思います。 「はい」は明らかに機能し、「はい」または「はい」以外を入力すると、メインメニューに戻ります。 "no"または "hhh"と入力するだけで、プログラムは終了し、 "Yes"/"yes"となります。まるで "はい"のように、同じ "再生のためのお礼"メッセージが表示されます。私はPythonの初心者ですので、ここで私に同行してください。Do-While、メニュー選択を正しく終了するには

while endProgram == "Yes" or "yes": 

    #Selection menu, user input to navigate. 
    selection = eval(input("Your selection: ")) 

    #Selection 1, rules. 
    if selection == 1: 
     rpsRules() 
     returnMain = input("\nWhen you would like to return to the Main Menu, press Enter.") 
     main() 

    #Selection 2, begin a match against the PC, calls againstPC module with choice as an argument. 
    elif selection == 2: 
     againstPC(choice) 

    #Selection 3, begin a match against another player locally, calls twoPlayer module. 
    elif selection == 3: 
     twoPlayer() 

    #Selection 4, end program, with an "Are you sure?" catch.  
    elif selection == 4: 
     endProgram = input("\nAre you sure you want to quit? (Yes/No) ") 
     if endProgram == "Yes" or "yes": 
      print("\nThanks for playing Rock, Paper, Scissors!\nSee you next time!") 
      break 
     elif endProgram == "No" or "no": 
      main() 
     else: 
      main() 
    elif selection == 5: 
     creatorCredits() 
+0

'endProgram ==は「はい」または「はい」'以来、常に真であります'' yes ''、' 'yes''が 'False'でない場合、あなたのプログラマーは決して終わらないでしょう。 – user312016

+0

選択4で呼び出されているmain()関数にコードがありますか?もしそうでなければ、それはあなたのプログラムが後で終了する理由かもしれません。endprogram == "Yes"またはendProgram == "yes"それに加えて、必ずしもあなたの質問に答えるわけではありませんが、テストする最初のIF文の後に文字列が "Yes"か "Yes"かどうかを確認するには、他の文字列を1つだけ使用できます。 ELIFとELSEの両方がmainへのコールバックを行うので、 "no"か "blah blah blah"のどちらを入力するかは重要ではありません。 –

+0

'x ==" a "または" b "'を 'x in(" a "、" b ")'に変更して、必要な効果を持たせる必要があります。さもなければ、式は常にtrueになります。なぜなら、 '(x ==" a ")や" b "'のようなグループは明らかに真であるためです。 –

答えて

0

答えがにあなたのIF文を変更するには、次のようになります。

if endProgram == "Yes" or endProgram == "yes": 
... 
1

この行を:

while endProgram == "Yes" or "yes" 

ドウは、あなたが英語でそれを読んだとき、それが言うことを意味するものではありませ。それはendProgramに対して両方の値をチェックしますので、あなたはこのように、それを変更する必要があります。

while endProgram == "Yes" or endProgram == "yes" 

あなたはその後、さらに言って、それは簡単にすることができます。

while endProgram.lower() == "yes" 

あなたは、これまでユーザーの入力にevalを使用しないでください。これは危険であり、バグの大きな原因であるだけでなく、アプリケーションで予期しない動作を引き起こす可能性があります。実際に

、あなたはメニューを印刷しているあなたのmain()方法、このロジックを置く必要があります、そして、

def main(): 
    # print the menu here 
    selection = input("Your selection: ") 
    try: 
     selection = int(selection) 
    except ValueError: 
     print('Please enter a valid number') 
     get_user_input() 
    return selection 

メインしばらくそれを呼び出す:

while endProgram.lower() == "yes": 
    selection = main() 

次号このセクションでは、whileループと同じチェックをしています。これは不要です。このすべてをクリーンアップするために

elif selection == 4: 
    endProgram = input("\nAre you sure you want to quit? (Yes/No) ") 
    if endProgram == "Yes" or "yes": 
     print("\nThanks for playing Rock, Paper, Scissors!\nSee you next time!") 
     break 
    elif endProgram == "No" or "no": 
     main() 
    else: 
     main() 

、このような構造あなたのプログラムを:

  1. は、メインメニューを表示します。
  2. メインメニューのオプションは終了しませんが、ループを実行します。
  3. ループ内の各選択の後で、メインメニューをもう一度印刷します。

メインメニュー関数は有効な応答を返すので、あなたはそこにもあなたの出口ロジックを移動することができます。

def main(): 
    # print your menu here 
    selection = input('Please enter your choice: ') 
    try: 
     selection = int(selection) 
    except ValueError: 
     print('Sorry, {} is not a valid choice'.format(selection)) 
     main() 
    if selection == 4: 
     exit_check = input('Are you sure you want to exit? Type Yes: ') 
     return exit_check.lower() 
    if 0 < selection < 4: 
     print('{} is not a valid menu item.') 
     main() 
    return selection 

は今、あなたのプログラムのメインロジックループは、このようなものです:

end_program = main() 
while end_program != 'yes': 
    if end_program == 1: 
     # do stuff 
     end_program = main() 
    if end_program == 2: 
     # do stuff 
     end_program = main() 
print('Thank you, for playing. Good bye!')