海龟在模式中移动(Netlogo)

时间:2017-04-02 18:10:12

标签: design-patterns move netlogo patch

下午好,我试图让我的海龟在一组4个蓝色斑块之间移动。我可以让他们到达那些补丁但是在那之后他们只留在那里,我需要的是他们不断地(按顺序)移动到他们右边的下一个蓝色补丁。我不知道该怎么做。

这是我正在谈论的代码部分:

to move-turtles

    ask turtles 
      [while [[pcolor] of patch-here != blue]
         [
           face min-one-of patches with [pcolor = blue ] [ distance myself ]
           forward 1
         ]
      ]  
    tick
    end

提前,谢谢!

1 个答案:

答案 0 :(得分:1)

你是正确的 - 在while循环中,你的乌龟会被困在他们来到的第一个蓝色补丁上,因为如果他们踏上相邻的补丁,他们会立即想要回到最近的蓝色补丁(他们刚刚离开的那个)。此外,while循环中发生的所有事情都发生在一个滴答中 - 如果您只是希望它们在设置过程中移动到最近的蓝色补丁,只需使用move-to即可。如果他们移动到最近的蓝色补丁 对您很重要,那么使用if语句而不是while可能更好。

此外,您正在描述两种不同的"模式"运动首先,您希望海龟移动到您希望他们遵循的赛道。然后,如果它们在该电路中,您希望它们遵循有序路径,在该路径中,它们瞄准电路中的下一个蓝色补丁,然后移动到该补丁。因此,设置两个单独的程序并在适当的时候调用它们可能更容易。如果海龟知道他们应该去哪里(当前目标)以及他们应该执行哪种运动模式,这可能也会有所帮助。因此,您可以设置turtles-own变量,例如:

turtles-own [
  on-circuit?
  my-target 
]

确保在设置中设置这些变量,使它们不是默认值" 0"未定义的变量:

to setup
  ca
  reset-ticks
  ask (patch-set patch 5 5 patch 5 -5 patch -5 5 patch -5 -5 ) [
    set pcolor blue
  ]

  crt 1  [

    set on-circuit? false   ;;; so a starting turtle knows which movement procedure to use
    set my-target nobody    
    setxy random 30 - 15 random 30 - 15    
    pd
  ]

end

然后,你可以运行你的go程序,这样如果他们的电路在线路上,海龟会试着进入电路吗?"这是错误的,如果他们在线上,他们会走在赛道上?"是的。

to go

  ask turtles [
    ifelse on-circuit? = false [  ;;; do this if turtle is not yet on the circuit
      get-to-circuit
    ]
    [  ;;;  do this if the turtle has been designated as on the circuit
      walk-circuit
    ]
  ]
  tick

end

现在您执行get-to-circuitwalk-circuit程序了。我将向您展示我如何设置get-to-circuit,但看看您是否可以找出walk-circuit的其余部分:

to get-to-circuit

  set my-target min-one-of other patches with [pcolor = blue ] [ distance myself ]
  face my-target
  fd 1
  if distance my-target < 1 [
    move-to my-target 
    ;;; This lets the turtle know it can switch to "walk-circuit" on the next tick 
    set on-circuit? true   
    set heading one-of [ 0 90 180 270 ] 
  ]
end


to walk-circuit
  if  my-target =  nobody [
    set my-target one-of ( other patches with [ pcolor = blue ] ) in-cone 10 180
  ]
?
?
? ...