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
Przekazywanie zmienniej między robotami?
Autor Wiadomość
FE4R 


Twoja ulubiona misja: Saari - Inwazja
Pomógł: 4 razy
Wiek: 24
Dołączył: 21 Paź 2009
Posty: 144
Wysłany: 30-11-2009, 17:12   

Chyba muszę sobie kupić podr. do C++'a, to może coś zakumam, bo nie idzie mi zrozumienie klasy w ogólnym aspekcie (nie tylko programowania obiektowego)...
 
     
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: 30-11-2009, 17:39   

Na chlopski rozum: klasa to taki typ ktory jest tworzony przez ciebie, co oznacza, ze musisz stworzyc zmienna w programie aby otrzymac dostep do klasy.
Kod:

public class klasa
{
}
extern void object::Bla()
{
klasa test();
}

Ale pusta klasa nikomu nie jest potrzebna, wiec dodajmy do niej jakas zmienna.
Kod:

public class klasa
{
static object target = null;
}

W ten sposob mamy w niej zmienna typu object. Malo komu sie przydaje zmienna z 'null' w srodku, wiec warto by bylo dac w niej np info o mrowce.
Kod:

test.target = radar(AlienAnt);

Mamy mrowke. Mrowki nie moga se lazic bezkarnie, wiec trzeba ja eksterminowac. Jesli masz batalion robotow chetnych do zabicia jakiejs mrowki, to nie znajdujesz im celu poleceniem
Kod:

object p;
p = radar(AlienAnt);

tylko
Kod:

p = test.target;

W ten sposob roboty nie beda latac po mapie w pogoni za mrowkami, tylko wszystkie pojda na ta biedna jedyna.
Ale zeby wszystkie roboty po prostu szarzowaly na jedna mrowke to takie troche... nieinteligentne, wiec poprzydzielamy im imiona w postaci cyferek. Zakladajac, ze to beda 4 roboty, nadamy im imiona 1...4. Najpierw warto ustalic, jakie imie dostanie 1 robot.
Kod:

public class klasa
{
static object target = null;
static int name = 1;
}

Mamy imie dla pierwszego bota, pozostaje przydzielic imiona nastepnym
Kod:

public class klasa
{
static object target = null;
static int name = 1;
synchronized int getname()
{
int ret;
ret = name;
name = name + 1;
return ret;
}
}

'synchronized' w funkcji sprawia, ze kazdy robot bedzie ja wykonywal osobno, wiec nie ma obaw, ze dwa roboty beda mialy jednakowe imiona.
Pozostaje zapoznac boty z ich nowiutkimi mianami.
Kod:

int name;
name = test.getname();

Napisalbym jeszcze jak pozycje dobrac, ale to nie jest poradnik 'jak zabic mrowke majac do dyspozycji 4 zaprogramowane roboty'.
_________________
 
 
     
FE4R 


Twoja ulubiona misja: Saari - Inwazja
Pomógł: 4 razy
Wiek: 24
Dołączył: 21 Paź 2009
Posty: 144
Wysłany: 30-11-2009, 22:16   

Aha. No dobrze.

A czy lepiej jest, aby robot 'zarządca' stworzył klasę czy może robot, który będzie jeździł w pętli.

Według mojej teorii - robot, któremu wyczerpało się ogniwo - nadaje zmiennej w klasie numer 1555. Robot zbierak interpretuje numer, jako włącznik dla zamiany ogniwa robotowi.
To już wykonałem poprawnie.

Ale jest problem - numer został wysłany tylko przez jednego robota o tej jednego kategorii - a co z innymi? Stworzyłem coś takiego:

Kod:
public class Codes
{

public int cat = 0; // kategoria obiektu

}


Gdy robotowi wyczerpuje się ogniwo, nadaje zmiennej 'cat' wartość WheeledOrgaShooter, bo akurat tak się nazywa. Wtedy robot zbierak wykorzystuje daną kategorię, aby przy funkcji radar znaleźć robota. Tylko, że może znaleźć niewłaściwego, bo ten właściwy nie będzie ani najbliższy, ani najdalszy. Czy jest jakiś sposób, aby wszystkie właściwości(pozycja, energyCell.energyLevel i inne) robota wysyłającego kod 1555 był zapisany i wtedy abierak mógłby to wykorzystać?

Coś na obraz - ktoś ci coś wysyła, a ty znasz jego IP i dobierasz się do niego.

Kolejny problem to jest destruktor - coś, co by resetowało 'kod 1555', wezwanie o pomoc do 0. Bo przecież nie chciałbym, aby robot zbierak zrobił swoje, a zmienna w klasie nadal by pozostała 1555 i wracałby cały czas do tego robota...

Wiem, że trochę mi to trudno opisać, ale zaczynam coś kumać, więc mam nadzieję, że będę w stanie to łatwiej wytłumaczyć?
 
     
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: 01-12-2009, 00:21   

Cytat:
A czy lepiej jest, aby robot 'zarządca' stworzył klasę czy może robot, który będzie jeździł w pętli.

Ja zawsze albo daje klase robotowi zarzadzajacemu, albo wszystkie klasy daje w jednym robocie.

Kod:
]public int cat = 0; // kategoria obiektu

Pierwszy blad, zmienna musza byc statyczne, nie rozumiem po co (wg opisu po to, by mogly ja zmieniac/czytac wszystkie roboty ktore uzywaja klasy).

Cytat:
Kolejny problem to jest destruktor - coś, co by resetowało 'kod 1555', wezwanie o pomoc do 0. Bo przecież nie chciałbym, aby robot zbierak zrobił swoje, a zmienna w klasie nadal by pozostała 1555 i wracałby cały czas do tego robota...


Da sie po prostu wpisujac 'test.kod = 0;'. Ja proponuje odrazu resetowac zmienna a info o tym, ze kots absolutnie niezbednie potrzebuje naszej pomocy zapisac do jakiejs zmiennej ktora juz jest w funkcji.

Cytat:
Gdy robotowi wyczerpuje się ogniwo, nadaje zmiennej 'cat' wartość WheeledOrgaShooter, bo akurat tak się nazywa. Wtedy robot zbierak wykorzystuje daną kategorię, aby przy funkcji radar znaleźć robota. Tylko, że może znaleźć niewłaściwego, bo ten właściwy nie będzie ani najbliższy, ani najdalszy. Czy jest jakiś sposób, aby wszystkie właściwości(pozycja, energyCell.energyLevel i inne) robota wysyłającego kod 1555 był zapisany i wtedy abierak mógłby to wykorzystać?

Sa 2 sposoby, jeden jest beznadziejny a drugi jest pro.
1) Po prostu czytasz odleglosc tych robotow od siebie, a pozniej w radarze wpisujesz np.
Kod:
radar(test.cat, 0, 360, test.dist-1, test.dist+1);

Wtedy bedzie wykrywac w bardzo cieniutkim pierscieniu kolowym, i raczej wykryje akurat twojego bota.

2) Zamiast
Kod:

static int cat = 0;

Piszesz
Kod:

static object me = null;

A w robocie podajesz
Kod:

test.me = this;

W ten sposob jakby radarem potraktowales siebie i zapisujesz info o sobie w postaci zmiennej test.me. Pamietaj, ze ta zmienna musi byc stale aktualizowana.
_________________
 
 
     
shoter
Gość


Wysłany: 01-12-2009, 12:56   

klas na forum nie zrozumiesz nie trudź sie...Ja klasuje wszystkiego.Klasa to obiekt.Obiekt to cegła.Co robi objekt robota zbieracza?Zbiera...Czyli klase piszemy tak aby mogła coś zbierać ew. porozumiewać się z innymi robotami.(Ja najczęściej w klasach jakiś mały problem sobie opisuje.program bardziej opieram niestety funkcyjnie z powodu języka CBOT.)
Np klasa robota zbieraka

Kod:
public class zbierak
{
int ile_tytan;
void zbierz_tytan()
{
//robot zbiera tytan
ile_tytan++;
message("Zebralem juz " + ile_tytan + " kostek tytanu.",DisplayInfo);
}

}


widzisz?Klase definiujemy np tak zbierak robotA();
uzywajmy jej tak robotA.zbierz_tytan();.
no i to byłoby na tyle...klasy mogą opisywać jakieś mniejsze zagadnienie,np odbieranie informacji ze stacji przekaznikowej

Klasa może robić wszystko...

np w moim programie kazdemu robotowi przypisywala dana liczbe.Program był bardzo fajny ^^
Kod:


public class numer
{
public int nr;
static public int ktory=0;

void numer()
{
ktory += 1;
ktory %= 10;
nr = ktory;
} }
 
     
FE4R 


Twoja ulubiona misja: Saari - Inwazja
Pomógł: 4 razy
Wiek: 24
Dołączył: 21 Paź 2009
Posty: 144
Wysłany: 01-12-2009, 18:40   

Już mniej więcej rozumiem, na jakiej zasadzie działa to, co mi przedstawiliście. To dużo w porównaniu do kilku dni wcześniej, gdy o klasach nie wiedziałem nic.

Prawdopodobnie niedługo odkryję jakieś ciekawsze zastosowania dla klas.

Ale póki co - jest problem (tak, kolejny, :P ), z którym nie potrafię sobie poradzić.
Nie wynika on z błędu z klasami, ale z natury gry.
A mianowicie...

Practice Bot jeździ sobie, póki nie wyczerpie mu się ogniwo. Gdy tak się stanie - zamienia wartość zmiennej w klasie na 1555, podaje swoją pozycję, a zbierak interpretuje kod 1555 jako wezwanie o pomoc przez robota, który go wysłał. Leci po nowe, pełne ogniwo, potem do robota, wyciąga zużyte i...
Practice Bot przerywa działanie programu bez wysyłania komunikatu o błędzie. Czy jest jakiś sposób, aby PracticeBot nie przerywał?

Kod użyty do czekania na załadowanie:

do{
wait(1);
}while(energyCell.energyLevel != 1);
 
     
shoter


Dołączył: 24 Gru 2008
Posty: 56
Wysłany: 01-12-2009, 18:55   

czy ty zauważyłeś że podczas gdy wyjmiesz ogniwo to energyCell = null?a skoro nic tam nie ma to proba wyciagniecia stamtad energyLevel konczy sie bledem :D ?

jak to ma wygladac :

Kod:
//wyczerpujemy energie
do
{
motor(1,1);
}while(energyCell.energyLevel != 0);
//czekamy na wyjecie ogniwa
do
{wait(1);
}while(energyCell == null)
//czekamy na ogniwo
do{
wait(1);
}while(energyCell != null)

//tutaj juz masz ogniwo


proste?Nieprawdaz?Nie mozna zagladac do srodka klasy(energyCell w jakims tam sensie jest klasa :P ) gdy jest ona pusta...(to tak jakby chcial wejsc do szybu windy gdy jej nie ma :D ,co sie stanie?Spadniesz...XD)
 
     
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: 01-12-2009, 19:46   

Albo po prostu
Kod:

while(energyCell == null or energyCell.energyLevel != 1) wait(1);


Po co sie meczyc z 10 linijkami kodu :)
_________________
 
 
     
shoter


Dołączył: 24 Gru 2008
Posty: 56
Wysłany: 01-12-2009, 20:00   

ehhh o samym while() zapomniałem :D ,ale zrozumiałeś istote(poczware xD) swojego problemu?ya?
 
     
FE4R 


Twoja ulubiona misja: Saari - Inwazja
Pomógł: 4 razy
Wiek: 24
Dołączył: 21 Paź 2009
Posty: 144
Wysłany: 13-12-2009, 14:07   

Chciałem odświeżyć temat.

Co prawda rozwiązałem problemy z ogniwem oraz z przekazywaniem numeru kodu w klasie, jak również jak zresetować kod po zmianie ogniwa.

Jednak jeszcze nie próbowałem zrobić tego, gdy dwa roboty jednocześnie będą chciały wysłać 'kod 1555'. Myślałem, żeby zastosować metodę z synchronized, żeby drugi robot bez ogniwa poczekał, aż pierwszy zresetuje kod do 0, a wtedy drugi poda swoje dane, ale niestety coś mi z tym synchronized nie wyszło.

Czy jest jakiś prosty sposób, aby rozwiązać ten problem?
 
     
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: 14-12-2009, 09:05   

Tablice. Za pomocą tablic kolejkujesz sobie obiekty do "pomocenia im" . Jakbym miał w domu neta i nie pisał tego na ipodzie to bym napisał sam to, tak to sam se musisz poradzić sam
_________________
 
 
     
Wyświetl posty z ostatnich:   

Wersja do druku

Skocz do:  

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