colobot-data/help/P/twasp2.txt

85 lines
3.3 KiB
Plaintext

\b;Zadanie
Zestrzel wszystkie osy nieco efektywniej niż w poprzednim programie.
\b;Program
Oto program z poprzedniego ćwiczenia, który zabija wszystkie osy, jednak po bardzo wielu nieudanych próbach:
\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;
Wiele niecelnych strzałów jest spowodowanych faktem, że osa odleciała, zanim doleciał do niej pocisk. Jedynym sposobem usprawnienia programu jest ustawienie mocy obu silników oraz silnika odrzutowego w ten sposób, aby robot podążał tą samą trasą co cel podczas strzału.
Bezpośrednio przed strzałem program po raz ostatni reguluje kierunek instrukcją \c;turn(direction(item.position));\n;. Aby podążać za osą w trakcie strzelania, należy "zapamiętać" kąt ostatniego obrotu: jeśli był on dodatni(obrót w lewo), robot powinien się obracać w lewo podczas strzelania; jeśli był ujemny, robot powinien obracać się w prawo.
Do "zapamiętania" kąta ostatniego obrotu potrzebna będzie zmienna, zawierająca tylko jedną liczbę. Jeśli nazwiesz ją \c;angle\n;, należy zdefiniować zmienną za pomocą następującego wiersza na początku programu:
\c;
\s; \l;float\u cbot\type; angle;
\n;
Zmienna typu \l;float\u cbot\type; jest zmienną typu, który może przechowywać każdą liczbę, całkowitą bądź rzeczywistą. Zobacz \l;tekst o typach zmiennych\u cbot\type; jeśli chcesz wiedzieć więcej o różnych typach zmiennych oraz co one zawierają.
Bezpośrednio przed instrukcją \c;fire(1);\n;, zamiast pisać \c;\l;turn\u cbot\turn;(\l;direction\u cbot\direct;(item.position));\n;, umieść kąt obrotu w zmiennej \c;angle\n;:
\c;
\s; angle = direction(item.position);
\n;
Następnie wykonaj obrót i ustaw moc silników tak, aby robot kontynuował poruszanie się:
\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;
Instrukcja \c;else\n; określa jakie instrukcje powinien wykonać program jeśli warunek podany instrukcji \c;if\n; jest fałszywy.
Następnie trzeba ustawić moc silników odrzutowych, aby robot utrzymywał również tą samą wysokość co osa:
\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;
Każdy zauważy, że ten program jest o wiele skuteczniejszy od poprzedniego!
\t;Zobacz również
\l;Programowanie\u cbot;, \l;typy\u cbot\type; i \l;kategorie\u cbot\category;.