Основная проблема, которую я вижу, заключается в том, что вы хотите, чтобы черепаха постоянно двигалась, а пользователь программы только менял направление. Я не верю, что вы когда-либо получите этот эффект с бесконечным l oop, например:
while right == True:
forward == False
left == False
backward == False
t.forward(5)
, который полагается на какое-то внешнее событие, чтобы изменить значение right
, но не останавливается, чтобы позволить другие события запускаются. (Плюс неправильное использование ==
против =
.)
Другие проблемы включают в себя:
Игрок может перемещаться только один раз, всегда в одно и то же место из-за ошибки знака:
x = random.randint(-100, -100)
y = random.randint(-100, -100)
Отсутствие необходимых global
утверждений наряду с ==
против =
неправильного использования:
def pen(e=None):
if draw == True:
t.penup()
draw == False
if draw == False:
t.pendown()
draw == True
Вы никогда не должны были бы кодировать столько, сколько делали без тестирования некоторых из этих Основные функции c. Чем больше непроверенного кода вы пишете, тем сложнее его отлаживать.
Ниже приведена моя переделка вашего кода, реализующая постоянное движение черепахи (змея). Я также переместил некоторый связанный с turtle код из царства tkinter в методы turtle. Я упростил некоторые вещи для примера (например, только один набор клавиш движения, стрелки). Но я считаю, что теперь это очень простая c, но играбельная игра:
import tkinter as tk
from turtle import TurtleScreen, RawTurtle
from random import randint
direction = None
score = 0
def spawn():
player = RawTurtle(screen)
player.hideturtle()
player.shape('square')
player.shapesize(0.5)
player.color('black')
player.penup()
x = randint(-100, 100)
y = randint(-100, 100)
player.goto(x, y)
player.showturtle()
players.append(player)
def check_collision():
global score
for player in players:
if turtle.distance(player) < 15:
x = randint(-100, 100)
y = randint(-100, 100)
player.goto(x, y)
score += 1
def f():
global direction
def move():
check_collision()
if direction == 'forward':
turtle.forward(5)
screen.ontimer(move, 100)
if direction != 'forward':
direction = 'forward'
turtle.setheading(90)
move()
def l():
global direction
def move():
check_collision()
if direction == 'left':
turtle.forward(5)
screen.ontimer(move, 100)
if direction != 'left':
direction = 'left'
turtle.setheading(180)
move()
def r():
global direction
def move():
check_collision()
if direction == 'right':
turtle.forward(5)
screen.ontimer(move, 100)
if direction != 'right':
direction = 'right'
turtle.setheading(0)
move()
def b():
global direction
def move():
check_collision()
if direction == 'backward':
turtle.forward(5)
screen.ontimer(move, 100)
if direction != 'backward':
direction = 'backward'
turtle.setheading(270)
move()
def pen():
if turtle.isdown():
turtle.penup()
else:
turtle.pendown()
def quit_game(e=None): # called from either turtle or tkinter
window.destroy()
print("Score:", score)
exit()
players = []
window = tk.Tk()
# window.iconbitmap('py.ico')
window.title("Turtle Graphics")
window.geometry("600x600")
window.resizable(False, False)
canvas = tk.Canvas(master=window, width=500, height=500)
canvas.pack()
tk.Button(window, width=17, text='Close', borderwidth=0, command=quit_game).pack()
screen = TurtleScreen(canvas)
turtle = RawTurtle(screen)
screen.onkey(f, 'Up')
screen.onkey(l, 'Left')
screen.onkey(r, 'Right')
screen.onkey(b, 'Down')
screen.onkey(pen, 'p')
screen.onkey(quit_game, 'Escape')
screen.onkey(spawn, 'g')
screen.listen()
screen.mainloop()