85 lines
4.8 KiB
Plaintext
85 lines
4.8 KiB
Plaintext
\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;.
|