【问题标题】:is it possible to make this python turtle image code shorter?是否有可能使这个 python 乌龟图像代码更短?
【发布时间】:2021-11-03 20:02:38
【问题描述】:

这是我目前的代码,有没有办法让代码更小,这样你就不必在每一个动作中都输入,以及如何移动整个图像,因为我没有足够的空间放置剩余的图像的一部分。我已经尝试过更改 screen.setworldcoordinates 的值,但我再也看不到图像了。

from turtle import *
screen = Screen()
screen.clear()
screen.screensize(200, 200)
screen.setworldcoordinates(-250, -250, 350, 250)

alex = Turtle()
alex.shape("turtle")
alex.speed(10)

alex.forward(30)
alex.left(90)
alex.forward(30)
alex.right(90)
alex.forward(30)
alex.right(90)
alex.forward(60)
alex.left(90)
alex.forward(30)
alex.left(90)
alex.forward(30)
alex.right(90)
alex.forward(30)
alex.left(90)
alex.forward(30)
alex.left(90)
alex.forward(30)
alex.right(90)
alex.forward(30)
alex.right(90)
alex.forward(60)
alex.left(90)
alex.forward(30)
alex.left(90)
alex.forward(30)
alex.right(90)
alex.forward(30)
alex.right(90)
alex.forward(30)
alex.left(90)
alex.forward(30)
alex.right(90)
alex.forward(30)
alex.right(90)
alex.forward(60)
alex.left(90)
alex.forward(30)
alex.left(90)
alex.forward(30)
alex.right(90)
alex.forward(30)
alex.right(90)
alex.forward(30)
alex.left(90)
alex.forward(30)
alex.right(90)
alex.forward(30)
alex.right(90)
alex.forward(60)
alex.left(90)
alex.forward(30)
alex.left(90)
alex.forward(30)
alex.right(90)
alex.forward(60)

【问题讨论】:

    标签: python turtle-graphics python-turtle


    【解决方案1】:

    由于您总是以 30 步为单位移动,因此唯一的变化是在转弯处(左、右或无)。所以,你可以在每一步前执行一串转向指令来驱动海龟:

    from turtle import *
    
    alex = Turtle()
    alex.shape("turtle")
    alex.speed(10)
    alex.up()
    alex.setx(-window_width()//2) # start on left side of window
    alex.down()
    
    
    turns = "-LRR-LLRLLRR-LLRRLRR-LLRRLRR-LLR-LRR-LLRLLRR-LLRLLRR-LLRRLRR-LLR"
    for turn in turns:
        if turn=="L":alex.left(90)
        if turn=="R":alex.right(90)
        alex.forward(30)
    

    这个特定的模式也可以递归获得(像分形):

    def pattern(turns,n,step=30,angle=90):
        if not n: return alex.forward(step)
        for turn in turns:
            if turn=="L":alex.left(angle)
            if turn=="R":alex.right(angle)
            pattern(turns,n-1,step,angle)
    
    pattern("-LRR-LLR",2)
    

    您可以使用更深层次的递归或不同的转弯顺序或角度来使用模式功能来获得有趣的图纸:

    pattern("-LRR-LLR",3,10)
    pattern("-LRRL-",4,3)
    pattern("-LRRL",4,8)
    pattern("-LRR-RRR-",3,15)
    pattern("-LRR-LLR-",3,20,angle=120)
    pattern("-RRRLLLLLLRRR-",2,10,angle=45)
    pattern("-LR-R-R-RR",3,20)
    pattern("-LRRRLLLLRRRL",3,3,75)
    pattern("-LRRRLLLLRRRL",4,2,75)
    

    【讨论】:

    • 非常感谢!但是 L 和 R 之间的破折号是什么意思?
    • 由于破折号既不是 L 也不是 R,它们代表“不转”。这些将使乌龟在当前方向上多走一步。这对应于您的 alex.forward(60) 呼叫,即“不要转弯”+“前进(30)”
    【解决方案2】:

    您可以将所有海龟的动作放在一个文件中,让您的程序读取并解析文件并执行动作。

    文件格式,可以是:

    left 90
    forward 30
    

    或:

    l90
    f30
    

    或者你也可以发明一个 json 格式并练习 json。

    【讨论】:

    • 为什么不举个例子呢?我认为您的意思是 use 而不是 invent
    • 我展示了两个文件格式的示例?是的,使用json,但是发明了他自己的json格式。在这种情况下,我不会给出任何 python 代码示例,从长远来看,这对他/她没有帮助。
    • 也许,也许这对他们没有帮助(也许如果你详细解释?不知道),这似乎有点值得商榷,但公平地说,他们已经展示了他们的尝试?部分;所以...否则答案没有太大的价值,它可能只是使用文件的评论,但正如我所说,给定的案例有点值得商榷
    • 我同意,应该是评论。
    【解决方案3】:

    我将采用一种更简单、更简洁的方法。如果我们检查曲线,我们会发现它是由一条更简单的曲线的重复组成的:

    唯一不同的是海龟开始绘制这个形状时的方向。因此,如果我们可以封装绘制这个形状的代码,我们就可以大大简化和缩短我们的程序:

    from turtle import Screen, Turtle
    
    def wave():
        alex.forward(30)
        alex.left(90)
        alex.forward(30)
        alex.right(90)
        alex.forward(30)
        alex.right(90)
    
        alex.forward(60)
    
        alex.left(90)
        alex.forward(30)
        alex.left(90)
        alex.forward(30)
        alex.right(90)
        alex.forward(30)
    
    screen = Screen()
    screen.setup(500, 500)
    
    alex = Turtle()
    alex.shape('turtle')
    alex.speed('fastest')
    
    alex.penup()
    alex.setx(-250)
    alex.pendown()
    
    for angle in (0, 90, -90, -90, 0, 90, 90, -90):
        alex.left(angle)
        wave()
    
    screen.exitonclick()
    

    我并不是说这是最好的方法,而是说减少任何程序大小的第一步是在代码和数据中寻找模式,看看你是否可以在更大的概念块中工作。

    如何移动整个图像,因为我没有足够的空间放置 图片的剩余部分

    您不需要setworldcoordinates(),问题是当您真正需要setup() 时,您调用了screensize()(做别的事情)。然后可以使用setx() 将海龟移动到窗口左侧:

    【讨论】:

      猜你喜欢
      • 2014-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      相关资源
      最近更新 更多