2017-01-12 12 views
-2

私は単純なポーカーゲームをパイソンで作っています。賭けのラウンドを行うとき、私は最大再帰深さのエラーを取得し、私はそれを修正する方法についてあまりにも確信していません。以前のバージョンのコードでこの問題が発生しましたが、私は今ベットラウンドを2つの半分に分割しました(1つは人間用、もう1つはAI用)。私は考えることができるすべての修正を試して、スタックオーバーフローとまだ使用していません。最大再帰エラーpythonポーカーゲーム

def bettingRoundHuman(): 
    print "Human, your cards are: " + str(human.card1) + ", " + str(human.card2) 
    action = raw_input("What is your move? (r/c/f): ") 
    if action == 'f': 
     ai.score = ai.score + 1 
     Table.winner = "Ai" 
     bettingRound().won = True 
     return True 
    elif action == 'r': 
     raiseAmount = input("Raise by: ") 
     if bettingRoundHuman().action == 'r': 
      human.money = human.money - bettingRoundAi().raiseAmount - raiseAmount 
      Table.pot = Table.pot + bettingRoundAi().raiseAmount + raiseAmount 
      bettingRound().won = False 
      return False 
     elif bettingRoundHuman().action == 'c': 
      human.money = human.money - raiseAmount 
      Table.pot = Table.pot + raiseAmount 
      bettingRound().won = False 
      return False 
     else: 
      human.money = human.money - raiseAmount 
      Table.pot = Table.pot + raiseAmount 
      bettingRound().won = False 
      return False 
    elif action == 'c': 
     if bettingRoundAi().action == 'c': 
      bettingRound().won = False 
      return True 
     elif bettingRoundAi().action == 'r': 
      human.money = human.money - bettingRoundAi().raiseAmount 
      Table.pot = Table.pot + bettingRoundAi().raiseAmount 
      bettingRound().won = False 
      return False 
     else: 
      bettingRound().won = False 
      return False 

def bettingRoundAi(): 
    print "Ai, your cards are: " + str(ai.card1) + ", " + str(ai.card2) 
    action = raw_input("What is your move? (r/c/f): ") 
    if action == 'f': 
     human.score = human.score + 1 
     Table.winner = 'Human' 
     bettingRound().won = True 
     return True 
    elif action == 'r': 
     raiseAmount = input("Raise by: ") 
     if bettingRoundHuman().action == 'r': 
      ai.money = ai.money - bettingRoundHuman().raiseAmount - raiseAmount 
      Table.pot = Table.pot + bettingRoundHuman().raiseAmount + raiseAmount 
      bettingRound().won = False 
      return False 
     elif bettingRoundHuman().action == 'c': 
      ai.money = ai.money - raiseAmount 
      Table.pot = Table.pot + raiseAmount 
      bettingRound().won = False 
      return False 
    elif action == 'c': 
     if bettingRoundHuman().action == 'r': 
      ai.money = ai.money - bettingRoundHuman().raiseAmount 
      Table.pot = Table.pot + bettingRoundHuman().raiseAmount 
      bettingRound().won = False 
      return False 
     elif bettingRoundHuman().action == 'c': 
      bettingRound().won = False 
      return True 
     else: 
      bettingRound().won = False 
      return False 

def playGame(): 
    startPlayer = bettingRoundOrder() 
    human.money = human.money - Table.entrymoney 
    ai.money = ai.money - Table.entrymoney 
    Table.pot = (Table.pot + 2*Table.entrymoney) 

    if bettingRound() == False: 
     print "The table's cards are: " + str(Table.flop1) + ", " + str(Table.flop2) + ", " + str(Table.flop3) 
     if bettingRound() == False: 
      print "The table's cards are: " + str(Table.flop1) + ", " + str(Table.flop2) + ", " + str(Table.flop3) + ", " + str(Table.turn) 
      if bettingRound() == False: 
       print "The table's cards are: " + str(Table.flop1) + ", " + str(Table.flop2) + ", " + str(Table.flop3) + ", " + str(Table.turn) + ", " + str(Table.river) 
       if bettingRound() == False: 
        return cardCompare() 
    else: return Table.winner 

def bettingRoundOrder(): 
    if randint(0,100) >= 50: 
     return 1 
    else: 
     return 2 

def bettingRound(): 
    won = False 
    if playGame().startPlayer == 1: 
     while flag == False: 
      finishH = bettingRoundHuman() 
      finishA = bettingRoundAi() 
      if finishH == True or finishA == True: 
       flag = True 
      else: flag = False 
    elif playGame().startPlayer == 2: 
     while flag == False: 
      finishA = bettingRoundAi() 
      finishH = bettingRoundHuman() 
      if finishH == True or finishA == True: 
       flag = True 
      else: flag = flase 
    if won == True: return True 
    else: return False 

全コードここに:ここで

はコードでのhttp:http://pastebin.com/sdfwWjsg

はここで最後の作業バージョンです// pastebin.com/35gapWNi

そしてここでエラーコードです私は得る:

[Keeps repeating and too long to put in question] 
    File "/home/laurence/Documents/poker (test).py", line 180, in bettingRound 
    if playGame().startPlayer == 1: 
    File "/home/laurence/Documents/poker (test).py", line 162, in playGame 
    if bettingRound() == False: 
    File "/home/laurence/Documents/poker (test).py", line 180, in bettingRound 
    if playGame().startPlayer == 1: 
    File "/home/laurence/Documents/poker (test).py", line 162, in playGame 
    if bettingRound() == False: 
    File "/home/laurence/Documents/poker (test).py", line 180, in bettingRound 
    if playGame().startPlayer == 1: 
    File "/home/laurence/Documents/poker (test).py", line 157, in playGame 
    startPlayer = bettingRoundOrder() 
    File "/home/laurence/Documents/poker (test).py", line 173, in bettingRoundOrder 
    if randint(0,100) >= 50: 
    File "/usr/lib/python2.7/random.py", line 242, in randint 
    return self.randrange(a, b+1) 
    File "/usr/lib/python2.7/random.py", line 185, in randrange 
    istart = _int(start) 
RuntimeError: maximum recursion depth exceeded while calling a Python object 

ここで完全なエラーコード:http://pastebin.com/52CH0AvL

私はループの中でループを壊さないようにコードと関係があると思っていますが、どこにあるのかわかりません。

+0

完全な例外出力を共有してください – nuriselcuk

+1

私たちがあなたを助けるのは難しいことではありません。あなたのコードで最初に受け取るエラーは 'NameError:global name 'randint' not defined'です。ランダムなインポートrandint'を追加した後、コードは実行されますが、何も起こりません。最後に 'playGame()'を追加すると、 'NameError:global name 'human'が定義されていません。 'というエラーが出ます。コピーして貼り付けることができる[mcve](https://stackoverflow.com/help/mcve)を提供できますか?エラーを表示してください。 – maij

+0

@maij完全コードとエラー出力にpastebinを追加しました。 – Snowsnooks

答えて

0

http://pastebin.com/sdfwWjsgからあなたのコードの行156から162と178から180を見てください:

156 def playGame(): 
157   startPlayer = bettingRoundOrder() 
158   human.money = human.money - Table.entrymoney 
159   ai.money = ai.money - Table.entrymoney 
160   Table.pot = (Table.pot + 2*Table.entrymoney) 
161 
162   if bettingRound() == False: 


178 def bettingRound(): 
179   won = False 
180   if playGame().startPlayer == 1: 

これらのスニペットは、エラーメッセージに繰り返し言及されているライン180と162が含まれています。では、行156の関数playGame()が呼び出されるとどうなるかを見てみましょう。行157〜160はいくつかの変数を設定し、行162はbettingRound()を呼び出します。今は178行目、179行目は変数を設定し、180行目はplayGame()を呼び出すので、156に戻ります。これは無限ループです。

残りのコードは調査していないため、エラーを修正できません。

playGame().startPlayerのような機能を実行する場合は、playGame()関数はstartPlayerのメンバーを返す必要があります。 Table.winner(文字列またはなし)もcardCompare()(文字列)の結果も機能しません。 playGame関数のどこかでstartPlayer変数を使用するだけでは十分ではありません。

+0

私はこれに十分に感謝することはできません。 startPlayer変数をTableクラスに移動したので、ループでスタックしないようにしました。私は、その質問がうまく尋ねられなかったことを謝ります。 – Snowsnooks

関連する問題