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
Forum - Polski Portal COLOBOTa
Strona głównaStrona główna UżytkownicyUżytkownicy GrupyGrupy StatystykiStatystyki


Poprzedni temat «» Następny temat
Wywoływanie funkcji z jednego robota dla drugiego
Autor Wiadomość
DaFFy92


Pomógł: 1 raz
Wiek: 25
Dołączył: 22 Sie 2008
Posty: 9
Wysłany: 17-02-2010, 20:49   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 


Dołączył: 09 Lut 2009
Posty: 140
Wysłany: 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++ 


Twoja ulubiona misja: Tropica - Czas na atak
Pomógł: 6 razy
Wiek: 20
Dołączył: 07 Lip 2009
Posty: 390
Wysłany: 17-02-2010, 21:01   

Mozna zakodowac do stacji przekaznikowej np: robot a wysyla zakodowane a robot b odkoduje i wykonuje program.
_________________

 
     
FE4R 


Twoja ulubiona misja: Saari - Inwazja
Pomógł: 4 razy
Wiek: 24
Dołączył: 21 Paź 2009
Posty: 144
Wysłany: 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 
Dark Ness


Twoja ulubiona misja: Ofrenia
Pomógł: 16 razy
Wiek: 24
Dołączył: 24 Mar 2009
Posty: 496
Skąd: Bigos
Wysłany: 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 


Twoja ulubiona misja: Saari - Inwazja
Pomógł: 4 razy
Wiek: 24
Dołączył: 21 Paź 2009
Posty: 144
Wysłany: 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 
Administrator forum
FLOSS FTW!


Twoja ulubiona misja: porównywanie formatów audio
Pomógł: 18 razy
Dołączył: 21 Kwi 2008
Posty: 1313
Skąd: pokój odsłuchowy
Wysłany: 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 :)
_________________
1Tbps Project && Telecomix Network

 
 
     
Berserker 
Dark Ness


Twoja ulubiona misja: Ofrenia
Pomógł: 16 razy
Wiek: 24
Dołączył: 24 Mar 2009
Posty: 496
Skąd: Bigos
Wysłany: 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")
 
 
     
Wyświetl posty z ostatnich:   

Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Polski Portal COLOBOTa © 2008 - 2012