58 lines
3.4 KiB
Plaintext
58 lines
3.4 KiB
Plaintext
\b;Ćwiczenie
|
|
Napisz program umożliwiający robotowi znalezienie wszystkich \l;niebieskich plusów\u object\waypoint; leżących na ziemi. Plusy znikają po przejściu przez nie robota. Oto główna zasada działania programu:
|
|
|
|
Powtarzaj w nieskończoność:
|
|
o Szukaj plusa
|
|
o Jeśli nie ma żadnego, zatrzymaj program.
|
|
o Oblicz kierunek do plusa.
|
|
o Ustaw prędkości silników tak, aby robot dotarł do znalezionego plusa.
|
|
|
|
\b;Program
|
|
Użyj pętli \c;\l;while\u cbot\while;\n; do wielokrotnego powtarzania instrukcji:
|
|
\s;\c;while ( true )
|
|
\s;{
|
|
\s; \n;instrukcje...\c;
|
|
\s;}
|
|
\n;
|
|
Instrukcja \c;\l;radar\u cbot\radar;\n; wykryje niebieskie plusy i umieści ich opis w zmiennej, na przykład \c;spot\n;. W tym przypadku instrukcja \c;\l;radar\u cbot\radar;()\n; potrzebuje tylko jednego parametru, to jest kategorii obiektu, który musi znaleźć:
|
|
\s;\c;spot = radar(WayPoint);
|
|
\n;
|
|
Po znalezieniu wszystkich plusów, instrukcja \c;radar\n; zwróci wartość \c;\l;null\u cbot\null;\n;. Konieczne będzie sprawdzanie tego warunku instrukcją \c;\l;if\u cbot\if;\n; i odpowiednie reagowanie:
|
|
\s;\c;if ( spot == null ) // nie ma więcej?
|
|
\s;{
|
|
\s; motor(0, 0); // zatrzymaj silniki
|
|
\s; break; // zatrzymaj pętlę
|
|
\s;}
|
|
\n;Instrukcja \c;\l;break\u cbot\break;\n; zatrzyma nieskończoną pętlę \c;while (true)\n;.
|
|
|
|
Użyj instrukcji \c;\l;direction\u cbot\direct;()\n; do obliczenia kąta obrotu, jaki musi wykonać robot, aby iść w kierunku niebieskiego plusa. Współrzędne obiektu są podawane przez \c;spot.position\n;. Następujący wiersz umieści kąt niezbędnego obrotu w \l;zmiennej\u cbot\var; \c;dir\n;:
|
|
\s;\c;dir = direction(spot.position);
|
|
\n;
|
|
Wartość kąta jest dodatnia, gdy niebieski plus jest po lewej stronie a ujemna, gdy jest po prawej. Jeśli plus jest po lewej stronie, należy ustawić pełną prędkość prawego silnika i zmniejszyć prędkość lewego silnika w zależności od kąta:
|
|
|
|
kierunek = \c; 0\n; -> prędkość = \c; 1.0\n;
|
|
kierunek = \c; 45\n; -> prędkość = \c; 0.5\n;
|
|
kierunek = \c; 90\n; -> prędkość = \c; 0.0\n;
|
|
kierunek = \c;135\n; -> prędkość = \c;-0.5\n;
|
|
kierunek = \c;180\n; -> prędkość = \c;-1.0\n;
|
|
|
|
Poniższy schemat pokazuje zależność prędkości lewego i prawego silnika, ustawianego instrukcją \c;\l;motor\u cbot\motor;\n;, od kąta:
|
|
|
|
\image radar2 14 10;
|
|
Jeśli plus jest wprost przed robotem, kąt jest równy 0 stopni. Prędkości obu silników zostaną ustawione na 1, czyli pełną prędkość naprzód. Jeśli plus jest za robotem, prędkość prawego silnika zostanie ustawiona na -1, co obróci robota dookoła. Można użyć \l;wyrażenia\u cbot\expr; \c;1+dir/90\n; w celu obliczenia niezbędnej prędkości silników:
|
|
\s;\c;if ( dir < 0 ) // po prawej stronie?
|
|
\s;{
|
|
\s; motor(1, 1+dir/90); // skręca bardziej lub mniej
|
|
\s;}
|
|
\n;
|
|
Użyj tej samej metody w przypadku dodatniej wartości kąta, w przedziale od 0 do 180 stopni. Do Ciebie należy napisanie dokładnych instrukcji do wykonania:
|
|
\s;\c;else // po lewej stronie?
|
|
\s;{
|
|
\s; \n;do Ciebie należy wypełnienie tego...\c;
|
|
\s;}
|
|
\n;
|
|
Na początku programu musisz zadeklarować wszystkie zmienne. \c;spot\n; jest typu \c;\l;object\u cbot\object;\n;, podczas gdy \c;dir\n; jest typu \c;\l;float\u cbot\float;\n;.
|
|
|
|
\t;Zobacz również
|
|
\l;Programowanie\u cbot;, \l;typy\u cbot\type; i \l;kategorie\u cbot\category;.
|