Чтобы покрыть вертикаль, горизонталь и диагональ, вы можете составить список позиций осей для каждого направления и проверить, соответствуют ли какие-либо из них XXX или ООО:
axes = [(0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6)]
win = any(board[a]+board[b]+board[c] in ["XXX","OOO"] for a,b,c in axes)
Если вы хотите сделать компьютерВ игре вы можете создать функцию рейтинга хода, которая анализирует каждую игровую позицию и возвращает число, соответствующее ее позиции.
Вот пример:
from random import sample
axes = [(0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6)]
def isWin(board):
return any(board[a]+board[b]+board[c] in ["XXX","OOO"] for a,b,c in axes)
def rating(position,play,board,level=3**6): # 3**6=Invincible, 3**4=hard, 3**1=Easy
if board[position] != " " or level < 3: return 0
newBoard = board[:position]+[play]+board[position+1:]
if isWin(newBoard): return level*2
nextRatings = [rating(p,"XO"[play=="X"],newBoard,level/3) for p in range(9)]
return level-max(nextRatings,key=abs)
while True:
board = [" "]*9
player,computer = sample("XOXO",2)
while True:
for r in range(0,9,3):
print("("+") (".join(board[r:r+3])+")",list(range(r+1,r+4)))
available = [str(p+1) for p in range(9) if board[p] == " "]
if isWin(board) or not available : break
player = "XO"[player=="X"]
if player == computer:
position = max(sample(range(9),9),key=lambda p:rating(p,computer,board))
print(f"Computer plays {player} at {position+1}")
else:
while True:
position = input(f"Position to play for {player}: ")
if position not in available: print("Invalid position")
else : position = int(position)-1; break
board[position] = player
print( f"{player}'s WIN !!!\n" if isWin(board) else "DRAW.\n")
Функция rating()
рекурсивно просматривает возможные ходы, возвращая все меньшее и меньшее значение в зависимости от количества ходов, необходимых для достижения конца игры.Значение каждого уровня прибавляется или вычитается в зависимости от того, какой ход игрока равен