Ошибка глубины рекурсии и поток в стеке, которые происходят в python - PullRequest
0 голосов
/ 19 января 2020

Я недавно создал игру ti c ta c toe с функцией min-max. Тем не менее, я получаю сообщение об ошибке переполнения стека и глубины рекурсии. Как бы вы оптимизировали это так, чтобы этого не произошло. Первоначально я создал игру Ti c Ta c Toe. Затем я включил алгоритм min-max. Если так или иначе, чтобы сделать код быстрее или оптимизировать функцию. Это действительно поможет, спасибо

board = ["."] * 9
wining_comb = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[3,4,6],[0,4,8]]
game = True
key = {
  "x": 1,
  "O":-1,
}

def new_board():
    print (board[0] + "|" + board[1] + "|" + board[2])
    print (board[3] + "|" + board[4] + "|" + board[5])
    print (board[6] + "|" + board[7] + "|" + board[8])

new_board()
def wining(comb):
    global game 
    for l in range(len(wining_comb)):
        a = wining_comb[l][0]
        f = wining_comb[l][1]
        v = wining_comb[l][2]
        if comb[a] == comb[f] == comb[v] == "O" or "x" == comb[a] == comb[f] == comb[v]:
            game = False 
            return a
            break
        else:
            game = True 
            break
            
def minmax(board,depth, ismax):
    if wining(board) != None:
        score = key[wining(board)]
        return score
    else:
        if ismax == True:
            bestscore = float('-inf')
            for k in range(len(board)):
                if board[k] == ".":
                    board[k] == "x"
                    score = minmax(board,depth+1,False)
                    board[k] == '.'
                    bestscore = max(bestscore, score)
            return bestscore 
        else:
            bestscore = float('inf')
            for k in range(len(board)):
                if board[k] == ".":
                    board[k] == "O"
                    score = minmax(board,depth+1,True)
                    board[k] == '.'
                    bestscore = min(bestscore,score)
            return bestscore
                    
                    

def player1() :
    bestscore = float('inf')
    bestmove = 0
    for k in range(len(board)):
        if board[k] == ".":
            board[k] == "x"
            score = minmax(board,0, False)
            board[k] == "."
            if score > bestscore:
                bestscore = score
                bestmove = k
    board[bestmove] = "x"
    new_board()
            
    
def player2():
    number = int(input("Please enter your poistion?") )
    board[number - 1 ] = "O"
    new_board()
    wining(board)



    
    
            


while game==True:
    player1()
    player2()
...