Я написал крестики - нолики, на основе minmax алгоритма, но они слишком слабо играют. Можно ли улучшить игру компьютера, не увеличивая глубину поиска? (функция computer())
Код:
board = [' 1 ', ' 2', ' 3', ' 4', ' 5', ' 6', ' 7', ' 8', ' 9']
def drawpole(board):
print(' ' + board[0] + ' | ' + board[1] + ' | ' + board[2])
print('----+----+----')
print(' ' + board[3] + ' | ' + board[4] + ' | ' + board[5])
print('----+----+----')
print(' ' + board[6] + ' | ' + board[7] + ' | ' + board[8], '\n')
print()
def computer(board, cznak, iznak):
Min = 0
Max = 0
minmax = -40
kletka = 0
for i in range(9):
if board[i] != 'O' and board[i] != 'X':
newboard = board.copy()
newboard[i] = cznak
Max = poleznoste(newboard, cznak)
if Max >= 5:
board[i] = cznak
break
for a in range(9):
if newboard[a] != 'O' and newboard[a] != 'X':
newnewboard = newboard.copy()
newnewboard[a] = iznak
Min = poleznoste(newnewboard, iznak)
if (-1 * Min + Max) > minmax:
minmax = -1 * Min + Max
kletka = i
if i == 8:
board[kletka] = cznak
def igrok(board, iznak):
hod = int(input("Введите цифру поля, куда вы хотите поставить свой знак: "))
if hod < 1 or hod > 9:
print("Такой клетки нет!")
igrok(board, iznak)
elif board[hod - 1] == 'O' or board[hod - 1] == 'X':
print("Эта клетка занята!")
igrok(board, iznak)
else:
board[hod - 1] = iznak
return
def poleznoste(board, znak):
schetchik = 0
index = 0
for i in range(3):
if board[index] == board[index + 1] == board[index + 2] == znak:
schetchik += 5
elif (board[index] == board[index + 1] == znak) and (board[index + 2] != 'O' and board[index + 2] != 'X'):
schetchik += 1
elif (board[index + 1] == board[index + 2] == znak) and (board[index] != 'O' and board[index] != 'X'):
schetchik += 1
elif (board[index] == board[index + 2] == znak) and (board[index + 1] != 'O' and board[index + 1] != 'X'):
schetchik += 1
index += 3
index = 0
for i in range(3):
if board[index] == board[index + 3] == board[index + 6] == znak:
schetchik += 5
elif (board[index] == board[index + 3] == znak) and (board[index + 6] != 'O' and board[index + 6] != 'X'):
schetchik += 1
elif (board[index] == board[index + 6] == znak) and (board[index + 3] != 'O' and board[index + 3] != 'X'):
schetchik += 1
elif (board[index + 3] == board[index + 6] == znak) and (board[index] != 'O' and board[index] != 'X'):
schetchik += 1
index += 1
if board[0] == board[4] == board[8] == znak:
schetchik += 5
elif (board[0] == board[4] == znak) and (board[8] != 'O' and board[8] != 'X'):
schetchik += 1
elif (board[0] == board[8] == znak) and (board[4] != 'O' and board[4] != 'X'):
schetchik += 1
elif (board[4] == board[8] == znak) and (board[0] != 'O' and board[0] != 'X'):
schetchik += 1
if board[2] == board[4] == board[6] == znak:
schetchik += 5
elif (board[2] == board[4] == znak) and (board[6] != 'O' and board[6] != 'X'):
schetchik += 1
elif (board[2] == board[6] == znak) and (board[4] != 'O' and board[4] != 'X'):
schetchik += 1
elif (board[4] == board[6] == znak) and (board[2] != 'O' and board[2] != 'X'):
schetchik += 1
return schetchik
if input("Вы хотите пойти первым? да/нет: ") == 'нет':
iznak = 'O'
cznak = 'X'
computer(board, cznak, iznak)
else:
iznak = 'X'
cznak = 'O'
while True:
drawpole(board)
igrok(board, iznak)
if poleznoste(board, iznak) >= 5:
print("!!!Вы победили!!!")
drawpole(board)
break
computer(board, cznak, iznak)
if poleznoste(board, cznak) >= 5:
print("!!!Я победил!!!")
drawpole(board)
break
a = 0
for i in board:
if i == 'O' or i == 'X':
a += 1
if a == 9:
print("!!!Ничья!!!")
drawpole(board)
break
Если нельзя, то достаточно ли будет увеличить глубину поиска в два раза, что бы компьютер всегда побеждал, или делал ничью?
И можно ли упростить вычисление полезности хода, не перебирать все возможные комбинации, а сделать как-то попроще? (функция poleznoste())