当一个 while 循环停止其他一切时,如何让其他程序进入 运行

how to get other procedures to run when one has a while loop which stops everything else

我要第一个品种(UAV2)找个圆转黑。然后让第二个品种(补给品)去那个圈子把它变成蓝色。

我发现供应品种不会持续移动,除非它处于 'loop' 或 'while' 中。从某种意义上说,这两种方法都起作用,即供应在正确的时间进入圆圈,但滴答停顿,就像移动的无人机在移动时一样。我希望 uav2 在供应移动时发现新的圈子以查看行为。

请帮忙!我可能在如何让它移动方面走错了路。

to collide2
 set y one-of circles2 in-radius 1 with [color = orange]
set z one-of uav2s in-radius 1
if y != nobody [
  ask y [set color black
 if  color = black[
     ask one-of supplies [send-supplies]
  ]
]]
end

 to send-supplies
 face y
while [distance y > 1]
 [ fd 0.01] 
 if distance y < 1
  [move-to y
    ask y [set color  blue]
    stop ]

假设每个 tick 代表一个小时(或任何对您的模型有意义的持续时间)。如果事情在模型中表示的系统中立即发生,那么 loopwhile 是合适的。但如果它没有立即发生,那么您可以通过递增 ticks 计数器来逐步推进。

在你的情况下,我怀疑你想要的是无人机请求补给,但大概补给需要一些时间(因此需要多次滴答)才能到达无人机。我无法从您的代码中分辨出 y 和 z 是什么。但您可能想要更像:

supplies-own
[ providing?
  provide-target
]

to go
  ...
  send-supplies
  ...
  tick
end

to collide2
  ...
    ask one-of supplies with [not providing?]
    [ set providing? true
      set provide-target y
    ]
  ...
end

to send-supplies
  ask supplies with [providing?]
  [ face provide-target
    ifelse distance provide-target > 1
    [ fd 0.01 ]       ; this seems like a very small step to me
    [ move-to provide-target
      ask provide-target [set color blue]
      set providing? false
    ]
  ]
end

所以这里的想法是供应品种有一个 true/false 变量来表示它当前是否在供应 运行 上(我称这个变量为 'providing?')。当碰撞发生时,UAV 要求其中一个尚未在补给 运行 上的补给开始补给 运行 提供该 UAV。该耗材设置其变量以表明它现在处于供应状态 运行 并且还设置变量以表明耗材的去向。

在您的 go 过程中,每一次 tick 所有供应 运行s 都会移动(因为对移动它们的过程的调用是在 go 过程中)。