Ants/Zhitkova
Материал из Поле цифровой дидактики
Remix Ants
Код
;; ============================================
;; ДОПОЛНИТЕЛЬНЫЕ СВОЙСТВА ПАТЧЕЙ
;; ============================================
patches-own [
chemical ;; amount of chemical on this patch
food ;; amount of food on this patch (0, 1, or 2)
nest? ;; true on nest patches, false elsewhere
nest-scent ;; number that is higher closer to the nest
food-source-number ;; number (1, 2, or 3) to identify the food sources
]
;; ============================================
;; НАСТРОЙКА МИРА (SETUP)
;; ============================================
to setup
clear-all
set-default-shape turtles "bug"
;; создаём муравьёв
create-turtles population
[
set size 2 ;; easier to see
set color red ;; red = not carrying food
]
setup-patches
reset-ticks
end
to setup-patches
ask patches
[
setup-nest
setup-food
recolor-patch
]
end
to setup-nest ;; patch procedure
;; set nest? variable to true inside the nest, false elsewhere
set nest? (distancexy 0 0) < 5
;; spread a nest-scent over the whole world -- stronger near the nest
set nest-scent 200 - distancexy 0 0
end
to setup-food ;; patch procedure
;; setup food source one on the right
if (distancexy (0.6 * max-pxcor) 0) < 5
[ set food-source-number 1 ]
;; setup food source two on the lower-left
if (distancexy (-0.6 * max-pxcor) (-0.6 * max-pycor)) < 5
[ set food-source-number 2 ]
;; setup food source three on the upper-left
if (distancexy (-0.8 * max-pxcor) (0.8 * max-pycor)) < 5
[ set food-source-number 3 ]
;; set "food" at sources to either 1 or 2, randomly
if food-source-number > 0
[ set food one-of [1 2] ]
end
to recolor-patch ;; patch procedure
;; give color to nest and food sources
ifelse nest?
[
set pcolor violet
]
[
ifelse food > 0
[
if food-source-number = 1 [ set pcolor cyan ]
if food-source-number = 2 [ set pcolor sky ]
if food-source-number = 3 [ set pcolor blue ]
]
;; scale color to show chemical concentration
[ set pcolor scale-color green chemical 0.1 5 ]
]
end
;; ============================================
;; ОСНОВНОЙ ЦИКЛ (GO)
;; ============================================
to go ;; forever button
ask turtles
[
if who >= ticks [ stop ] ;; delay initial departure
ifelse color = red
[ look-for-food ] ;; not carrying food? look for it
[ return-to-nest ] ;; carrying food? take it back to nest
wiggle
fd 1
]
diffuse chemical (diffusion-rate / 100)
ask patches
[
set chemical chemical * (100 - evaporation-rate) / 100 ;; slowly evaporate chemical
recolor-patch
]
tick
end
to return-to-nest ;; turtle procedure
ifelse nest?
[
;; drop food and head out again
set color red
rt 180
]
[
set chemical chemical + 60 ;; drop some chemical
uphill-nest-scent ;; head toward the greatest value of nest-scent
]
end
to look-for-food ;; turtle procedure
if food > 0
[
set color orange + 1 ;; pick up food
set food food - 1 ;; and reduce the food source
rt 180 ;; and turn around
stop
]
;; go in the direction where the chemical smell is strongest
if (chemical >= 0.05) and (chemical < 2)
[ uphill-chemical ]
end
;; sniff left and right, and go where the strongest smell is
to uphill-chemical ;; turtle procedure
let scent-ahead chemical-scent-at-angle 0
let scent-right chemical-scent-at-angle 45
let scent-left chemical-scent-at-angle -45
if (scent-right > scent-ahead) or (scent-left > scent-ahead)
[
ifelse scent-right > scent-left
[ rt 45 ]
[ lt 45 ]
]
end
;; sniff left and right, and go where the strongest smell is
to uphill-nest-scent ;; turtle procedure
let scent-ahead nest-scent-at-angle 0
let scent-right nest-scent-at-angle 45
let scent-left nest-scent-at-angle -45
if (scent-right > scent-ahead) or (scent-left > scent-ahead)
[
ifelse scent-right > scent-left
[ rt 45 ]
[ lt 45 ]
]
end
to wiggle ;; turtle procedure
rt random 40
lt random 40
if not can-move? 1 [ rt 180 ]
end
to-report nest-scent-at-angle [angle]
let p patch-right-and-ahead angle 1
if p = nobody [ report 0 ]
report [nest-scent] of p
end
to-report chemical-scent-at-angle [angle]
let p patch-right-and-ahead angle 1
if p = nobody [ report 0 ]
report [chemical] of p
end
Справка по командам к черепахам
| task | realisation |
|---|---|
| Все turtles выполняют команду | ask turtles [ fd 1 ]
|
| Выбрать turtles по условию | ask turtles with [color = red] [ set size 2 ]
|
| Исключить текущую turtle из набора | ask turtles [ show other turtles ]
|
| Turtles на текущем патче | ask turtles [ show turtles-here ]
|
| Другие turtles на текущем патче | ask turtles [ show other turtles-here ]
|
| Turtles на соседних патчах | ask turtles [ show turtles-on neighbors4 ]
|
| Turtles в радиусе | ask turtles [ show turtles in-radius 3 ]
|
| Проверить, есть ли соседи-черепахи | ask turtles [ if any? other turtles in-radius 2 [ set color red ] ]
|
| Посчитать число соседей | ask turtles [ set label count other turtles in-radius 2 ]
|
| Получить patch под turtle | ask turtles [ show patch-here ]
|
| Получить patch впереди | ask turtles [ show patch-ahead 1 ]
|
| Проверить, можно ли идти вперед | ask turtles [ if can-move? 1 [ fd 1 ] ]
|
| Выбрать самую "богатую" turtle | turtles-own [energy]
ask max-one-of turtles [energy] [ set color yellow ]
|
| Выбрать несколько turtles по максимуму | turtles-own [energy]
ask max-n-of 5 turtles [energy] [ set shape "star" ]
|
| Случайная turtle из набора | ask one-of turtles with [color = blue] [ set color pink ]
|
| Собрать список значений turtle-переменной | turtles-own [energy]
show [energy] of turtles
|
| Среднее значение по turtles | turtles-own [energy]
show mean [energy] of turtles
|
| Сумма значений по turtles | turtles-own [energy]
show sum [energy] of turtles
|
| Отсортировать turtles по who | show sort-on [who] turtles
|
| Сформировать набор из разных источников | let selected turtle-set turtles with [color = red] turtles with [shape = "car"]
ask selected [ set label who ]
|
| Создать links со всеми остальными | ask turtle 0 [ create-links-with other turtles ]
|
| Получить все links данной turtle | ask turtles [ show my-links ]
|
---
