Ваша проблема в том, что вы не знаете, как заставить пользователя и компьютер чередоваться. Одно из решений состоит в том, чтобы проверить в обработчике событий перемещения пользователя, сделал ли пользователь допустимое перемещение, и если да, и остались ли ходы, сказать компьютеру, чтобы он сделал ход. Я использовал этот подход ниже и упростил ваш код в процессе:
from turtle import Screen, Turtle
from random import choice
moves = [ \
'top left', 'top mid', 'top right', \
'mid left', 'mid mid', 'mid right', \
'bot left', 'bot mid', 'bot right', \
]
def makex(x, y):
t.goto(x, y)
t.pendown()
t.left(45)
t.forward(30)
t.right(180)
t.pendown()
t.forward(60)
t.penup()
t.right(180)
t.forward(30)
t.right(90)
t.forward(30)
t.right(180)
t.pendown()
t.forward(60)
t.penup()
t.setheading(0)
def makeo(x, y):
t.goto(x, y)
t.right(90)
t.forward(30)
t.left(90)
t.pendown()
t.circle(30)
t.penup()
t.setheading(0)
def user(x, y):
valid_move = False
if moves:
# Top row
if 50 < y < 150:
# Top left
if -150 < x < -50:
if 'top left' in moves:
makex(-100, 100)
moves.remove('top left')
valid_move = True
# Top Mid
elif -50 < x < 50:
if 'top mid' in moves:
makex(0, 100)
moves.remove('top mid')
valid_move = True
# Top Right
elif 50 < x < 150:
if 'top right' in moves:
makex(100, 100)
moves.remove('top right')
valid_move = True
# Mid row
elif -50 < y < 50:
# Mid left
if -150 < x < -50:
if 'mid left' in moves:
makex(-100, 0)
moves.remove('mid left')
valid_move = True
# Mid Mid
elif -50 < x < 50:
if 'mid mid' in moves:
makex(0, 0)
moves.remove('mid mid')
valid_move = True
# Mid Right
elif 50 < x < 150:
if 'mid right' in moves:
makex(100, 0)
moves.remove('mid right')
valid_move = True
# Bot row
elif -150 < y < -50:
# Bot left
if -150 < x < -50:
if 'bot left' in moves:
makex(-100, -100)
moves.remove('bot left')
valid_move = True
# Bot Mid
elif -50 < x < 50:
if 'bot mid' in moves:
makex(0, -100)
moves.remove('bot mid')
valid_move = True
# Bot Right
elif 50 < x < 150:
if 'bot right' in moves:
makex(100, -100)
moves.remove('bot right')
valid_move = True
if valid_move and moves:
computer(choice(moves))
def computer(choice):
screen.onscreenclick(None) # disable user during computer move
if choice == 'top left':
makeo(-100, 100)
moves.remove('top left')
elif choice == 'top mid':
makeo(0, 100)
moves.remove('top mid')
elif choice == 'top right':
makeo(100, 100)
moves.remove('top right')
elif choice == 'mid left':
makeo(-100, 0)
moves.remove('mid left')
elif choice == 'mid mid':
makeo(0, 0)
moves.remove('mid mid')
elif choice == 'mid right':
makeo(100, 0)
moves.remove('mid right')
elif choice == 'bot left':
makeo(-100, -100)
moves.remove('bot left')
elif choice == 'bot mid':
makeo(0, -100)
moves.remove('bot mid')
elif choice == 'bot right':
makeo(100, -100)
moves.remove('bot right')
if moves: # reenable user if it's possible to move
screen.onscreenclick(user)
def board_setup():
t.penup()
t.goto(-150, 50)
t.pendown()
t.forward(300)
t.penup()
t.goto(-150, -50)
t.pendown()
t.forward(300)
t.left(90)
t.penup()
t.goto(-50, -150)
t.pendown()
t.forward(300)
t.penup()
t.goto(50, -150)
t.pendown()
t.forward(300)
t.penup()
t.setheading(0)
screen = Screen()
# Define the turtle
t = Turtle()
t.hideturtle()
t.speed('fastest')
board_setup()
computer(choice(moves))
screen.mainloop()
Существует еще одно упрощение кода, которое может быть сделано, но оно того не стоит. Ваше следующее препятствие - добавить логику подсчета очков c, чтобы определить, выиграл ли один из игроков или достиг ли он ничьей.