【问题标题】:How to move turtles at the same time and how to avoid collision of turtles?如何同时移动海龟,如何避免海龟碰撞?
【发布时间】:2021-07-28 14:29:37
【问题描述】:

我正在尝试使用海龟来表示道路交叉口。为此,我需要同时从不同方向移动车辆(海龟)。我发现可以使用 ontimer() 方法,但在我的情况下似乎不起作用。这是代码

  dist_1 = random.randint(5,15)
  length_1 = 0
  while length_1<1:  
    for i in range(3):
      for j in range(3):
        vehicles_1[i][j].speed(0)
        vehicles_1[i][j].forward(dist_1)
        length_1 = vehicles_1[i][j].xcor()

  time.sleep(5)
  while length_1<200:  
    for i in range(3):
      for j in range(3):
        vehicles_1[i][j].forward(dist_1)
        length_1 = vehicles_1[i][j].xcor()
  screen.ontimer(Moving_vehicles_1, 100)

def Moving_vehicles_2(vehicles_2):
  dist_2 = random.randint(5,15)
  length_2 = 0
  while length_2>80:  
    for i in range(3):
      for j in range(3):
        vehicles_2[i][j].speed(0)
        vehicles_2[i][j].forward(dist_2)
        length_2 = vehicles_2[i][j].ycor()

  time.sleep(5)
  while length_2>-150:  
    for i in range(3):
      for j in range(3):
        vehicles_2[i][j].forward(dist_2)
        length_2 = vehicles_2[i][j].ycor()
  screen.ontimer(Moving_vehicles_2, 100)

所以基本上我正在创建两组车辆。他们应该移动一定距离并停止一段时间,然后他们应该开始移动。这应该同时发生。

我还需要避免海龟的碰撞。如果你如何做到这一点,请提及。

请提供您知道的任何解决方案或源链接。提前致谢。

编辑 1:我知道 NetLogo 可以用来避免冲突,但我实际上不知道如何导入和使用它。

【问题讨论】:

    标签: python turtle-graphics python-turtle


    【解决方案1】:

    很难专门突然修复你的代码,但是如果你想移动没有碰撞的乌龟,例如,你也可以使用下面的代码,让乌龟检查前进状态,如果它是空的单元格,然后将其设置为 1 等,使用您选择的变量,例如[set okgo 1] 在这种情况下。在下面的 ask 语句中,如果 okgo 变量的状态为 1,您可以告诉他们 go [forward 1]。这个过程必须在每个滴答声中执行。

    globals [okgo]
    ;omit
    
    to go
      ask turtles with [xcor < max-pxcor][
        ifelse not any? turtles-on patch-ahead 1
          [set okgo 1]
        [set okgo 0]
      ]
    
    ;omit
    
      ask turtles [if okgo = 1 ;
        [if not any? turtles-on patch-ahead 1
          [forward 1]
      ]]
    end
    

    【讨论】: