130 lines
5.8 KiB
Plaintext
130 lines
5.8 KiB
Plaintext
\b;Упражнение
|
||
Дистанционное управление ботом без использования \l;поста обменом информацией\u object\exchange;. Бот должен проехать по 6 синим отметкам. Вам придется использовать \c;\l;статичные\u cbot\static;\n; переменные для отправки заявок ведомому боту.
|
||
|
||
Что потребуется:
|
||
1) \l;Колесный сборщик\u object\botgr; без батареи. Данный бот будет ведущим.
|
||
2) Ведомый \l;тренировочный бот\u object\bottr; запрограммированый заранее на ожидание комманд от ведущего бота.
|
||
|
||
\b;Ведомый
|
||
Прежде всего нужно понять, как программа работает. \l;Класс\u cbot\class; \c;order\n; содержит в себе две части: \c;m_type\n; для заявок на выполнение (движение или поворот) и \c;m_param\n; для дистанции или угла поворота¦:
|
||
|
||
\c;\s;\l;public\u cbot\public; \l;class\u cbot\class; order
|
||
\s;{
|
||
\s; \l;int\u cbot\int; m_type = \l;nan\u cbot\nan;;
|
||
\s; \l;float\u cbot\float; m_param;
|
||
\s;}
|
||
\n;
|
||
Второй \l;класс\u cbot\class; \c;exchange\n; содержит в себе механизм обмена информацией. Мы заявляем \c;\l;статичную\u cbot\static;\n; часть класса \c;m_order\n;, которая содержит в себе команды для выполнения. Слово \c;статический\n; гарантирует, что \c;m_order\n; будет одинаковым во всех \l;классах\u cbot\class;.
|
||
|
||
\c;\s;\l;public\u cbot\public; \l;class\u cbot\class; exchange
|
||
\s;{
|
||
\s; \l;static\u cbot\static; \l;private\u cbot\private; order m_order = new order;
|
||
\n;
|
||
\n;
|
||
Метод \c;"put"\n; позволит ведущему боту передавать команды. Пока значение переменной \c;m_order\n; отличается от \c;\l;nan\u cbot\nan;\n;, ведомый бот не закончит работу и метод \c;put\n; вернет \c;ложь\n;(т.е. бот ничего не будет делать)¦:
|
||
|
||
\c;\s; \l;synchronized\u cbot\synchro; \l;bool\u cbot\bool; put(order a)
|
||
\s; {
|
||
\s; if ( m_order.m_type == nan )
|
||
\s; {
|
||
\s; m_order = a;
|
||
\s; return true;
|
||
\s; }
|
||
\s; else
|
||
\s; {
|
||
\s; return false;
|
||
\s; }
|
||
\s; }
|
||
\n;
|
||
Другой метод \c;get\n; может быть использован ведомым ботом для получения задания. Этот метод возвращает в строку \c;m_order\n; заявку(order) на выполнение работы:
|
||
|
||
\c;\s; \l;synchronized\u cbot\synchro; order get()
|
||
\s; {
|
||
\s; return m_order;
|
||
\s; }
|
||
\n;
|
||
Третий метод \c;delete\n; служит ведомому боту для индикации состояния выболнения заявки:
|
||
|
||
\c;\s; \l;synchronized\u cbot\synchro; void delete()
|
||
\s; {
|
||
\s; m_order.m_type = nan;
|
||
\s; }
|
||
\s;}
|
||
\n;
|
||
Основная программа в ведомом боте содержит класс \c;exchange\n; вызываемый через \c;list\n;.
|
||
|
||
\c;\s;\l;extern\u cbot\extern; void object::Slave3( )
|
||
\s;{
|
||
\s; exchange list();
|
||
\s; order todo;
|
||
\n;
|
||
Внешний \c;цикл\n; длится вечно. Внутренний \c;цикл\n; ждет заявку с помощью метода \c;get\n; и \c;exchange\n; класса. Как только метод \c;get\n; вернет значение, отличное от \c;nan\n;, цикл остановится.
|
||
|
||
\c;\s; \l;while\u cbot\while; ( true )
|
||
\s; {
|
||
\s; \l;while\u cbot\while; ( true )
|
||
\s; {
|
||
\s; todo = list.get();
|
||
\s; if ( todo.m_type != nan ) break;
|
||
\s; wait(1);
|
||
\s; }
|
||
\n;
|
||
Теперь мы получили заявку в переменную \c;todo\n;. Теперь нам нужно выполнить заказ:
|
||
|
||
\c;\s; if ( todo.m_type == 1 )
|
||
\s; {
|
||
\s; move(todo.m_param);
|
||
\s; }
|
||
\s; else if ( todo.m_type == 2 )
|
||
\s; {
|
||
\s; turn(todo.m_param);
|
||
\s; }
|
||
\s; else
|
||
\s; {
|
||
\s; message("Unknown order");
|
||
\s; }
|
||
\n;
|
||
Как только поданая заявка выполнена, мы можем использовать метод \c;delete\n;, чтобы ведущий бот знал, что ожидается следущая заявка¦:
|
||
|
||
\c;\s; list.delete();
|
||
\s; }
|
||
\s;}
|
||
\n;
|
||
\b;Ведущий
|
||
В ведущем боте создадим функцию \c;SendOrder\n;, которая будет отправлять заказы к ведомому боту:
|
||
|
||
\c;\s;void object::SendOrder(float order, float param)
|
||
\s;{
|
||
\s; exchange list();
|
||
\s; order todo();
|
||
\s;
|
||
\s; todo.m_type = order;
|
||
\s; todo.m_param = param;
|
||
\s;
|
||
\s; while ( list.put(todo) == false )
|
||
\s; {
|
||
\s; wait(1);
|
||
\s; }
|
||
\s;}
|
||
\n;
|
||
Цикл \c;while\n; будет ждать, пока заявка не будет выполнена и пока ведомый бот не вызовет методы \c;get\n; и \c;delete\n;.
|
||
Пока программа для ведущего бота довольно проста:
|
||
|
||
\c;\s;extern void object::Remote4( )
|
||
\s;{
|
||
\s; SendOrder(1, 20); // move(20);
|
||
\s; SendOrder(2, 90); // turn(90);
|
||
\s; SendOrder(1, 20); // move(20);
|
||
\s; SendOrder(2, 90); // turn(90);
|
||
\s; SendOrder(1, 10); // move(10);
|
||
\s; SendOrder(2, 90); // turn(90);
|
||
\s; SendOrder(1, 10); // move(10);
|
||
\s; SendOrder(2,-90); // turn(-90);
|
||
\s; SendOrder(1, 10); // move(10);
|
||
\s;}
|
||
\n;
|
||
Клавиша \key;\key help;\norm; показывает эту инструкцию в любое время.
|
||
|
||
\t;Смотри также
|
||
\l;Язык CBOT\u cbot;, \l;Переменные\u cbot\type; и \l;Категории\u cbot\category;.
|