你是對的 - 與while
循環你的海龜將卡在他們來到的第一個藍色補丁,因爲如果他們踩到鄰近的補丁,他們會立即想要移回到最接近的藍色補丁(一他們剛剛離開)。此外,while循環中發生的所有事情都發生在單個tick中 - 如果您只希望它們移動到最近的藍色補丁作爲您的設置的一部分,請使用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
]
?
?
? ...
它完美!謝謝! –