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