colobot-data/help/R/tremote4.txt

130 lines
5.8 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

\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;.