Tic Tac Toe Мин Макс Макс Алгоритм Питон. Компьютерный алгоритм не является надежным - PullRequest
0 голосов
/ 19 июня 2019

Играйте, не стесняйтесь просить ясности, поскольку это довольно длинный вопрос

У меня есть игра в крестики-нолики (X и O), которая хорошо работает, когда в нее играют 2 человека.

Моя текущая проблема заключается в попытке реализовать алгоритм Min Max.У меня есть 4 функции, которые формируют мозг компьютера, и все они имеют краткое описание над ними.Первые две функции в основном для контекста.

Я думаю, что основная проблема заключается либо в том, как рассчитывается счет, либо при выборе игры, во многих играх одинаковый счет, и он выбирает первую снаивысший балл, который не обязательно может быть лучшим выбором .

Вот код.

# Find All Open Positions On the Current Board
def posis(self):
    return [x for x, coordinate  in enumerate(self.gameBoard) if ((coordinate != 'X') and (coordinate != 'O'))]
# Return All Possible Combinations Given The Current Board State           
def pos_moves(self):
    return [arr for arr in permutations(self.posis())]
# The Computer Plays Every Possible Game Based on self.pos_moves()
# At The End It Returns Each Game and Its Score

def min_max(self,player):
    moves = self.pos_moves()
    pos_boards, scores = [],[]
    for move in moves:
        board = self.gameBoard[:] # This is just the current game board
        depth = 0
        function_player = player

        while True: # This is the loop that each possible game (from pos_moves) goes through for evaluation. at the end giving it a score. 
            board[move[depth]] = function_player
            if ((self.win_checker(board)==True) or (self.board_full(board) != False)):
                if self.win_checker(board) == True:
                    if function_player == player: # Meaning the winner of that game is the computer
                        score = 6-(depth + 1)
                    elif function_player != player: # maening the winner of that game is the human player
                        score = -6+(depth + 1)
                else: # If the game is a draw
                    score = 0
                pos_boards.append(move) # Adding the board to pos_boards
                scores.append(score) # Adding the score to scores with the same index as it's corresponding board from above
                break
            function_player = self.change_player(function_player)
            depth+=1       
    return (pos_boards,scores)
#I Think This Is Where The Problem Is
def comp_think(self,player):
    pos_boards = self.min_max(player)[0]
    scores = self.min_max(player)[1]
    play = pos_boards[scores.index(max(scores))] # this is a supposed to be the best path for the computer to choose. But it's not.
    print(play)
    return str(play[0]) # returning the first move in the best path for the computer to play

Вот пример игры:

0 | 1 | 2 
 --------- 
 3 | 4 | 5 
 --------- 
 6 | 7 | 8 


X, Chose a slot: 0 # I play top left

 X | 1 | 2 
 --------- 
 3 | 4 | 5 
 --------- 
 6 | 7 | 8 

(1, 2, 4, 3, 7, 5, 6, 8) #Computer plays top middle but I would like it to play middle middle

 X | O | 2 
 --------- 
 3 | 4 | 5 
 --------- 
 6 | 7 | 8 


X, Chose a slot: 4

 X | O | 2 
 --------- 
 3 | X | 5 
 --------- 
 6 | 7 | 8 

(2, 3, 5, 7, 8, 6)

 X | O | O 
 --------- 
 3 | X | 5 
 --------- 
 6 | 7 | 8 


X, Chose a slot: 8

 X | O | O 
 --------- 
 3 | X | 5 
 --------- 
 6 | 7 | X 

X Wins!!!

X в этом случае - человек-игрок

Каждый кортеж - это переменная play из comp_think ().Первый ход - это тот, который играет компьютер, а второй - человек-игрок.Весь кортеж представляет компьютерную идею наилучшего результата для себя.

1 Ответ

0 голосов
/ 19 июня 2019

Одна потенциальная ошибка, которую я вижу здесь, состоит в том, что компьютер выбирает ход, который может привести к наилучшему результату. Например, если он сможет выиграть всего за 3 хода, он примет этот выбор. Однако это предполагает, что игрок сделает определенные шаги, которые позволят компьютеру победить, что, вероятно, маловероятно. Возможно, вместо того, чтобы найти единственный ход, который мог бы привести к наивысшему баллу, вы складываете все баллы, которые могут возникнуть с каждым ходом, и наибольший итог - выбор, который он выбирает? В конце концов, обратите внимание, что кортеж, который он дает, очень маловероятен - игрок просто игнорирует путь, по которому было бы логично идти.

Кроме того, вы могли бы придать глубине игры немного меньший вес при определении счета, если это вообще имеет значение - почему выигрыш бота выигрывает раньше? Победа есть победа.

...