Дизель, у вас есть отличное начало в этом! Ниже приведен код, отвечающий на ваши вопросы.
Кстати, заголовок вашего вопроса не совсем соответствует вашей реальной проблеме: импортированные цвета патчей не работают правильно
Я подозреваюПричина, по которой ваш код игнорирует нагреватель и интерфейс, заключается в том, что они импортированы в виде цветов, которые не соответствуют ожидаемым. Я добавил команду verify-colors, которая проверяет правильность импортированных цветов. Я также добавил опцию для создания нового образа котла, с которым вы можете работать, если импорт все еще вызывает проблемы.
Также я заметил, что вы добавляете 100 к ycor, когда ваша молекула попадает в интерфейс. Возможно, это полностью смещает молекулу из поля зрения, что может сбивать с толку, так как стандартное представление имеет высоту всего 32 единицы. Я изменил 100 на 5, чтобы держать молекулу в поле зрения.
Я очистил еще несколько вещей и подтвердил, что модель работает успешно. Обработка правильного отскока от стен и от обогревателя не рассматривалась - это ваша работа!
Вот что я настроил в вашем коде: ;;;;добавлен собственный участок воды, поэтому молекулы имеют температуру;добавлен пользовательский выбор: импортировать файл chartmap.png или создать новый здесь ;;при импорте убедитесь, что цвета точно соответствуют допустимым цветам ;;добавлены разделы "make-drawing" и "verify-colors" в конце ;;перенесена галочка сброса в конец настройки, в ее обычное местоположение ;;добавлены галочки в конец раздела go! ;;добавлен set-aircolor grey (не определено) ;;убрал ненужные команды из раздела setup-patches. У вас уже импортированы pcolors, поэтому вам не нужно устанавливать их заново.
;;добавлена "установка температуры метки" в раздел создания молекул, а также в место ;;где температура в нагревателе повышается, поэтому каждая молекула показывает свою текущую температуру
Я проверил ее с переменными интерфейса h2o-number = 100 и полными молями 1 или 5 и скоростью, установленной на очень медленную. Это работает!
globals[ liquid-color heater-color wall-color reflection-color air-color interface-color
liquid heater wall reflection air interface]
breed [h2o water]
h2o-own [
temperature
]
to setup
clear-turtles
clear-all-plots
set liquid-color 115
set heater-color 19
set wall-color 35
set interface-color 105
set air-color grey
if-else user-yes-or-no? "import boilermap.png?"
[
import-pcolors "boilermap.png"
verify-colors ;; check the command section for counts of pcolors
]
[
make-drawing ;; just make a new image of a boiler
]
setup-patches
create-molecules
reset-ticks ;; usually, do this as the last step in setup
end
to setup-patches
set heater patches with [pcolor = heater-color]
set interface patches with [pcolor = interface-color]
set liquid patches with [pcolor = liquid-color]
set wall patches with [pcolor = wall-color]
end
to create-molecules
no-display
create-h2o (totalmoles * h20number / 100)[
set shape "circle"
set color black
set size 2
set temperature 20
setxy random xcor random ycor
move-to one-of patches with [pcolor = liquid-color]
set label temperature
]
display
end
to go
ask h2o [
(ifelse
pcolor = liquid-color[fd 1 ]
pcolor = heater-color [ set temperature temperature + 5 set label temperature set heading 0 forward 1]
pcolor = interface-color [set ycor ycor + 5 forward 1 ]
pcolor = wall-color and pxcor < 0 [set heading 135 forward 1]
pcolor = wall-color and pxcor > 0 [set heading 220 forward 1]
[ bk 1
rt random 180]
)]
tick ; DONT FORGET THIS !!
end
;; ========================== new utility functions ===
to make-drawing
no-display
ask patches with [ pycor > 1] [ set pcolor air-color]
ask patches with [ pycor < 1] [set pcolor liquid-color]
ask patches with [ abs pycor <= 1] [ set pcolor interface-color]
ask patches with [ pycor < (min-pycor + 4)] [ set pcolor heater-color]
ask patches with [ pxcor > (max-pxcor - 2)] [ set pcolor wall-color]
ask patches with [ pxcor < (min-pxcor + 2)] [ set pcolor wall-color]
ask patches with [ pycor > (max-pycor - 2)] [ set pcolor wall-color]
ask patches with [ pycor < (min-pycor + 2)] [ set pcolor wall-color]
display
end
to verify-colors ;; see what we imported
let good-colors (list
liquid-color
heater-color
wall-color
interface-color
air-color )
let good-count count patches with [member? pcolor good-colors]
let bad-count count patches - good-count
type "good patch count " type good-count type ", bad patch count: " print bad-count
if bad-count > 0 [ if "no" = user-yes-or-no? " bad patch colors, should I continue?" [stop] ]
end