Вы можете использовать либо переменную, которая указывает, является ли целью кролик, либо использовать links
, чтобы выполнить то же самое.
Ссылочный подход
Проверьте эту модифицированную версию вашего setup
, у которого охотники установили для rab-in-sight
значение nobody
:
breed [hunters hunter]
breed [rabbits rabbit]
hunters-own [rab-in-sight]
to setup
clear-all
create-hunters 20
create-rabbits 100
ask hunters [
set color red
setxy random-xcor random-ycor
set rab-in-sight nobody
]
ask rabbits [
set color white
setxy random-xcor random-ycor
]
reset-ticks
end
Затем используйте if
или ifelse
операторы для управления поведением охотника в зависимости от того, охотится ли он в настоящее время на кролика:
to go
ask hunters [
connect
]
tick
end
to connect
; If a hunter is not already targetting a rabbit
ifelse rab-in-sight = nobody [
fd 1
; Choose a target rabbit that does not already have a link with other hunters
set rab-in-sight min-one-of ( rabbits in-radius 5 with [
not any? my-links ] ) [distance myself]
; If that rabbit exists, create a link with it so no other hunters will
; target the same rabbit
if rab-in-sight != nobody [
create-link-with rab-in-sight
]
] [
; If you're targetting a rabbit, hunt it
face rab-in-sight
ifelse distance rab-in-sight > 1 [
fd 1
] [
move-to rab-in-sight
ask rab-in-sight [
die
]
set rab-in-sight nobody
]
]
end
Переменный подход
Подход с использованием флага или семафора аналогичен - слегка измененsetup
теперь устанавливает rab-in-sight
на nobody
и дает rabbits
targeted?
логическую переменную, которая установлена на false
:
breed [hunters hunter]
breed [rabbits rabbit]
hunters-own [rab-in-sight]
rabbits-own [ targeted? ]
to setup
clear-all
create-hunters 20
create-rabbits 100
ask hunters [
set color red
setxy random-xcor random-ycor
set rab-in-sight nobody
]
ask rabbits [
set color white
setxy random-xcor random-ycor
set targeted? false
]
reset-ticks
end
Теперь, когда охотник нацеливается на кролика, он имеетэтот кролик меняет свою targeted?
переменную на true
, чтобы другие охотники "знали", что не должны также целиться:
to go
ask hunters [
connect
]
tick
end
to connect
; If a hunter is not already targetting a rabbit
ifelse rab-in-sight = nobody [
fd 1
; Choose a target rabbit that is not currently being targeted
set rab-in-sight min-one-of ( rabbits in-radius 5 with [
not targeted? ] ) [distance myself]
; If that rabbit exists, have it set targetted? to true so
; no other hunters will target the same rabbit
if rab-in-sight != nobody [
ask rab-in-sight [
set targeted? true
]
]
] [
; If you're targetting a rabbit, hunt it
face rab-in-sight
ifelse distance rab-in-sight > 1 [
fd 1
] [
move-to rab-in-sight
ask rab-in-sight [
die
]
set rab-in-sight nobody
]
]
end