当前位置: 首页 > 知识库问答 >
问题:

为什么我的Python海龟屏幕没有响应

马华茂
2023-03-14

我正在尝试在一只海龟和另一只海龟的鱼线之间创建一个碰撞检测系统。问题是,每当我运行程序时,海龟屏幕都没有响应。我正在使用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个答案

汲灿
2023-03-14

您的代码中有许多错误。

第一

if P1.heading() is 180:

应该是

if P1.heading() == 180:

在您的循环中,您不会更改您的Numvar。

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

    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
蔚和风
2023-03-14

这段代码有一些问题。一个主要的问题是:

if P1.heading() is 180:

操作符测试身份,即,如果两个表达式对同一对象求值,则为真。您不应该使用它来测试两个表达式是否具有相同的值。在这种情况下,P1。heading()返回值为180.0的float对象,因此它不可能与值为180的整数对象是同一个对象。因此,您的if块从未被输入。由于移动海龟的主要命令位于if块的末尾,因此一旦进入while循环,海龟就不会移动。

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

但是,如果您确实更新了n,您将遇到另一个问题:您将尝试索引不存在的列表项,因为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()
 类似资料:
  • 问题内容: 如何使用乌龟图形将图像添加到我的图像? 每当我使用该功能时,我都会不断出错。 龟图形是否有其他方式加载/导入图像? 例如: 问题答案: 该模块确实支持图像,但仅支持GIF图像,不支持PNG或任何其他格式。正如文档所说: name 是gif文件的名称,shape是:安装相应的图像形状。 而且,如果您查看源代码,他们会认真对待“ gif文件”:它通过调用来确定您要添加图像还是多边形的方式显

  • 在1966年,Seymour Papert和Wally Feurzig发明了一种专门给儿童学习编程的语言——LOGO语言,它的特色就是通过编程指挥一个小海龟(turtle)在屏幕上绘图。 海龟绘图(Turtle Graphics)后来被移植到各种高级语言中,Python内置了turtle库,基本上100%复制了原始的Turtle Graphics的所有功能。 我们来看一个指挥小海龟绘制一个长方形的

  • 我在代号一中开发了一个应用程序。在模拟器中,该应用程序可在iPhone和Android手机上运行。现在我在手机上安装了该应用程序。它在不同的Android手机上完美运行。然后我把它安装在一部苹果手机上。我可以安装它,但后来我尝试启动应用程序,并出现一个加载屏幕,它只是加载,没有其他事情发生。 我没有太多更改方法。我只是添加了。 在 方法中,我为 OAuth2 登录名创建登录类的对象,然后将必要的数

  • 我正在做一个装在盒子里的计数器。我试图使这个计数器对不同的屏幕大小做出响应,但由于某些原因,我试图使用的媒体查询将无法工作。 我曾尝试将设备宽度更改为768px以下,但查询对计数器没有影响,我不确定原因。我已经包括了计数器的HTML/PHP代码以及CSS。有人知道为什么它不起作用吗 我已确保此标签包含在文档的标题中。 超文本标记语言: CSS:

  • 在过去一周左右的时间里,我一直在开发一款太空入侵者类型的游戏,它进展得非常顺利,但由于某种原因,当我在我的Windows电脑上运行游戏时(我更喜欢在它上面编写代码),大多数精灵都不会出现,或者只有当它们在屏幕上朝某个方向移动时才会出现。当我在Mac上运行完全相同的代码时,一切都会完美地闪烁和更新。这是pygame无法与Windows相处的已知问题吗?事实上,我的Mac电脑上的一切都正常工作,这让我

  • 我有一个通过Interface Builder定义的布局约束视图。由于它们无法暂时停用,我决定通过拨打以下电话有选择地删除它们: 但是,之后约束仍然驻留在视图中。约束。此外,我还希望以编程方式添加约束(同样,因为我无法(取消)激活它们): 对我的方法的任何调用都会导致变量wasAdded的值NO。这也反映在用户界面上,它根本没有改变。 最后,我既不能以编程方式添加约束,也不能删除添加到情节提要的约