2

我目前正在上初级编程课程,并且正在完成作业。现在,我必须用模块 turtle 制作 3 个房子(我完成了):

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代码。所以我想让乌龟停在某个点,红色方块的左上角。我已经尝试了多个点,但只是没有中断/停止。我的语法关闭了吗?还是我在接近整条房子的时候都错了?如果我含糊不清,请问您不明白什么,我真的很想弄清楚这一点,但是我一无所知。:

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

    mover.left(90)
    mover.forward(75)
    mover.left(90)
    n = mover.position()
    print(n)
    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)


        if n == (-75.30,0.00):
            break







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

2 回答 2

1

首先,你在错误的地方检查,你必须在这里检查:

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,并且坐标是浮动的,如果您这样做,您可以看到它print n[0], n[1]。SO上有很多关于比较浮点数的链接,例如测试浮点相等性。在您的情况下,您可以执行以下操作:

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

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

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
于 2013-09-22T10:57:23.980 回答
0

在这里你想要一个停止条件。

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° 角!),所以我不建议这样做。

相反,您可以说正方形(蓝色,顺便说一句,不是红色)高 75 像素,每次迭代向上移动 10,因此您需要 7½ 次迭代。如果你有整数次迭代,比如 8 次,你可以完成

for i in range(8):
    mover.forward(100)
    n = mover.position()
    ...

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

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 个像素。

于 2013-09-22T10:44:46.840 回答