当乌龟到达某一点时阻止它,Python

2024-05-12 05:41:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在正在上一个程序设计课,我正在复习作业。现在,我要用海龟模块造三个房子(我完成了):

def drawBody(mover):
    #Rectangle part
    mover.fillcolor("blue")
    mover.begin_fill()
    for i in range(2):
        mover.forward(100)
        mover.right(90)
        mover.forward(75)
        mover.right(90)
    mover.end_fill()


    #Triangle part
    mover.fillcolor("red")
    mover.begin_fill()
    mover.left(45)
    for i in range(2):
        mover.forward(70.5)
        mover.right(90)
    mover.right(45)
    mover.forward(100)
    mover.end_fill()







#Create preproduction turtle
import turtle
wn = turtle.Screen()
josh = turtle.Turtle()


pointGoTo = -175
for houses in range(3):
    josh.penup()
    josh.goto(pointGoTo,0)
    josh.pendown()

    drawBody(josh)


    josh.right(180)
    pointGoTo = pointGoTo + 125

wn.exitonclick()

这是while代码。所以我想让乌龟停在某个点,红广场的左上角。我试过多个点,但没有中断/停止。我的语法错了吗?还是我把这整条房子都搞错了?如果我含糊其辞,请问你不明白的地方,我真的很想弄清楚,但我已经没有办法了

^{pr2}$

Tags: inrightforrangefillmoverforwardbegin
2条回答

在这里你需要一个停止状态。在

while True:
    mover.forward(100)
    n = mover.position()
    print(n)
    mover.left(90)
    mover.forward(5)
    mover.left(90)
    n = mover.position()
    print(n)
    mover.forward(100)
    mover.right(90)
    mover.forward(5)
    mover.right(90)

您可以尝试使用移动器的位置,也可以计算它必须移动的次数。在

如果你使用移动器的位置,你必须计算出从正方形开始的位置偏移,以及你要往哪个方向移动(尤其是当你以30°的角度!),所以我不建议这样。在

相反,你可以说正方形(蓝色,btw,而不是红色)是75px高,并且每次迭代向上移动10,所以你需要7½次迭代。如果你有一个完整的迭代次数,比如8次,你本可以完成的

^{pr2}$

它计算迭代0..7(从0到7有8个数字),并且每次都进行一次迭代。我们希望在最后的8次迭代中打破循环,这很容易,因为我们有break关键字和range中的i变量跟踪迭代次数:

for i in range(8):
    mover.forward(100)
    n = mover.position()
    print(n)
    mover.left(90)
    mover.forward(5)
    mover.left(90)
    n = mover.position()
    print(n)

    if i == 7:
        break

    mover.forward(100)
    mover.right(90)
    mover.forward(5)
    mover.right(90)

注意,i == 7发生在8第次次迭代中,因此第8次迭代被取消一半,因此完成7½次迭代,向上移动75个像素。在

首先,你查错地方了,你得在这里查一下:

while True:
    mover.forward(100)

    mover.left(90)
    mover.forward(5)
    mover.left(90)
    n = mover.position()

    if abs(n - (-75.30, 0.00)) < 0.01:
        break

    mover.forward(100)
    mover.right(90)
    mover.forward(5)
    mover.right(90)

您的检查没有成功,因为n实际上是turtle.Vec2D,坐标是float,如果您这样做,print n[0], n[1],您可以看到它。关于比较浮动有很多链接,比如Testing floating point equality。在您的情况下,您可以:

^{pr2}$

但我认为,对你来说,最好的方法就是画固定的次数:

mover.left(90)
mover.forward(70)
mover.left(90)
for i in xrange(7):
    mover.forward(100)
    mover.left(90)
    mover.forward(5)
    mover.left(90)

    mover.forward(100)
    mover.right(90)
    mover.forward(5)
    mover.right(90)

您还必须像这样更改代码:

for houses in range(3):
    josh.penup()
    josh.goto(pointGoTo,0)
    josh.pendown()

    drawBody(josh)

    pointGoTo = pointGoTo + 125

相关问题 更多 >