【问题标题】:Stopping a turtle when it reaches a point, Python当乌龟到达一个点时停止它,Python
【发布时间】:2013-09-22 18:57:23
【问题描述】:

我目前正在上初级编程课程,并且正在完成作业。现在,我必须用模块 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()

【问题讨论】:

  • 您认为乌龟达到那个点有什么具体原因吗?你能算出它需要多少次迭代吗?为什么不只是循环那么长时间?你不能把笔拉起来把乌龟移到那里吗?你真正想做什么?
  • 是的,它在 while 循环中达到了这一点。但是while循环继续进行。所以它一直在制作这些线条:puu.sh/4xkPg.png。我希望线路停在蓝色的顶部。
  • 提示:你知道你想让它做多少行吗?也许你可以写一个公式来告诉你需要多少行。

标签: python python-3.x turtle-graphics


【解决方案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上有很多关于比较浮点数的链接,例如Testing floating point equality。在你的情况下,你可以这样做:

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

【讨论】:

    【解决方案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° 角!),所以我不推荐那个。

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

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

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

    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发生在第8th迭代,所以第8th中途取消,所以7½迭代,向上移动 75 个像素,完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-19
      • 2021-05-06
      相关资源
      最近更新 更多