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] - Wywoływanie funkcji z jednego robota dla drugiego

DaFFy92 - 17-02-2010, 20:49
Temat postu: Wywoływanie funkcji z jednego robota dla drugiego
Załóżmy że mamy dwa roboty: A i B. Robota A ma pewien program. Czy można wywołać ten program z robota B, tak żeby to robot A wykonał daną procedurę?

Próbowałem to zrobić, ale przy wywoływaniu z robota B wykonywał to robot B.

bbiidduull - 17-02-2010, 20:57

Tak :D Robot A sprawdza czy w pliku tekstowym/przekaźniku nie ma odpowiednich danych. Robot B zapisuje dane.
Bartek c++ - 17-02-2010, 21:01

Mozna zakodowac do stacji przekaznikowej np: robot a wysyla zakodowane a robot b odkoduje i wykonuje program.
FE4R - 17-02-2010, 21:42

Można to zrobić i bez stacji przekaźnikowej; dzięki klasom.

W języku CBOT funkcje, które stworzysz wewnątrz klasy to metody, a wszystkie zmienne to pola. Inne jest tylko nazewnictwo i deklarowanie, ale działanie takie samo.

Każda klasa w CBOT musi być publiczna, więc i jej metoda zazwyczaj będzie publiczna.

Co prawda nie jestem jeszcze dobrze obeznany w klasach, ale jeśli jeden robot będzie miał klasę z metodą:
Kod:
public class MojaKlasa
{

void MojaFunkcja()
{
instrukcje...
}


To u drugiego można wywołać tą metodę tworząc egzemplarz klasy i odwołanie do metody tej klasy(nazwę zlecenie można zastąpić inną).
Kod:
extern void object::Program2()
{
MojaKlasa zlecenie(); // stworzenie egzemplarza klasy MojaKlasa o nazwie zlecenie

zlecenie.MojaFunkcja(); // pamietaj o kropce pomiedzy 'zlecenie' a MojaFunkcja
}


Jeśli Twoja funkcja nie jest typu void, tylko coś oblicza, to będzie to wyglądać podobnie. Odwołam się do przykładu funkcji, który wcześniej opisywałem.

Pierwszy robot:
Kod:
public class MojaKlasa
{
float MojaFunkcja(int wartosc)
{
float a = sin(wartosc);

return a;
}


Drugi robot:
Kod:
extern void object::Program2()
{
MojaKlasa zlecenie();

message(zlecenie.MojaFunkcja(40)); // nie zapomnij o parametrze metody - wyswietli 0.64
}


W razie problemu polecam się na przyszłość :P

Berserker - 17-02-2010, 23:24

Jesli dobrze rozumiem, chcesz zrobic cos takiego:
Robot A ma juz przygotowane polecenia: strzelaj, obroc sie o kat i jedz do przodu o odleglosc.
Teraz za pomoca robota B chcesz sprawic, zeby robot A wykonal ktoras z tych instrukcji.

Jak Fear mowil, mozna to zrobic za pomoca klasy jednak Fear chyba nie zrozumial co chcesz :P

Latwiej to najpierw zrobic za pomoca stacji przekaznikowych, nie chce mi sie po raz enty tlumaczyc jak sie uzywa klas.

Programujemy robota A, zeby sprawdzal caly czas czy w stacji jest informacja np "rozkaz"
Kod:
while(testinfo("rozkaz", 1000) != true) wait(1);

Teraz programujemy robota B, by wyslal rozkaz:
Kod:
send("rozkaz", 0, 1000);

Jesli chcesz miec wiecej polecen, robot A musi rozrozniac, jakie polecenia ma wykonac. Mozesz np ponumerowac, ze move to 0, turn to 1 a fire to 4.
Dalej nie bede tlumaczyl, w koncu najlepsza zabawa w tej grze jest dochodzenie samemu jak rozwiazac pewne sprawy :)

FE4R - 17-02-2010, 23:48

Berserker napisał/a:
Jesli chcesz miec wiecej polecen, robot A musi rozrozniac, jakie polecenia ma wykonac. Mozesz np ponumerowac, ze move to 0, turn to 1 a fire to 4.
Dalej nie bede tlumaczyl, w koncu najlepsza zabawa w tej grze jest dochodzenie samemu jak rozwiazac pewne sprawy :)

Takim sposobem można wysyłać jedynie numery poleceń, które robot B ma wykonać na polecienie robota A. Ale trzeba wcześniej zaprogramować, że rozkaz numer 1 to fire, a rozkaz numer 2 to turn. Nie prześlesz przecież wiadomości "move(5);" do stacji przekaźnikowej. Znaczy można, ale robot B tego nie odczyta jako polecenie. Jak przynajmniej nie znam sposobu, aby zamienić łańcuch na instrukcję...
Można również zrobić tak, że robot B będzie już miał instrukcje, ale parametry będą przesyłane przez Stację przekaźnikową, ale to wszystko można zrobić dzięki klasom.

adiblol - 17-02-2010, 23:49

Berserker napisał/a:

Latwiej to najpierw zrobic za pomoca stacji przekaznikowych, nie chce mi sie po raz enty tlumaczyc jak sie uzywa klas.

Z klasami jest ANALOGICZNIE.

Przyjmijmy że mamy klasę sterowanie:
Kod:

public class sterowanie {
 static bool jest_rozkaz;
}

i tworzymy instancję sterowanko w każdym robocie który jej używa:
Kod:
sterowanie sterowanko = new sterowanie;


Nie jest to dużo trudniejsze, wymaga tylko stworzenia klasy (3 linijki w jednym programie) i tworzenia instancji (+1 linijka na każdy program), a przy tym jakie profesjonalne i jak dużo ma możliwości ulepszania. :)

Oczekiwanie na rozkaz:
Stacje:
Cytat:

Programujemy robota A, zeby sprawdzal caly czas czy w stacji jest informacja np "rozkaz"
Kod:
while(testinfo("rozkaz", 1000) != true) wait(1);


Klasy:
Kod:
while(sterowanko.jest_rozkaz != true) wait(1);


Wysyłanie rozkazu:
Stacje:
Cytat:

Teraz programujemy robota B, by wyslal rozkaz:
Kod:
send("rozkaz", 0, 1000);


Klasy:
Kod:
sterowanko.jest_rozkaz = true;


Przekazywanie identyfikatora rozkazu lub innych argumentów:
Cytat:

Jesli chcesz miec wiecej polecen, robot A musi rozrozniac, jakie polecenia ma wykonac. Mozesz np ponumerowac, ze move to 0, turn to 1 a fire to 4.

Tak samo z klasami, w zmiennej możesz zapisywać numer funkcji albo nawet stringi z nazwą...


Mam nadzieję że na zasadzie analogii wszyscy "zagorzali przekaźnikowcy" zrozumieją klasy :)

Berserker - 18-02-2010, 00:34

Cytat:
Mam nadzieję że na zasadzie analogii wszyscy "zagorzali przekaźnikowcy" zrozumieją klasy

Powiem tak: niby to jest to samo, ale jesli tlumaczysz metode na czyms co jest ogolnie znane, to jest znacznie mniejsza szansa, niz napiszesz "nalezy stworzyc klase z polem statycznym typu float/int oraz utworzyc instancje tej klasy na obu robotach" ze uzytkownik zrozumie i nie ucieknie na jakies anglojezyczne forum ("po angielsku tez nie rozumiem, ale przynajmniej to jest jezyk obcy i mam prawo")


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