баг в функциях в "крестики-нолики" на python

я новичок пишу первые крестики-нолики и возникает целый ворох багов,которые я не понимаю как решать. похоже на логическую ошибку, но я в упор её не вижу.

  1. когда пользователь вводит 'y', то он делает и ход, после чего выходит ошибка:
cannot access local variable i where is not associated with value

при этом, если пользователь вводит 'n', то такой проблемы не возникает и компьютер делает ход

  1. после того, как победителем объявлен пользователь, компьютер всё равно делает ход и после этого победитель объявляется снова. а потом программа бесконечно просит сделать ход. кроме того, ничья не объявляется впринципе

про тупость компьютере писать не надо, я решила сделать болванку, которая просто работает, а доработать её потом. но застряла уже на этом этапе((

board = []
tie = (0, 1, 2, 3, 4, 5, 6, 7, 8)
def instr():
    print('''hi, its guide for tic-tie-toe
you have a board like this:

0 | 1 | 2
---------
3 | 4 | 5
---------
6 | 7 | 8

for make a move press 1-9. i think its enough
''')
def new_board():
    global board
    for i in range(9):
        board.append(i)
def main_board():
    print(board[0], '|', board[1], '|', board[2])
    print('-' * 9)
    print(board[3], '|', board[4], '|', board[5])
    print('-' * 9)
    print(board[6], '|', board[7], '|', board[8])
def ask_y_n(response):
    response = ''
    while response != 'y' and response != 'n':
        response = input('yes or no?(y/n): ')
    return response
def turns():
   response = ask_y_n('do you want to be first?: ')
   global human, computer
   if response == 'y':
       human = 'X'
       computer = 'O'
       print('its your move')
   if response == 'n':
        computer = 'X'
        human = 'O'
        print('its my move')
   return human, computer
def legal_move():
    move = []
    for i in range(9):
        if board[i] != 'X' and board[i] != 'O':
            move.append(board[i])
def winner():
    legal = legal_move()
    WAY_WIN = ((0, 1, 2),
               (3, 4, 5),
               (6, 7, 8),
               (0, 3, 6),
               (1, 4, 7),
               (2, 5, 8),
               (0, 3, 4),
               (2, 4, 6))
    for row in WAY_WIN:
        if board[row[0]] == 'X' and board[row[1]] == 'X' and board[row[2]] == 'X':
            print('\nX IS WINNER!!')
        elif board[row[0]] == 'O' and board[row[1]] == 'O' and board[row[2]] == 'O':
            print('\nO IS WINNER!!') #сильно сбоит эта функция, повторяется 2 раза
        elif legal == 0 : #error in here
            print('its draw((')
         
def human_move():
    legal = legal_move()
    side = human
    move = int(input('your move is: '))
    while move not in legal:
        move = int(input('your move is: ')) 
    board[move] = side
def computer_move():
    legal = legal_move() #почему-то что-то ломается здесь, когда я делаю ход
    side = computer      #кроме того, ии слабый, он не предсказывает действия игрока и ходит по схеме
    move = 0
    tem = []
    cool_moves = [4, 1, 5, 7, 3, 0, 2, 6, 8]
    if side == 'X':
        for i in cool_moves:
            if i in legal:
                tem.append(i)
                board[tem[0]] = side
    if side == 'O':
         if i in legal:
                tem.append(i)
                board[tem[0]] = side
def new_turn(turn):
    if turn == 'X':
        return 'O'
    else:
        return 'X'
def main():
    instr()
    new_board()
    human, computer = turns()
    turn = 'X'
    while not winner(): #что-то с этим условием, после объявления победителя просит сделать ход
        legal_move()
        if turn == human:
            human_move()
            main_board()  
        elif turn == computer:
            computer_move()
            main_board()
        turn = new_turn(turn)

    print('congrats')
main()
input('press enter to leave')
            
        ```

Ответы (0 шт):