2017-09-17 6 views
0

私はPythonを学ぶことを試みています。私は、ユーザーがリストから項目を削除する機能を作った。一度に1つずつ選択してからリストから削除する(基本的には、私のYahtzeeゲームに戻すためのダイスを選択する)。だから、ユーザーがリストから1つ以上の項目を削除し、whileループが終了するようにするには、ユーザーが22行目でそれ以上のダイスを再登録したくないと判断したときに終了する必要があります。関数は、ユーザーが1つのサイコロを選択して(たとえば6)、別のサイコロを選択してから別のサイコロを選択してnを選択すると、whileループが間違って発生する線21及び25と裏面21に(ユーザに要求間のループは一度ループを終了するのではなく、二回Nを入力する。Repl.itに私のコードが再びhereWhileループ奇数バグPython

で、問題があれば発生すると思われます削除するには少なくとも2つのサイコロを選択してください。

dice1 = [1,2,3,4,5,6] 

def sub_dice(): 
    while True: 
    try: 
     print 'line 6' 
     subtract1 = int(raw_input('What dice do you want to reroll?')) 
    except ValueError: 
     print('Enter a number corresponding to the dice you want to reroll') 
     continue 
    if subtract1 not in dice1: 
     print('You must select 1 of the dice from the table to remove') 
    else: 
     break 

    if subtract1 in dice1: 
    dice1.remove(subtract1) 
    print "The remaining dice are " + str(dice1) 

    while True: 
    print 'line 21' 
    more = raw_input("Do you want to reroll another dice, 'Y' or 'N?'") 

    if more.lower() == 'n': 
     print 'line 25' 
     print "On that turn, you kept " + str(dice1) 
     return len(dice1) 
     break 

    elif (more.lower() != 'y') and (more.lower() != 'n'): 
     print('You must select Y or N') 
     print 'line 32' 

    elif more.lower() == 'y': 
     print 'line 35' 
     sub_dice() 

sub_dice() 

*たとえば、6を入力してからy、次に5、次にnを入力すると、それは21行目にループして表示され、noを指定していても別のダイスを再表示するかどうかを尋ねます。

+0

私はこの変更を試してみましたが、問題は解決しませんでした(もう一度、少なくとも2つのサイコロを取り除くと表示されますが、ユーザーが「n」を入力すると、 – Mike

+0

私は質問を再開しましたが、それほど良いものではありません –

+1

あなたの[repl](https://repl.it/LMo7/2)が更新されました。論理再帰的ですが、あなたが望むのは、下のループから上のループを切り離すことです。 – Jedi

答えて

1

その理由は、その内部からsub_dice()を呼び出すためです。再帰関数については、あなたがこれを行うことを意図していないので、読んでください。

「n」と入力すると、ネストされたsub_dice()コールを終了するので、期待どおりにプログラムを終了するのではなく、元のコールに戻ります。