Oryginalna strona colobot.cba.pl umarła, gdy cba.pl przestało oferować darmowy hosting. To jest statyczny mirror, pobrany w 2018. ~krzys_h
 
Polski Portal COLOBOTa
COLOBOT Polish Portal

Problemy [programowanie] - CBOT Language - parę pytań

Phitherek_ - 09-07-2011, 19:50
Temat postu: CBOT Language - parę pytań
Mam parę pytań, które nasunęły mi się w związku z CBOT Language (tak na marginesie: próbuję napisać do każdej misji programy, aby parę kliknięć wystarczyło do ich przejścia - w wersji demo - i stąd się one wzięły):

1. Po pierwsze i najważniejsze - REFERENCJA! To, co jest w pomocy jest według mnie niewystarczające. Nie mogłem tam na przykład znaleźć tak często używanego parametru this.powerCell.powerLevel (musiałem doczytać tutaj) - a pewnie jest więcej takich nieopisanych opcji. Czy zna ktoś jakąś dobrą referencję języka CBOT? A może to wina tego, że korzystam z wersji DEMO?
2. Czy CBOT daje jakąkolwiek możliwość interakcji z użytkownikiem, np. wyświetlenia okna wprowadzenia danych? Czasem by się to przydało do bardziej uniwersalnych programów...
3. To już bardziej do konkretnych funkcji - czy istnieje sposób, aby zmusić bota, żeby dostał się w jakieś miejsce (GOTO) na około, a nie wyświetlał komunikaty typu "Goto: destination inaccessible?". Po przesunięciu bota często program zaczyna działać normalnie...
4. Czy jest jakiś sposób, aby jeżeli miejsce na położenie przedmiotu jest zajęte, bot przesunął się obok, a nie wyświetlał "Destination occupied"?

Na razie to tyle. Pewnie wkrótce nasunie mi się więcej pytań... Proszę o pomoc.
A może po prostu zbyt dużo wymagam?

Simbax - 09-07-2011, 20:06

Nie jestem ekspertem, ale na kilka pytań mogę odpowiedzieć:
1. W czasie tworzenia misji do Colobota 2 bodajże ktoś pozmieniał pliki pomocy do cbota i pododawał nowe rzeczy.
2. Nie. To boli... :(
3. Raczej nie, chociaż kiedyś był taki parametr... E, nie ważne. Zawsze można napisać własne goto :>
4. Tak, starczy trochę pokombinować i mieć kontrolę nad błędami.
Jak pisałem - nie jestem ekspertem. Pewnie zaraz mnie Berserker/adiblol/krzys_h skrytykują. A jeśli to prawda (WOW :D ) to niech oni zrobią do tego solucje ^^

adiblol - 09-07-2011, 21:53

3. errmode(0) i sprawdzaj wartość zwracaną przez goto(...).
4. space(...)

Phitherek_ - 09-07-2011, 22:33

Dziękuję, przyglądnę się temu...
Berserker - 10-07-2011, 15:22

Kod:
int object::go(point c)
 {
     errmode(0);
     point dest = c;
     int err;
     err = goto(c);
     if(err == 0) return 0;
     if(err == 212)
     {
         if(distance2d(position, dest) > 20)
         {
             dest = space(dest);
             don(dest); // tutaj jest funkcja ktora nie robi nic (czeka)
         }
         return 1;
     }
     else
     {
         dest.x = dest.x*0.5+position.x*0.5;
         dest.y = dest.y*0.5+position.y*0.5;
         go(dest);
     }
     return 0;
 }


Do dwoch ostatnich punktow, moze wreszcie ktos zrozumie ta funkcje bo napisalem ja, a za cholere nie wiem o co w niej chodzi :)

Phitherek_ - 10-07-2011, 22:39

Tak więc z tego, co widzę:
1. Masz funkcję, która zwraca wartość int i w argumencie przyjmuje wartość point, czyli punkt przestrzeni, a ponadto jest zawarta w klasie object... Tak jakbyś chciał jej użyć z jakimś obiektem i punktem przestrzeni...
2. Wyłączasz obsługę błędów z gry - i dobrze, bo potem sam sprawdzasz kody błędów i je oprogramowujesz.
3. Kopiujesz argument funkcji do zmiennej dest tego samego typu.
4. Inicjujesz zmienną przechowującą kod błędu i uruchamiasz goto do punktu c.
5. Jeżeli się powiodło - kończysz z 0.
6. Jeżeli kod błędu to 212 (tutaj jeszcze nie doszedłem, co on oznacza - skąd go wytrzasnąłeś?), to jeżeli odległość bota od punktu x jest większa od 20 to znajdujesz w pobliżu wolne miejsce i zapisujesz je do dest, następnie program czeka, a potem kończy się z kodem 1 (tego momentu nie rozumiem, hmmm...).
7. Jeżeli kod błędu jest inny, to wywołujesz rekurencyjnie funkcję dla punktu, który jest środkiem odległości między botem i poprzednim punktem.
8. Ostatecznie kończysz funkcję z kodem 0 po kroku 7.

To była moja krótka analiza kodu. Co ta funkcja miała robić - nie mam pojęcia, prawdopodobnie chodziło o jakieś ulepszenie funkcji goto, aby nie wywalała błędu tylko mimo wszystko szła do przodu (po połowie dystansu, jeżeli nie da się całego), chyba że błąd to to magiczne 212, gdzie szukasz w pobliżu wolnego miejsca, a potem - robisz dokładnie nic...
Może to pomoże Ci jakoś zrozumieć, o co Ci chodziło... a jeżeli nie, to myślę, że ktoś Ci jeszcze pomoże...

Berserker - 11-07-2011, 00:41

212 to liczba zwracana przez goto() kiedy miejsce docelowe jest zajete. Sprawdzone prostym kodem za pomoca message().

Zwracanie wartosci 1 jest po to, zeby w glownym kodzie programu podjac odpowiednie dzialania (czyli sprawdzenie czy miejsce juz sie zwolnilo i wywolanie znowu funkcji go())

Funkcja jest (jesli dobrze pamietam) po to, by roboty nie pchaly sie na stacje energetyczna tylko grzecznie czekaly obok.

Phitherek_ - 11-07-2011, 01:02

Już rozumiem... To ma za zadanie stworzyć kolejkę do stacji energetycznej :) . Fajny pomysł...

Powered by phpBB modified by Przemo & WRIM © 2003 phpBB Group