Oryginalna strona colobot.cba.pl umarła, gdy cba.pl przestało oferować darmowy hosting. To jest statyczny mirror, pobrany w 2018. ~krzys_h
|
Forum - Polski Portal COLOBOTa |
|
|
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 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ść |
|
|
|
|
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
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") |
|
|
|
|
|
|
| |
|
|
|
|
Polski Portal COLOBOTa © 2008 - 2012 |
|
|