Ants/Clone01: различия между версиями

Материал из Поле цифровой дидактики
Полностью удалено содержимое страницы
Метка: очистка
Строка 1: Строка 1:
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

Версия от 12:40, 14 мая 2026