【问题标题】:Turtle Crashing In While Loop乌龟在 While 循环中崩溃
【发布时间】:2021-08-11 11:55:38
【问题描述】:

当我在下面的脚本中初始化 Turtle 时,它​​总是挂起。 我正在使用 Python IDLE 3.9.0a3。我曾尝试将 IDLE 配置添加到 turtle.cfg,但无济于事。 我正在使用的代码是:

from turtle import *
speed(0)

while True:
    penup()
    home()
    setheading(0)
    num = int(input('Number to check?'))
    ang = int(input('Angle to turn?'))
    pendown()
    print(num)
    while True:
        if num % 2 == 0:
            num = num // 2
            print(num)
            right(ang)
        if num == 1:
            break
        if num % 2 != 0:
            num = num * 3
            num = num + 1
            print(num)
            left(ang)

【问题讨论】:

  • 你有两个 while 循环。第一个可以被break语句打断,但是另一个(最外面的)没有办法停止。
  • @flyinthelotion 我能够将break 命令添加到外循环,但 Turtle 仍然挂起。如果起始编号等于程序设置的结束编号,则触发。
  • 如果我在没有第一个 while 循环的情况下运行您的代码(即我只运行一次),它在我的机器上运行良好。究竟是什么问题,程序的期望输出是什么?
  • 它旨在创建一个 Collat​​z 猜想珊瑚(见这里:link)。显然我没有添加颜色变化/笔粗细,但整个想法是它重叠并创建有趣的图案,而不仅仅是创建一条线。它需要循环才能发生。
  • 如果对您有帮助,请接受答案,在此先感谢

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


【解决方案1】:

我在您的代码中更改了一些内容,但它似乎在我的机器上运行

  1. 我添加了forward(),以确保笔实际上移动得更远,而不仅仅是转动。 10 是距离度量,您可以随意使用它。
  2. 我添加了exitonclick()函数,它可以确保当你点击它时乌龟屏幕会关闭

请注意,出于测试目的,此处删除了外部 while 循环,但您可以轻松地将其添加回来。

from turtle import *
speed(0)

penup()
home()
setheading(0)
num = int(input('Number to check?'))
ang = int(input('Angle to turn?'))
pendown()
print(num)
while True:
    if num % 2 == 0:
        num = num // 2
        print(num)
        right(ang)
        forward(10)
    elif num == 1:
        break
    else:
        num = num * 3
        num = num + 1
        print(num)
        left(ang)
        forward(10)
exitonclick()

【讨论】:

  • 我试过了,但 Turtle 仍然挂起......谢谢你的帮助,这可能是代码以外的其他问题。不过,您的重新格式化要好得多!
【解决方案2】:

整个想法是重叠并创造有趣的模式, 不只是创建一条线。它需要在一个循环中 这会发生...我试过了,但 Turtle 仍然挂起...

让我们尝试不同的方法。首先,我们将抛出有问题的while True: 语句。接下来,我们将用户输入视为限制,因此我们将执行所有行直到该数字。我们将使用一个计时器事件来启动每个手臂并允许事件在其间运行,而不是可能导致操作系统问题的非阻塞紧密循环:

from turtle import *

limit = int(input('Limit of check?'))
angle = int(input('Angle to turn?'))

hideturtle()
tracer(False)

candidate = 1

def draw():
    global candidate

    if candidate < limit:

        number = candidate
        pendown()

        while number != 1:

            if number % 2 == 0:
                number //= 2
                right(angle)
                forward(10)
            else:
                number = number * 3 + 1
                left(angle)
                forward(10)

        update()
        penup()
        home()

        candidate += 1
        ontimer(draw, 25)  # milliseconds

draw()

exitonclick()

看看这对你来说是否更好。下一个增强可能是使用海龟的numinput(...) 而不是int(input(...))

【讨论】:

    猜你喜欢
    • 2012-09-08
    • 2018-03-29
    • 2012-06-19
    • 2021-07-09
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    相关资源
    最近更新 更多