63 lines
5.2 KiB
Plaintext
63 lines
5.2 KiB
Plaintext
\b;Упражнение
|
||
Вы должны следовать за \l;целевым ботом\u object\bottr; со взрывным устройством, не прикасаясь к нему, иначе он взорвется. Каждый раз, когда бот останавливается, вы должны находится вблизи от него (менее 10 метров). После того, как вам удастся остановиться неподалеку от бота 10 раз, он отведет вас на финишную площадку, и упражнение будет выполнено. При каждой остановке целевой бот проверяет ваше присутствие за спиной. Если вас там, вы должны будете начать все с самого начала.
|
||
|
||
\b;Общий принцип
|
||
Повторять всегда :
|
||
o Искать целевого бота.
|
||
o Рассчитать расстояние до бота.
|
||
o если расстояние до целевого бота меньше 5 метров, отойти назад.
|
||
o Иначе рассчитать направление до целевого бота и двигаться к нему.
|
||
|
||
Как и много раз до этого, используйте \c;\l;while\u cbot\while; (true)\n;, чтобы создать бесконечный цикл:
|
||
\s;\c;while (true)
|
||
\s;{
|
||
\s; \n;инструкции, которые следует повторять ...\c;
|
||
\s;}
|
||
\n;
|
||
Ищите целевого бота с помощью инструкции \c;\l;radar\u cbot\radar;\n;:
|
||
\s;\c; target = radar(TargetBot);
|
||
\n;
|
||
Вы не должны проверять то, нашел ли радар целевого бота: он там всего один.
|
||
|
||
Используйте инструкцию \c;\l;distance\u cbot\dist;( , )\n; чтобы рассчитать расстояние между двумя точками. Первая точка будет позицией вашего собственного бота, заданная \c;position\n;. Вторая точка будет позицией целевого бота, заданная \c;target.position\n;.
|
||
\s;\c;len = distance(position, target.position);
|
||
\n;
|
||
Если расстояние до целевого бота меньше 5 метров, отойдите назад со скоростью, обратно пропорциональной расстоянию: чем ближе вы к боту, тем быстрее вы должны отойти назад.
|
||
Расстояние = 5.0 метров -> скорость = 0.0
|
||
Расстояние = 2.5 метров -> скорость = -0.5
|
||
Расстояние = 0.0 метров -> скорость = -1.0
|
||
Теперь вы можете использовать \l;выражение\u cbot\expr; \c;distance/5-1\n; чтобы выполнить это, вместе с \c;\l;if\u cbot\if;\n; , чтобы проверить, не находится ли цель ближе 5 метров:
|
||
\s;\c;if ( len < 5 ) // слишком близко ?
|
||
\s;{
|
||
\s; motor(len/5-1, len/5-1); // отходит назад
|
||
\s;}
|
||
\n;
|
||
Если расстояние до цели больше 5 метров, двигайтесь по направлению к цели. Сначала определите угол поворота, на который следует развернуться, чтобы двигаться с помощью инструкции \c;\l;direction\u cbot\direct;\n;. После этого вы можете настроить скорость правостороннего и левостороннего двигателей, чтобы следовать за целью:
|
||
\s;\c;else
|
||
\s;{
|
||
\s; dir = direction(target.position);
|
||
\s; if ( dir >= 0 ) // цель слева ?
|
||
\s; {
|
||
\s; motor(1-dir/90, 1);
|
||
\s; }
|
||
\s; else // цель справа?
|
||
\s; {
|
||
\s; \n;здесь пишите вы\c;
|
||
\s; }
|
||
\s;}
|
||
\n;
|
||
Когда цель расположена слева от вас, \c;dir\n; принимает положительное значение, колебаясь от 0 до 180. \l;Выражение\u cbot\expr; \c;1-dir/90\n; возвращает скорость, которая изменяется от 1 до -1, в соответствии с направлением:
|
||
направление = 0 -> скорость = 1.0
|
||
направление = 45 -> скорость = 0.5
|
||
направление = 90 -> скорость = 0.0
|
||
направление = 135 -> скорость = -0.5
|
||
направление = 180 -> скорость = -1.0
|
||
|
||
\image radar2 14 10;
|
||
Когда цель расположена справа, \c;dir\n; отрицательное, колебаясь между 0 и -180.
|
||
|
||
Теперь вы должны выполнить только одно - задать \l;переменные\u cbot\var;, которые использует программа. \c;target\n; относится к типу \c;object\n;, поскольку \c;dir\n; и \c;len\n; относятся к типу \c;float\n;.
|
||
|
||
\t;См. также
|
||
\l;Программирование\u cbot;, \l;типы\u cbot\type; и \l;категории\u cbot\category;.
|