当一个 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
代表一个小时(或任何对您的模型有意义的持续时间)。如果事情在模型中表示的系统中立即发生,那么 loop
或 while
是合适的。但如果它没有立即发生,那么您可以通过递增 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 过程中)。
我要第一个品种(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
代表一个小时(或任何对您的模型有意义的持续时间)。如果事情在模型中表示的系统中立即发生,那么 loop
或 while
是合适的。但如果它没有立即发生,那么您可以通过递增 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 过程中)。