Играйте, не стесняйтесь просить ясности, поскольку это довольно длинный вопрос
У меня есть игра в крестики-нолики (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 ().Первый ход - это тот, который играет компьютер, а второй - человек-игрок.Весь кортеж представляет компьютерную идею наилучшего результата для себя.