最大递归错误python poker gam

2024-06-25 23:44:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用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://pastebin.com/sdfwWjsg

这是最后一个工作版本:http://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

我想这是因为代码没有在应该的时候跳出一个循环,但是我找不到它不在的地方。你知道吗


Tags: falsetruereturniftableactionaihuman
1条回答
网友
1楼 · 发布于 2024-06-25 23:44:23

查看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变量是不够的。你知道吗

相关问题 更多 >