баг в функциях в "крестики-нолики" на python
я новичок пишу первые крестики-нолики и возникает целый ворох багов,которые я не понимаю как решать. похоже на логическую ошибку, но я в упор её не вижу.
- когда пользователь вводит 'y', то он делает и ход, после чего выходит ошибка:
cannot access local variable i where is not associated with value
при этом, если пользователь вводит 'n', то такой проблемы не возникает и компьютер делает ход
- после того, как победителем объявлен пользователь, компьютер всё равно делает ход и после этого победитель объявляется снова. а потом программа бесконечно просит сделать ход. кроме того, ничья не объявляется впринципе
про тупость компьютере писать не надо, я решила сделать болванку, которая просто работает, а доработать её потом. но застряла уже на этом этапе((
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')
```