Почему мой экран Python Turtle не отвечает
Я пытаюсь создать систему обнаружения столкновений между черепахой и линией другой черепахи. Проблема в том, что всякий раз, когда я запускаю программу, экран черепахи не отвечает.Я использую Pycharm и Python. Пожалуйста, Помогите!
import turtle
Screen = turtle.Screen()
P1 = turtle.Turtle()
P2 = turtle.Turtle()
Screen.screensize(100, 100)
x1 = []
x2 = []
y1 = []
y2 = []
P1.penup()
P1.setheading(180)
P2.setheading(90)
P1.goto(100, 50)
P2.penup()
P2.goto(50, 0)
P2.pendown()
P1.pendown()
n = 0
Num = 0
XC = P2.position()[0]
YC = P2.position()[1]
x1.append(XC)
y1.append(YC)
while Num == 0:
XC = P2.position()[0]
YC = P2.position()[1]
x1[n] = XC
y1[n] = YC
if P1.heading() is 180:
XC = P2.position()[0]
YC = P2.position()[1]
x2[n] = XC
y2[n] = YC
P1.position()
XC1 = P1.position()[0]
YC1 = P1.position()[1]
for x in range(0, n):
for z in range(x1.index(x), x2.index(x)):
if abs(z-YC1)<10:
print("Found")
P2.forward(1)
P1.forward(0.5)
2 ответов:
С этим кодом есть несколько проблем. Одной из главных является следующая строка:
if P1.heading() is 180:Оператор
isпроверяет тождество, то есть это верно, если два выражения вычисляют один и тот же объект. Вы не должны использовать его для проверки, если два выражения имеют одинаковое значение. В этом случаеP1.heading()возвращает объектfloatсо значением 180.0, поэтому он никак не может быть тем же объектом, что и объект integer со значением 180. Таким образом, ваш блокifникогда не вводится. И так как основные команды, которые двигаются черепахи находятся в конце блокаif, черепахи не двигаются, как только вы входите в циклwhile.Кроме того, вы используете
nдля индексирования в своих списках, но никогда не обновляетеnс нуля, поэтому все координаты, которые вы хотите сохранить, записываются в первые элементы списков.Однако, если вы сделали обновление
n, вы столкнетесь с другой проблемой: вы попытаетесь индексировать элементы списка, которые не существуют, так какx1иy1имеют длину один, иx2иy2имеют нулевую длину.В любом случае, вот упрощенная версия вашего кода, которая правильно обновляет списки и делает простое обнаружение коллизий. Он обнаруживает только точное столкновение, а не приблизительное столкновение, но он должен заставить вас двигаться в правильном направлении.
import turtle Screen = turtle.Screen() Screen.screensize(100, 100) P1 = turtle.Turtle() P2 = turtle.Turtle() x1 = [] x2 = [] y1 = [] y2 = [] P1.penup() P1.setheading(180) P2.setheading(90) P1.goto(100, 50) P2.penup() P2.goto(50, 0) P2.pendown() P1.pendown() while True: print(P1.heading() is 180) XC = P2.position()[0] YC = P2.position()[1] x2.append(XC) y2.append(YC) XC = P1.position()[0] YC = P1.position()[1] x1.append(XC) y1.append(YC) if XC in x2 and YC in y2: print("Found") P2.forward(1) P1.forward(0.5) turtle.done()
В вашем коде много ошибок.
Во-первых,
if P1.heading() is 180:Должно быть
if P1.heading() == 180:В своем цикле вы не изменяете свой
Numvar.Вы пытаетесь получить доступ к индексу, который не был определен
x2[n] = XC y2[n] = YCВаша логика также не имеет большого смысла в этом цикле.
Здесь я внес некоторые поправки и включил таймер, чтобы вы могли видеть, как двигаются ваши черепахи. Это должно помочь вам визуализировать то, что вы делаетеimport time import turtle Screen = turtle.Screen() P1 = turtle.Turtle() P2 = turtle.Turtle() Screen.screensize(100, 100) P1.penup() P1.setheading(180) P2.setheading(90) P1.goto(100, 50) P2.penup() P2.goto(50, 0) P2.pendown() P1.pendown() time.sleep(1) n = 100 if P1.heading() == 180: for x in range(0, n): print(P1.position()) print(P2.position()) if abs(P1.position()[1] - P2.position()[1]) > 10: time.sleep(.3) P2.forward(1) P1.forward(.5) else: print('Found') break
Comments