Ants/Clone01

Материал из Поле цифровой дидактики

turtles-own [

 has-food      ; 0 = нет еды, 1 = несёт еду
 memory        ; список запомненных патчей (где была еда)
 energy        ; энергия муравья

]

globals [

 total-food    ; сколько еды доставлено в гнездо

]

НАСТРОЙКА МИРА ;;

to setup

 clear-all
 set-default-shape turtles "bug"
 
 ; гнездо в центре (0,0)
 ask patch 0 0 [ set pcolor violet ]
 
 ; 8 источников еды по кругу (для мира от -16 до 16)
 ask patch 16 0 [ set pcolor green set plabel "E" ]      ; право
 ask patch -16 0 [ set pcolor green set plabel "E" ]     ; лево
 ask patch 0 16 [ set pcolor green set plabel "E" ]      ; верх
 ask patch 0 -16 [ set pcolor green set plabel "E" ]     ; низ
 ask patch 16 16 [ set pcolor green set plabel "E" ]     ; верх-право
 ask patch -16 16 [ set pcolor green set plabel "E" ]    ; верх-лево
 ask patch 16 -16 [ set pcolor green set plabel "E" ]    ; низ-право
 ask patch -16 -16 [ set pcolor green set plabel "E" ]   ; низ-лево
 
 ; создаём муравьёв (40 штук)
 create-turtles 40 [
   setxy 0 0
   set color red
   set has-food 0
   set memory []
   set energy 200
 ]
 
 set total-food 0
 reset-ticks

end

ОСНОВНОЙ ЦИКЛ ;;

to go

 ask turtles [
   ; тратим энергию
   set energy energy - 1
   if energy <= 0 [ die ]
   
   ; поведение в зависимости от того, несёт ли еду
   ifelse color = red
     [ look-for-food ]
     [ return-to-nest ]
   
   ; движение
   fd 1
   right random 30
   left random 30
 ]
 tick

end

ПОВЕДЕНИЕ  ;;

to look-for-food

 ; если на патче есть еда (зелёный цвет)
 if pcolor = green [
   set has-food 1
   set color orange
   set pcolor black      ; еда исчезает
   set plabel ""          ; убираем метку
   
   ; ЗАПОМИНАЕМ МЕСТО (если память включена)
   if use-memory? [
     set memory lput patch-here memory
     ; ограничиваем память 15 местами
     if length memory > 15 [ set memory but-last memory ]
   ]
   
   right 180              ; разворачиваемся к гнезду
   stop
 ]
 
 ; ЕСЛИ ЭНЕРГИЯ МАЛА И ЕСТЬ ПАМЯТЬ — ИДЁМ К ЗАПОМНЕННОМУ МЕСТУ
 if use-memory? and energy < memory-threshold and length memory > 0 [
   let target-patch min-one-of memory [distance myself]
   if target-patch != nobody [
     face target-patch
     stop
   ]
 ]

end

to return-to-nest

 ; если в гнезде (фиолетовый патч)
 if pcolor = violet [
   set has-food 0
   set color red
   set energy energy + 100    ; награда за еду
   set total-food total-food + 1
   right 180
   stop
 ]

end

============================================
ЗАБЫВАНИЕ УСТАРЕВШЕЙ ПАМЯТИ
============================================

to forget-stale-memory

 if length memory > 0 [
   let to-forget []
   foreach memory [ mem-patch ->
     ; если на запомненном патче больше нет еды (не зелёный)
     if [pcolor] of mem-patch != green [
       set to-forget lput mem-patch to-forget
     ]
   ]
   foreach to-forget [ forget-patch ->
     set memory remove forget-patch memory
   ]
 ]

end