colobot-data/help/P/tremote3.txt

104 lines
4.4 KiB
Plaintext

\b;Ćwiczenie
Zdalnie pokieruj robotem bez używania \l;stacji przekaźnikowej informacji\u object\exchange;. Robot powinien przejść przez 6 niebieskich plusów. Musisz użyć \l;łańcucha\u cbot\string; do przekazania rozkazów podległemu robotowi. Łańcuch zawiera rozkaz, który powinien być wykonany przez tego robota, na przykład \c;"move(20)"\n;. Możesz użyć tej samej składni co w języku CBOT, choć możesz też wybrać dowolną inną, na przykład podobną do tej: \c;"advance=20"\n;. Łańcuch będzie elementem klasy zdefiniowanym jako \c;\l;static\u cbot\static;\n;, używanym do komunikacji pomiędzy robotem nadrzędnym i podległym.
Dwoma głównymi postaciami tego ćwiczenia są¦:
1) \l;Transporter na kołach\u object\botgr; bez ogniwa elektrycznego, wobec czego unieruchomiony. Jest to robot nadrzędny, który powinien zostać zaprogramowany aby mógł przesyłać rozkazy do podległego mu robota.
2) Podległy \l;robot treningowy\u object\bottr;, który jest już zaprogramowany i tylko czeka na rozkazy od robota nadrzędnego.
\b;Robot podległy
Najpierw musisz zrozumieć jak działa program robota podległego. \l;Klasa\u cbot\class; \c;exchange\n; zawiera mechanizmy przekazywania rozkazów. Należy zadeklarować element klasy \c;m_order\n; jako \c;\l;static\u cbot\static;\n;, będzie on zawierał rozkazy do wykonania. Słowo \c;static\n; zapewnia, że element \c;m_order\n; jest współużytkowany przez wszystkie instancje \l;klasy\u cbot\class; exchange.
\c;\s;\l;public\u cbot\public; \l;class\u cbot\class; exchange
\s;{
\s; \l;static\u cbot\static; \l;private\u cbot\private; \l;string\u cbot\string; m_order = "";
\n;Metoda \c;put\n; będzie używana przez robota nadrzędnego do przesyłania rozkazów. Jeśli łańcuch \c;m_order\n; nie jest pusty, robot podległy nie zakończył wykonywania rozkazu a metoda \c;put\n; zwróci wartość \c;false\n; i niczego nie zrobi.
\c;\s; \l;synchronized\u cbot\synchro; \l;bool\u cbot\bool; put(string order)
\s; {
\s; if ( m_order == "" )
\s; {
\s; m_order = order;
\s; return true;
\s; }
\s; else
\s; {
\s; return false;
\s; }
\s; }
\n;
Inna metoda \c;get\n; zostanie użyta przez robota podległego do pobrania rozkazów. Metoda ta zwraca łańcuch zawarty w zmiennej \c;m_order\n; i opróżnia ją, aby mógł być przyjęty nowy rozkaz:
\c;\s; \l;synchronized\u cbot\synchro; string get()
\s; {
\s; string ret = m_order;
\s; m_order = "";
\s; return ret;
\s; }
\s;}
\n;
Główny program niewolnika zawiera instancję klasy \c;exchange\n; nazwaną \c;list\n;.
\c;\s;\l;extern\u cbot\extern; void object::Slave3( )
\s;{
\s; exchange list();
\s; string todo;
\n;
Zewnętrzna pętla \c;while\n; działa w nieskończoność. Wewnętrzna pętla \c;while\n; czeka na rozkaz używając metody \c;get\n; z klasy \c;exchange\n;. Pętla zatrzymuje się gdy metoda \c;get\n; zwróci pusty łańcuch.
\c;\s; \l;while\u cbot\while; ( true )
\s; {
\s; \l;while\u cbot\while; ( true )
\s; {
\s; todo = list.get();
\s; if ( todo != "" ) break;
\s; wait(1);
\s; }
\n;
Po otrzymaniu rozkazu i zapisaniu go w zmiennej \c;todo\n; wystarczy jedynie go wykonać:
\c;\s; if ( \l;strfind\u cbot\strfind;(todo, "move") == 0 )
\s; {
\s; move(\l;strval\u cbot\strval;(\l;strmid\u cbot\strmid;(todo,5)));
\s; }
\s; if ( strfind(todo, "turn") == 0 )
\s; {
\s; turn(strval(strmid(todo,5)));
\s; }
\s; }
\s;}
\n;
\b;Robot nadrzędny
W robocie nadrzędnym należy napisać funkcję nazwaną \c;SendOrder\n;, która wyśle rozkaz do robota podległego:
\c;\s;void object::SendOrder(string order)
\s;{
\s; exchange list();
\s;
\s; while ( list.put(order) == false )
\s; {
\s; wait(1);
\s; }
\s;}
\n;
Pętla \c;while\n; czeka na zakończenie oczekującego rozkazu, czyli na wyjście przez robota podległego z metody \c;get\n;.
Główny program robota nadrzędnego jest bardzo prosty:
\c;\s;extern void object::Remote3( )
\s;{
\s; SendOrder("move(20)");
\s; SendOrder("turn(90)");
\s; SendOrder("move(20)");
\s; SendOrder("turn(90)");
\s; SendOrder("move(10)");
\s; SendOrder("turn(90)");
\s; SendOrder("move(10)");
\s; SendOrder("turn(-90)");
\s; SendOrder("move(10)");
\s;}
\n;
Klawisz \key;\key help;\norm; umożliwia wyświetlenie tych informacji w dowolnej chwili.
\t;Zobacz również
\l;Sterowanie\u command; i \l;programowanie\u cbot;.