63 lines
3.4 KiB
Plaintext
63 lines
3.4 KiB
Plaintext
\b;Ćwiczenie
|
|
Podążaj za \l;robotem celem\u object\bottr; niosącym ładunek wybuchowy. Bądź ostrożny, gdyż zderzenie z nim grozi wybuchem. Podczas każdego zatrzymania robota celu należy być odpowiednio blisko niego (mniej niż 10 metrów). Gdy uda się być w pobliżu robota 10 razy z rzędu, ćwiczenie zakończy się wraz z jego dotarciem na platformę końcową. Przy każdym zatrzymaniu robot cel sprawdza, czy śledzący go robot jest odpowiednio blisko. Jeśli nie, liczenie zaczyna się od początku.
|
|
|
|
\b;Ogólny algorytm
|
|
Powtarzaj w nieskończoność:
|
|
o Znajdź robot cel.
|
|
o Oblicz odległość do robota.
|
|
o Jeśli odległość jest mniejsza niż 5 m, cofnij się.
|
|
o W przeciwnym przypadku oblicz kierunek do robota celu i idź w jego stronę.
|
|
|
|
Podobnie jak poprzednio użyj nieskończonej pętli \c;\l;while\u cbot\while; (true)\n;:
|
|
\s;\c;while (true)
|
|
\s;{
|
|
\s; \n;instrukcje, które mają być powtarzane ...\c;
|
|
\s;}
|
|
\n;
|
|
Znajdź robot cel instrukcją \c;\l;radar\u cbot\radar;\n;:
|
|
\s;\c; target = radar(TargetBot);
|
|
\n;
|
|
Nie musisz sprawdzać, czy robot znalazł cel: na pewno tam jest.
|
|
|
|
Użyj instrukcji \c;\l;distance\u cbot\dist;( , )\n; do obliczenie odległości między dwoma punktami. Pierwszym jest pozycja Twojego robota, podana przez \c;position\n;. Drugim jest pozycja robota celu, podana przez \c;target.position\n;.
|
|
\s;\c;len = distance(position, target.position);
|
|
\n;
|
|
Jeśli odległość od robota celu jest mniejsza niż 5 metrów, oddal się od niego z prędkością odwrotnie proporcjonalną do odległości: im bliżej jest robot, tym szybciej należy się cofać.
|
|
Odległość = 5.0 metrów -> prędkość = 0.0
|
|
Odległość = 2.5 metra -> prędkość = -0.5
|
|
Odległość = 0.0 metrów -> prędkość = -1.0
|
|
Aby to uzyskać, możesz użyć \l;wyrażenia\u cbot\expr; \c;distance/5-1\n;, wspólnie z instrukcją \c;\l;if\u cbot\if;\n; sprawdzającą, czy cel jest bliżej niż 5 m:
|
|
\s;\c;if ( len < 5 ) // za blisko?
|
|
\s;{
|
|
\s; motor(len/5-1, len/5-1); // cofnij
|
|
\s;}
|
|
\n;
|
|
Jeśli odległość do celu jest większa niż 5m, poruszaj się w jego kierunku. Najpierw oblicz kąt niezbędny do obrócenia się w jego kierunku używając instrukcji \c;\l;direction\u cbot\direct;\n;. Następnie dostosuj prędkości prawego i lewego silnika, aby Twój robot podążał za celem:
|
|
\s;\c;else
|
|
\s;{
|
|
\s; dir = direction(target.position);
|
|
\s; if ( dir >= 0 ) // cel po lewej stronie?
|
|
\s; {
|
|
\s; motor(1-dir/90, 1);
|
|
\s; }
|
|
\s; else // cel po prawej stronie?
|
|
\s; {
|
|
\s; \n;do Ciebie należy uzupełnienie tego\c;
|
|
\s; }
|
|
\s;}
|
|
\n;
|
|
Gdy cel jest po lewej stronie, zmienna \c;dir\n; ma wartość dodatnią, pomiędzy 0 i 180. \l;Wyrażenie\u cbot\expr; \c;1-dir/90\n; zwraca prędkość w zakresie pomiędzy 1 i -1 w zależności od kierunku:
|
|
kierunek = 0 -> prędkość = 1.0
|
|
kierunek = 45 -> prędkość = 0.5
|
|
kierunek = 90 -> prędkość = 0.0
|
|
kierunek = 135 -> prędkość = -0.5
|
|
kierunek = 180 -> prędkość = -1.0
|
|
|
|
\image radar2 14 10;
|
|
Gdy cel jest po prawej stronie, zmienna \c;dir\n; ma wartość ujemną, pomiędzy 0 i -180.
|
|
|
|
Jedynym zadaniem jakie jeszcze Ci zostało jest zadeklarowanie \l;zmiennych\u cbot\var; używanych w programie. \c;target\n; jest typu \c;object\n;, podczas gdy \c;dir\n; i \c;len\n; są typu \c;float\n;.
|
|
|
|
\t;Zobacz również
|
|
\l;Programowanie\u cbot;, \l;typy\u cbot\type; i \l;kategorie\u cbot\category;.
|