colobot-data/levels/train207/help/R/twasp2.txt

85 lines
4.8 KiB
Plaintext
Raw Permalink 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;Задание
Убейте ос с еще большей эффективностью, чем вы делали это с помощью предыдущей программы.
\b;Программа
Вот программа из предыдущего упражнения, которая уничтожила всех ос после многих, многих неудачных попыток:
\c;
\s;extern void object::Wasp1()
\s;{
\s; \l;object\u cbot\type; item;
\s;
\s; \l;aim\u cbot\aim;(0);
\s;
\s; \l;while\u cbot\while; (true)
\s; {
\s; \l;while\u cbot\while; (\l;radar\u cbot\radar;(AlienWasp, 0, 360, 0, 20) == null)
\s; {
\s; item = \l;radar\u cbot\radar;(AlienWasp);
\s; \l;turn\u cbot\turn;(\l;direction\u cbot\direct;(item.position));
\s; \l;motor\u cbot\motor;(1,1);
\s;
\s; \l;jet\u cbot\jet;(0);
\s; \l;if\u cbot\if; (position.z > item.position.z)
\s; {
\s; \l;jet\u cbot\jet;(-0.3);
\s; }
\s;
\s; \l;if\u cbot\if; (position.z < item.position.z - 1)
\s; {
\s; \l;jet\u cbot\jet;(0.3);
\s; }
\s;
\s; \l;wait\u cbot\wait;(0.2);
\s; }
\s; item = \l;radar\u cbot\radar;(AlienWasp);
\s; \l;turn\u cbot\turn;(\l;direction\u cbot\direct;(item.position));
\s; \l;fire\u cbot\fire;(1);
\s; }
\s;}
\n;
Многие ошибки возникали из-за того, что оса уже улетела до того, как пуля могла в нее попасть. Единственный способ улучшить программу- это установить мощность двух моторов и реактивного двигателя таким способом, чтобы во время выстрела бот летел по тому же курсу, что и цель.
Сразу перед выстрелом программа настраивает последнее направление с помощью \c;turn(direction(item.position));\n;. Чтобы лететь за осой во время выстрела, вы должны "запомнить" угол этого последнего поворота: если угол был положительный (поворот влево), бот должен продолжать разворачиваться влево во время выстрела; если же угол был отрицательным, бот должен продолжать поворачиваться вправо.
Чтобы "запомнить" угол последнего поворота, нам нужна переменная, которая может содержать только одно число. Если мы назовем ее \c;angle\n;, мы должны задать переменную со следующей строки в самом начале программы:
\c;
\s; \l;float\u cbot\type; angle;
\n;
Тип переменной \l;float\u cbot\type; это изменчивый тип, который может содержать любое число, то есть целые числа или вещественные числа. Обратитесь пожалуйста к \l;тексту о типах переменных\u cbot\type; , если вы захотите узнать больше о различных типах переменных и о том, что они могут содержать.
Сразу перед инструкцией \c;fire(1);\n;, вместо того, чтобы писать \c;\l;turn\u cbot\turn;(\l;direction\u cbot\direct;(item.position));\n;, мы установим угол поворота в переменную \c;angle\n;:
\c;
\s; angle = direction(item.position);
\n;
После этого мы произведем поворот и установим мощность моторов таким образом, чтобы бот продолжил движение:
\c;
\s; turn(angle);
\s; if (angle < 0)
\s; {
\s; motor(1,0.5);
\s; }
\s; else
\s; {
\s; motor(0.5,1);
\s; }
\n;
Инструкция \c;else\n; определяет то, какую инструкцию должна выполнить программа, если условие, указанное инструкцией \c;if\n;, ложное.
Потом мы должны установить мощность двигателя таким образом, чтобы бот следовал за осой также и в вертикальном направлении:
\c;
\s; jet(0);
\s; if(position.z > item.position.z)
\s; {
\s; jet(-0.3);
\s; }
\s;
\s; if(position.z < item.position.z - 1)
\s; {
\s; jet(0.3);
\s; }
\n;
Как вы видите, эта программа намного эффективней предыдущей!
\t;См. также
\l;Программирование\u cbot;, \l;типы\u cbot\type; и \l;категории\u cbot\category;.