海龟以一种模式移动 (Netlogo)
Turtles moving in a pattern (Netlogo)
下午好,我正在尝试让我的海龟在一组 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
提前,谢谢!
你是对的 - 使用 while
循环你的海龟将卡在它们到达的第一个蓝色块上,因为如果它们踏上相邻的块,它们会立即想要移回最近的块蓝色补丁(他们刚离开的那个)。此外,while 循环中发生的所有事情都发生在一个 tick 内——如果您只是希望它们作为设置的一部分移动到最近的蓝色补丁,只需使用 move-to
。如果他们移动到最近的蓝色补丁 对你来说 很重要,那么在这里使用 if
语句可能比 while
更好。
此外,您还描述了两种不同的 "modes" 运动。首先,您希望海龟移动到您希望它们遵循的回路。然后,如果他们在该电路中,您希望他们遵循一条有序路径,在该路径中他们瞄准电路中的下一个蓝色补丁,然后移动到该补丁。因此,设置两个单独的过程并在适当的时间调用它们可能更容易。如果海龟知道它们下一步应该去哪里(当前目标)以及它们应该执行哪种移动模式,这可能也会有所帮助。因此,您可以设置 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
程序,如果它们的 "on-circuit?" 为假,海龟将尝试进入电路,如果它们的 "on-circuit?" 它们将走电路"on-circuit?" 是真的。
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-circuit
和 walk-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
]
?
?
? ...
下午好,我正在尝试让我的海龟在一组 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
提前,谢谢!
你是对的 - 使用 while
循环你的海龟将卡在它们到达的第一个蓝色块上,因为如果它们踏上相邻的块,它们会立即想要移回最近的块蓝色补丁(他们刚离开的那个)。此外,while 循环中发生的所有事情都发生在一个 tick 内——如果您只是希望它们作为设置的一部分移动到最近的蓝色补丁,只需使用 move-to
。如果他们移动到最近的蓝色补丁 对你来说 很重要,那么在这里使用 if
语句可能比 while
更好。
此外,您还描述了两种不同的 "modes" 运动。首先,您希望海龟移动到您希望它们遵循的回路。然后,如果他们在该电路中,您希望他们遵循一条有序路径,在该路径中他们瞄准电路中的下一个蓝色补丁,然后移动到该补丁。因此,设置两个单独的过程并在适当的时间调用它们可能更容易。如果海龟知道它们下一步应该去哪里(当前目标)以及它们应该执行哪种移动模式,这可能也会有所帮助。因此,您可以设置 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
程序,如果它们的 "on-circuit?" 为假,海龟将尝试进入电路,如果它们的 "on-circuit?" 它们将走电路"on-circuit?" 是真的。
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-circuit
和 walk-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
]
?
?
? ...