2017-08-14 21 views
1

このプログラムは、私のGCSEコンピュータサイエンス用のヘビとはしごプログラムです(心配しないでください、これは単なる練習です)。ループ内に存在する関数です。コードは次のとおりです。関数内にループwhile while while pythonを破ることができません

win = False 

while win == False: 
    print("Player 1 goes first.") 

    def dice(): 
     roll = random.randint(1,6) 
     return roll 

    roll = dice() 
    print("They roll a...",roll) 
    player1+=roll 

    def check(): 
     if player1 in ladders or player2 in ladders: 
      print("A ladder has moved the player to a new position.") 
     elif player1 in snakes or player2 in snakes: 
      print("A snake has moved the player to a new position.") 
     elif player1 >= 36: 
      print("Congratulations. Player 1 has won the game.") 
      win = True 
     elif player2 >= 36: 
      print("Congratulations. Player 2 has won the game.") 
      win = True 

    check() 

    print("Player 1 is on square",player1) 

これは明らかに完了していません。それはすべてのコードではありません。そのビットの後、それはplayer2でも同じです。プレイヤーがヘビやラダーに着陸したかどうかを調べるためにチェック機能がチェックするタプルがありますが、実際にプレーヤーをラダー/ヘビの上下に動かすコードは追加していません。

エラーは、whileループが無限ループであることです。

私はwin = FalseまたはTrueのものをTrueの間だけ変更してみましたが、breakを使用するとwin = Trueですが、明らかにブレークしていても 'outside outside loop'のエラーを返しますループ内。私は関数から何かを返す必要があるのか​​どうか疑問に思っていますが、それをどうやって行うのかは分かりません。 「return win」をwin = Trueの下に置くだけで何も変更されず、whileループは無期限に続きます。

答えはherehereですが、どちらもうまくいきませんでした。私の状況は少し違うと思います。

+3

あなたの関数は最初にループ内にあるべきではありません。 –

+0

ループ外でcheck()を定義し、whileループがある関数にwinを返します。 – wave5459

答えて

1

おそらくこれがあなたが探しているものですか?ループからどのように関数を取り除いたかに注目してください。それから私はブーリアン変数を使用して、周囲にきれいな方法があるので、それを捨てました。特定の条件が満たされている場合は、while Trueを使用し、次にbreakを使用することができます。特定の条件が満たされたときにループを開始点に戻す場合は、continueを使用できます。

def dice(): 
     return random.randint(1,6) 


def check(): 
     if player1 in ladders or player2 in ladders: 
      print("A ladder has moved the player to a new position.") 
     elif player1 in snakes or player2 in snakes: 
      print("A snake has moved the player to a new position.") 
     elif player1 >= 36: 
      print("Congratulations. Player 1 has won the game.") 
      return True 
     elif player2 >= 36: 
      print("Congratulations. Player 2 has won the game.") 
      return True 

while True: 
    print("Player 1 goes first.") 

    roll = dice() 
    print("They roll a...",roll) 
    player1 += roll 

    if check(): 
     break 

    print("Player 1 is on square",player1) 

私は本当にロジックは触れていないが、それはcheckにプレイヤーのスコアを渡すために意味をなさないと思います。

+1

どのようにプレイヤーのスコアをチェックに渡すのか分かりませんが、関数は私を混乱させますが、checkが実行されるたびにplayer1とplayer2の変数がリセットされないので、うまくいきます。ありがとうございました! – TaraF13

+0

@ TaraF13関数があなたを混乱させるなら、それらは読んで価値のあるものであり、学習するのは間違いなく、特にpythonのような関数型プログラミング言語のプログラミングの最大の基礎の一つです –

+0

@ TaraF13私は間違いなく[このビデオ](https ://www.youtube.com/watch?v = 9Os0o3wzS_I)。 Pythonの関数の理解を深めるのに役立ちます。 –

1

これは、関数内で変数を代入するときにローカル変数を使用したために起こりました。だから、あなたがチェック機能でglobal winを追加することができ、高速の修正のために:

def check(): 
    global win 
    if player1 in ladders or player2 in ladders: 
     print("A ladder has moved the player to a new position.") 
    elif player1 in snakes or player2 in snakes: 
     print("A snake has moved the player to a new position.") 
    elif player1 >= 36: 
     print("Congratulations. Player 1 has won the game.") 
     win = True 
    elif player2 >= 36: 
     print("Congratulations. Player 2 has won the game.") 
     win = True 

あなたはここで、変数の種類についての詳細を読むことができます - http://www.python-course.eu/python3_global_vs_local_variables.php

をまた、それはしばらくの間、それがするので、内部の機能を保存するためには良い考えではありません良くないそれぞれの反復で関数を作成する。だから、ループの外でそれらを定義する方が良い。

+0

大部分の場合、グローバル変数の使用を避けることができます。 –

関連する問題