Я пытаюсь создать минимаксный Python AI для моей игры TicTacToe, но кажется, что AI просто выбирает место, наиболее удаленное от игрового поля. В чем проблема?
Это то, чем я занимаюсь в школе, Python 3. Я несколько раз просматривал код и исправлял немало ошибок. Я добавил кое-что, что говорит мне, что, по его мнению, имеет счет ход, который он делает, но он всегда возвращает 1, даже если он только что сделал ход, который наверняка проиграет.
def detectWin(origBoard, human):
if human:
if (origBoard[0] == origBoard[1] == origBoard[2]) or (origBoard[3] == origBoard[4] == origBoard[5]) or (origBoard[6] == origBoard[7] == origBoard[8]) or(origBoard[0] == origBoard[3] == origBoard[6]) or (origBoard[1] == origBoard[4] == origBoard[7]) or (origBoard[2] == origBoard[5] == origBoard[8]) or (origBoard[0] == origBoard[4] == origBoard[8]) or (origBoard[2] == origBoard[4] == origBoard[6]):
return 1
else:
fullNum = 0
for square in board:
if square == 1 or square == 0:
fullNum += 1
if fullNum == 9:
return 0
else:
if (origBoard[0] == origBoard[1] == origBoard[2] == 0) or (origBoard[3] == origBoard[4] == origBoard[5] == 0) or (origBoard[6] == origBoard[7] == origBoard[8] == 0) or(origBoard[0] == origBoard[3] == origBoard[6] == 0) or (origBoard[1] == origBoard[4] == origBoard[7] == 0) or (origBoard[2] == origBoard[5] == origBoard[8] == 0) or (origBoard[0] == origBoard[4] == origBoard[8] == 0) or (origBoard[2] == origBoard[4] == origBoard[6] == 0):
return 2
elif (origBoard[0] == origBoard[1] == origBoard[2] == 1) or (origBoard[3] == origBoard[4] == origBoard[5] == 1) or (origBoard[6] == origBoard[7] == origBoard[8] == 1) or(origBoard[0] == origBoard[3] == origBoard[6] == 1) or (origBoard[1] == origBoard[4] == origBoard[7] == 1) or (origBoard[2] == origBoard[5] == origBoard[8] == 1) or (origBoard[0] == origBoard[4] == origBoard[8] == 1) or (origBoard[2] == origBoard[4] == origBoard[6] == 1):
return 1
return
def availableIndexes(boardArray):
answer = []
for j in range(len(boardArray)):
if boardArray[j] != 1 and boardArray[j] != 0:
answer.append(j)
return(answer)
class Move:
def __init__(self, index, score):
self.index = index
self.score = score
def minimax(origBoard, player):
availSpots = availableIndexes(origBoard)
if detectWin(origBoard, False) == 1:
return Move(None,10)
elif detectWin(origBoard, False) == 2:
return Move(None,-10)
elif len(availSpots) == 0:
return Move(None,0)
if player == 1:
otherPlayer = 0
else:
otherPlayer = 1
newBoard = origBoard[:]
moves = []
for spot in availSpots:
newBoard[spot] = player
move = Move(spot, minimax(newBoard, otherPlayer).score)
moves.append(move)
newBoard = origBoard[:]
for move in moves:
if player == 0:
bestScore = 11
if move.score < bestScore:
bestMove = move
bestScore = move.score
else:
bestScore = -11
if move.score > bestScore:
bestMove = move
bestScore = move.score
return bestMove
ИИ играет как Х. В моей игре Х равен 1, а О равен 0. Я хочу, чтобы он мог давать тактические ходы, но в данный момент он просто воспроизводит ход, имеющийсамый высокий индекс и по-прежнему доступен. Любые мысли о том, как я мог решить мою проблему?