为什么我的 Python Turtle Screen 没有响应

Why is My Python Turtle Screen not responding

我正在尝试创建一个海龟和另一只海龟线之间的碰撞检测系统。问题是每当我 运行 程序时,海龟屏幕不会 respond.I 使用 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)

你的代码有很多错误。

首先,

if P1.heading() is 180:

应该是

if P1.heading() == 180:

在您的循环中,您不会更改 Num 变量。

您正在尝试访问未定义的索引

    x2[n] = XC
    y2[n] = YC

你的逻辑在那个 for 循环中也没有多大意义。

在这里,我做了一些更正,并添加了一个计时器,这样您就可以看到您的海龟是如何移动的。这应该可以帮助您想象自己在做什么

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

该代码存在一些问题。一个主要的是这一行:

if P1.heading() is 180:

is 运算符测试同一性,即,如果两个表达式的计算结果为同一对象,则为 True。您不应该使用它来测试两个表达式是否具有相同的值。在这种情况下,P1.heading() returns 值为 180.0 的 float 对象,因此它不可能与值为 180 的整数对象是同一个对象。因此您的 if 块永远不会进入。由于移动海龟的主要命令位于 if 块的末尾,因此进入 while 循环后海龟不会移动。

此外,您正在使用 n 索引您的列表,但您从未从零更新 n,因此您要保存的所有坐标都被写入第一项的名单。

但是,如果您 做了 更新 n 您会 运行 陷入另一个问题:您将尝试索引列表项t 存在,因为 x1y1 的长度为 1,而 x2y2 的长度为零。

无论如何,这是您的代码的简化版本,可以正确更新列表,并进行简单的碰撞检测。它只检测精确碰撞,而不是近似碰撞,但它应该让你朝着正确的方向前进。

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()