63 lines
3.2 KiB
Plaintext
63 lines
3.2 KiB
Plaintext
![]() |
\b;Ćwiczenie
|
||
|
Zaprogramuj robota, aby znajdował wyjście z labiryntu bez uderzania o ściany. Zakładamy, że konfiguracja labiryntu nie jest znana, jednak nie ma w nim rozwidleń ani ślepych uliczek. Labirynt składa się z kwadratów o boku 5 m każdy.
|
||
|
|
||
|
\b;Instrukcja \c;radar\n;
|
||
|
Instrukcja \c;\l;radar\u cbot\radar;(Barrier, 0, 45, 0, 5);\n; znajdzie \l;barierę\u object\barrier; przed robotem, która jest bliżej niż 5 metrów. Przyjrzyjmy się bliżej pięciu użytym parametrom:
|
||
|
|
||
|
\s;\c;Barrier\n;
|
||
|
\l;Kategoria\u cbot\category; obiektu, którego ma szukać radar, np. bariera.
|
||
|
|
||
|
\s;\c;0\n;
|
||
|
Kierunek, w którym "patrzy" radar. \c;0\n; oznacza, że radar powinien szukać obiektu wprost przed sobą.
|
||
|
|
||
|
\s;\c;45\n;
|
||
|
Kąt widzenia, w stopniach. Z kątem widzenia równym 45 stopni, wykryte zostaną bariery znajdujące się pomiędzy 22,5 stopnia w lewo a 22,5 stopnia w prawo.
|
||
|
|
||
|
\s;\c;0\n;
|
||
|
Minimalna odległość wykrywania. \c;0\n; oznacza, że zostaną wykryte nawet obiekty będące bardzo blisko robota.
|
||
|
|
||
|
\s;\c;5\n;
|
||
|
Maksymalna odległość wykrywania. Żadna bariera dalej niż \c;5\n; metrów nie zostanie wykryta.
|
||
|
|
||
|
Weźmy inny przykład, \c;\l;radar\u cbot\radar;(Barrier, 90, 45, 0, 5);\n; skieruje radar 90 stopni w lewo, w celu sprawdzenia, czy droga po lewej stronie jest wolna.
|
||
|
|
||
|
\image tlaby1 10 10;
|
||
|
\b;Ogólny algorytm
|
||
|
Program powinien zajmować się tylko pojedynczymi kwadratami labiryntu. Należy uruchomić go wielokrotnie, aby robot doszedł do platformy końcowej.
|
||
|
o Jeśli nie ma niczego przed robotem, idź naprzód.
|
||
|
o Jeśli nie ma niczego po lewej stronie, wykonaj ćwierć obrotu w lewo i idź naprzód.
|
||
|
o Jeśli nie ma niczego po prawej stronie, wykonaj ćwierć obrotu w prawo i idź naprzód.
|
||
|
|
||
|
1) Na początek zadeklaruj trzy \l;zmienne\u cbot\var; typu \c;\l;object\u cbot\object;\n;, nazwane \c;front\n;, \c;left\n; i \c;right\n;. Zmienne tego typu mogą zawierać opisy dowolnych obiektów, w tym przypadku bariery znalezionej przez radar.
|
||
|
\s;\c; object front, left, right;\n;
|
||
|
|
||
|
2) Szukaj bariery we wszystkich trzech kierunkach, a wyniki instrukcji \c;radar\n; umieść w trzech zmiennych zdefiniowanych w punkcie 1). Jeśli radar niczego nie wykryje, zmienna będzie zawierała wartość \c;\l;null\u cbot\null;\n;.
|
||
|
\s;\c; front = radar(Barrier, 0, 45, 0, 5);
|
||
|
\s; left = radar(Barrier, 90, 45, 0, 5);
|
||
|
\s; right = radar(Barrier, -90, 45, 0, 5);
|
||
|
\n;
|
||
|
3) Używając instrukcji \c;\l;if\u cbot\if;\n;, sprawdź droga przed robotem jest wolna. Jeśli warunek będzie prawdziwy, zostaną wykonane instrukcje w klamrach \c;{ }\n;, w przeciwnym wypadku, działanie programu zostanie wznowione po klamrze zamykającej \c;}\n;.
|
||
|
Instrukcja \c;return\n; opuszcza program: zadanie zostało wykonane.
|
||
|
\s;\c;if ( front == null )
|
||
|
\s;{
|
||
|
\s; move(5);
|
||
|
\s; return;
|
||
|
\s;}
|
||
|
\n;
|
||
|
4) Sprawdź, czy możliwy jest obrót w lewo; jeśli tak, skręć w lewo instrukcją \c;\l;turn\u cbot\turn;\n; i idź 5 metrów do przodu.
|
||
|
\s;\c;if ( left == null )
|
||
|
\s;{
|
||
|
\s; turn(90);
|
||
|
\s; move(5);
|
||
|
\s; return;
|
||
|
\s;}
|
||
|
\n;
|
||
|
5) Sprawdź, czy możliwy jest obrót w prawo.
|
||
|
...
|
||
|
|
||
|
\b;Uwaga
|
||
|
Po instrukcji \c;if ( )\n; nigdy nie powinien wystąpić \l;średnik\u cbot\term;.
|
||
|
|
||
|
\t;Zobacz również
|
||
|
\l;Programowanie\u cbot;, \l;typy\u cbot\type; i \l;kategorie\u cbot\category;.
|