下午好,我试图让我的龟一组的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循环一切的单一蜱内发生,如果你只是希望他们移动到最近的蓝色补丁作为您设置的一部分,只需使用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-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
]
?
?
? ...