Почему мой экран 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)
621   2  

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:

В своем цикле вы не изменяете свой Num var.

Вы пытаетесь получить доступ к индексу, который не был определен

    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

    Ничего не найдено.