【问题标题】:Running turtles simultaneously with turtle graphics与海龟图形同时运行海龟
【发布时间】:2012-05-17 03:58:37
【问题描述】:

如何让 4 只不同的海龟同时移动?另外,如何为Turtle.shape方法制作人形?我知道有一个名为 register_shape 的 Screen 方法,但我找不到任何关于它的文档。

def turtles(self, base):
    self.t4.goto(self.tFirst)
    self.t1.goto(self.tSecond)
    self.t2.goto(self.tThird)
    self.t3.goto(self.tHome)
    if base >= 2:
        self.t4.goto(self.tSecond)
        self.t1.goto(self.tThird)
        self.t2.goto(self.tHome)
    if base >= 3:
        self.t4.goto(self.tThird)
        self.t1.goto(self.tHome)
    if base == 4:
        self.t4.goto(self.tHome)

tFirsttSecondtThird 是位置,t1t2t3t4 是海龟。我希望所有的海龟齐声移动。

【问题讨论】:

    标签: python turtle-graphics


    【解决方案1】:

    这是register_shape的文档

    至于你的第一个问题,我不确定你的意思。我的第一个想法是让它们都在单独的线程中移动,但即便如此,它们在技术上也不会同时移动。我从来没有真正使用过海龟图形,但只是知道这个概念。

    这和你所说的很接近

    import turtle
    import numpy as np
    
    tlist = list()
    colorlist = ["red", "green", "black", "blue", "brown"]
    for i in xrange(5):
        tlist.append(turtle.Turtle(shape="turtle"))
        tlist[i].color(colorlist[i])
        tlist[i].speed(1)
    screen = turtle.getscreen()
    for i in xrange(100):
        screen.tracer(1000)
        for t in tlist:
            t.right((np.random.rand(1) - .5) * 180)
            t.forward(int((np.random.rand(1) - .5) * 100))
        screen.update()
    

    import turtle
    #import numpy as np
    from time import sleep
    
    tlist = list()
    colorlist = ["red", "green", "black", "blue", "brown"]
    for i in xrange(5):
        tlist.append(turtle.Turtle(shape="turtle"))
        tlist[i].color(colorlist[i])
        tlist[i].speed(1)
    screen = turtle.getscreen()
    for i in xrange(100):
        screen.tracer(1000)
        for i, t in enumerate(tlist):
            #t.right((np.random.rand(1) - .5) * 180))
            t.right(33 * i)
            #t.forward(int((np.random.rand(1) - .5) * 100))
            t.forward(50 * i)
        sleep(1)
        screen.update()
    

    【讨论】:

    • 我想和球员一起制作一个运动场图形,所以我需要让他们每个人同时朝不同的方向移动。
    • 你也可以尝试延迟动画更新,让它们看起来同时移动turtle.update
    • 我认为更新不会有帮助。另外,我正在运行python 3.2,延迟是一种屏幕方法,在以前的版本中可能有所不同。我调用了延迟,它改变了动画的时间,而不是动画之间的时间。所以 screen.delay(200) 用了 200 毫秒,而 screen.delay(5) 用了 5 毫秒,而且海龟还是分开的。谢谢你的帮助
    • 您可能应该接受人们之前帮助您解决的所有问题的答案。或者至少提供反馈,说明您为什么不接受它们。如果您从不接受答案,人们将停止回答您的问题
    • 抱歉,我尝试了您的建议,但更新和延迟方法似乎对使动画看起来连续没有用处,但感谢您的帮助。
    【解决方案2】:

    我想我会提供这种可能性。我最近也想让我的所有海龟一起跳舞,最接近的方法是创建一个包含所有海龟对象的列表,然后遍历该列表。

    诚然,这让他们一次移动一个,但在所有人都迈出第一步之前,他们不会再迈出第二步。

    我在这里为您编写了一个完整的程序,只是为了演示它的外观。如果这不是您要找的东西,我深表歉意,但至少它是解决其他人另一个问题的可能解决方案。

    import turtle
    import random
    wn = turtle.Screen()
    
    bob = turtle.Turtle()
    mary = turtle.Turtle()
    fred = turtle.Turtle()
    jane = turtle.Turtle()
    
    turtles = [bob, mary, fred, jane]
    
    for move in range(10):
        for item in turtles:
            item.left(random.randrange(-180, 180))
            item.forward(50)
    
    wn.exitonclick()
    

    【讨论】:

      【解决方案3】:

      试试这个代码:

      import turtle
      import threading
      
      window = turtle.Screen()
      window.bgcolor("red")
      
      
      class myTurtle (threading.Thread):
          def __init__(self,init_angle):
              threading.Thread.__init__(self)
              self.noel = turtle.Turtle()
              self.noel.rt(init_angle)
              self.init_angle = init_angle
          def run(self):
              for self.i in range(self.init_angle,self.init_angle + 9):
                  for self.j in range(4):
                      self.noel.fd(100)
                      self.noel.rt(90)
                      self.noel.rt(1)
      
      
      t1 = myTurtle(0)
      t2 = myTurtle(90)
      
      t1.start()
      t2.start()
      window.exitonclick()
      

      【讨论】:

        【解决方案4】:

        要让所有海龟同时移动(如果我对问题的理解正确的话),您需要使用tracer() 方法。

        turtle.tracer(
            (First number is how many frames go by before turtle updates the screen),
            (second number is a delay in milliseconds)
        )
        

        因为每次任何海龟移动时海龟都会更新屏幕,所以跟踪器是让它们同时移动的方法。通常turtle.tracer(0, 20) 应该没问题或turtle.tracer(1, 20)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-05-30
          • 2014-03-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多