М-да… честно сказать, вам бы пересмотреть ваш алгоритм целиком, там не только проблемы с possible_moves. И комментарии какиенить написать, какая функция что делает, что принимает что возвращает и нахрена это вообще нужно, тогда будет проще разбираться в вашем коде…
Подозреваю что ваша проблема в том что вы сами запутались в своем же коде.
В первом приближении както вот так вроде все более-менее работает, крестики-нолики ставяться, на выигрыш-проигрыш проверяется.
import os
import sys
import time
import copy
WIN=10
LOSE=-10
def score(grid):
if is_go(grid, 'O'): #who wins if end
return WIN, 'O'
elif is_go(grid, 'X'):
return LOSE, 'X'
else:
return 0, 0
def minimax(grid, depth, maximize):
sc, choice = score(grid)
if depth == 0 or sc == WIN or sc == LOSE:
return sc, grid
if maximize:
best = LOSE
moves = possible_moves(grid, 'O')
for i in moves:
v, move = minimax(i, depth-1, False)
if v > best-1:
br = i
best = v
return best, br
else:
best = WIN
moves = possible_moves(grid, 'X')
for i in moves:
v, move = minimax(i, depth-1, True)
if v <= best:
br = i
best = v
return best, br #best end and best brunch
def is_go(grid, value):
if grid[0][0] == value and \
grid[0][1] == value and \
grid[0][2] == value:
return True
if grid[1][0] == value and \
grid[1][1] == value and \
grid[1][2] == value:
return True
if grid[2][0] == value and \
grid[2][1] == value and \
grid[2][2] == value:
return True
if grid[0][0] == value and \
grid[1][0] == value and \
grid[2][0] == value:
return True
if grid[0][1] == value and \
grid[1][1] == value and \
grid[2][1] == value:
return True
if grid[0][2] == value and \
grid[1][2] == value and \
grid[2][2] == value:
return True
if grid[0][0] == value and \
grid[1][1] == value and \
grid[2][2] == value:
return True
if grid[0][2] == value and \
grid[1][1] == value and \
grid[2][0] == value:
return True
return False
def possible_moves(grid, value):
list_of_moves = []
#grid2 = copy.deepcopy(grid)
for row in range(3):
for col in range(3):
grid2 = copy.deepcopy(grid)
if grid[row][col] == '-':
grid2[row][col] = value
list_of_moves.append(copy.deepcopy(grid2))
print('listOfMoves',list_of_moves)
return list_of_moves
def next_m(grid):
sc, game = minimax(grid, 2, True)
if (game == None):
final(sc, [])
sc, value = score(game)
return sc, 'xx', game
def final(sc, grid):
if grid == []:
print ('drawn')
elif sc == LOSE:
print ('You win')
elif sc == WIN:
print ('You lose')
def print_board(grid):
for rows in grid:
print (rows)
def choice():
x=int(input('Enter row'))
y=int(input('Enter column'))
return x,y
def inst():
print ("Players choice is X and my choice is O")
time.sleep(1)
def init(grid):
for r in range(3):
for c in range(3):
grid[r][c] = '-'
def main():
grid = [['-','-','-'],['-','-','-'],['-','-','-']]
inst()
while True:
print_board(grid)
print ("(row, column)\n")
row,col = choice() # вводим "координаты" Х
if grid[row][col] != '-':
print ("Choice filled")
continue
grid[row][col] = 'X'
sc, value = score(grid)
final(sc, grid) # проверяем условия выиграша
sc, value, grid = next_m(grid) #Ход ИИ
final(sc, grid) # проверяем условия выиграша
if __name__ == "__main__":
main()
только чем вам это поможет, свои ошибки вы так и не поняли.
ЗЫ и не бойтесь отладки, даже банальный print(variable) может существенно прояснить ситуацию.