colobot-data/help/P/tlaby1.txt

63 lines
3.2 KiB
Plaintext
Raw Permalink Normal View History

\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;.