Надеюсь, вас не расстраивает тот факт, что выглядит данная программа пока слишком примитивно? Но без хотя бы простейшей визуализации двигаться дальше было бы трудно. А затевать мультяшки для малых деток я не стал. Надеюсь, что красоту дорисует ваше воображение, а вы с пониманием отнесетесь к такому примитивизму.
Мультиагентность нужна не только для создания нескольких роботов, взаимодействующих между собой, но и позволит создавать роботов, в которых будут копошиться разные мысли. В качестве мыслей будут агенты. Как их организовать - надеюсь, увидим позже.
Даже в таком простейшем виде можно путем простых правок в коде программы изменить поведение роботов.
Файл Simulator.ecl модуль SIMULATOR.
- Код: Выделить всё • Развернуть
;;;======================================================
;;; Lunochod V 1.0.1
;;; SIMULATOR Module
;;; For ECLIPS Version 6.3
;;; 2016.12.02 Victor Kazarinov
;;;======================================================
;;; Модуль симулятора внешней среды, сенсоров и пользователя.
;;;======================================================
(defmodule SIMULATOR (export deftemplate ?ALL) (import MAIN deftemplate ?ALL) (import MAIN deffunction ?ALL) (import MAIN defglobal ?ALL))
(defrule SIMULATOR::Mission1-Lunochod1-Start ; Правило старта Миссии1
?c <- (cycle 0)
=>
(bind ?*gamefieldref* (sys-2darray-create ?*gamefieldDimX* ?*gamefieldDimY* 1 1 ?*backgroundSym*)) ; Создать игровое поле размером 20х20 символов.
(field-fill ?*gamefieldDimX* ?*gamefieldDimY* 1 ?*gamefieldref*)
; Создать агента lunochod1
(assert (agent-position (agent-name lunochod1) (posx 10) (posy 9)))
(assert (agent-direction (agent-name lunochod1) (direction right)))
(assert (agent-image (agent-name lunochod1) (sym 26) (color 10)))
(assert (mission-phase (agent-name lunochod1) (mission-name mission1) (phase forward1))) ; Назначить агенту миссию.
(agent-goto 26 10 9 10 9 10 ?*backgroundSymBackColor*)
(agent-goto ?*barrierSym* 24 10 28 13 15 ?*backgroundSymBackColor*) ; Установить препятствие на пути lunochod2.
;(tui_status-print "SIMULATOR::Mission1:Start." 0)
)
(defrule SIMULATOR::Mission1-Lunochod2-Start ; Правило старта Миссии1
?c <- (cycle 3)
=>
; Создать агента lunochod2
(assert (agent-position (agent-name lunochod2) (posx 20) (posy 10)))
(assert (agent-direction (agent-name lunochod2) (direction right)))
(assert (agent-image (agent-name lunochod2) (sym 26) (color 14)))
(assert (mission-phase (agent-name lunochod2) (mission-name mission1) (phase forward1))) ; Назначить агенту миссию.
(agent-goto 26 20 10 20 10 14 ?*backgroundSymBackColor*)
)
Как видно из кода симулятора, для создания нового робота достаточно всего несколько строк, создающих новые факты и описывающих его положение на экране, направление движения в начальный момент времени, внешний вид (символ, которым робот будет отображен и его цвет), и с какой фазы какой миссии нужно этого агента запускать:
- Код: Выделить всё • Развернуть
; Создать агента lunochod1
(assert (agent-position (agent-name lunochod1) (posx 10) (posy 9)))
(assert (agent-direction (agent-name lunochod1) (direction right)))
(assert (agent-image (agent-name lunochod1) (sym 26) (color 10)))
(assert (mission-phase (agent-name lunochod1) (mission-name mission1) (phase forward1))) ; Назначить агенту миссию.
(agent-goto 26 10 9 10 9 10 ?*backgroundSymBackColor*)
Последняя строка этого кода фактически размещает на экране робота по созданному шаблону.
Все это означает, что роботов можно стартовать имеющейся миссией не только вправо, но и в любую другую сторону, написав вместо right слово up, left или down. Также видно, что можно стартовать не только с начала миссии, но и выполнить любой ее участок до окончания миссии. Для этого нужно заглянуть в файл Mission1.ecl и взять оттуда название других фаз. Если хотите, попробуйте сами, я этого всего еще сам не делал и поэтому не отладил код.