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] - Program do naładowania pobliskiej baterii

LooC - 18-12-2008, 16:15
Temat postu: Program do naładowania pobliskiej baterii
Witam, przedwczoraj zacząłem zabawę z colobotem. Chciałem napisać mały programik dla robota żeby sie nie nudził na ładowanie pobliskiej baterii.
Oto owoc mojego pisania:

Kod:
extern void object::charge_nearest_powercell()
{
object bateria;
point start;
object elektrownia;
point startbateria;

start=position;

elektrownia=radar(PowerStation);

startbateria=bateria.position;
bateria=radar(PowerCell);
goto(bateria.position);
grab();
goto(elektrownia.position);
wait(5);
goto(startbateria);
drop();
goto(start);




}

Wiem że wszystko jest tu bez sensu ale jakie umiejętności taki program :P .
Po naciśnięciu buttona żeby robot wykonał zadanie, po prostu nie reaguje.
Poza tym chciałbym ten program udoskonalić by ładował wszystkie baterie poniżej 100% naładowania. Proszę o pomoc, razem z wytłumaczeniem.
Pozdro.


///Błędy, "Zacząłem" a nie "Zaczełem" ! - DeiDara

DemoLisH - 18-12-2008, 22:47
Temat postu: RE: Program do naładowania pobliskiej baterii
to

bateria=radar(PowerCell);

musisz dać przed

startbateria=bateria.position;


a poziom baterii możesz odczytać za pomocą
this.energyCell.energyLevel

this to wskaźnik do aktualnego obiektu(tak poza tym nie jest to potrzebne ale program wygląda bardziej przeszyjcie)

energyCell to aktualna bateria w robocie

energyLevel zwraca wartość poziomu naładowania baterii( w wartości od 0 do 1, np. 0.49 to 49%, 1 to 100%)
chyba o niczym nie zapomniałem


///Puk puk!!Polskie znaki istnieją - DeiDara

Piter - 19-12-2008, 11:09
Temat postu: RE: Program do naładowania pobliskiej baterii
Demolish ma rację
LooC - 19-12-2008, 12:55
Temat postu: RE: Program do naładowania pobliskiej baterii
Ale program ma lądować wszystkie baterie które nie są używane i są poniżej 100% naładowania. A nie te które ma w sobie


///Błędy! - DeiDara

Zibo - 24-12-2008, 14:34
Temat postu: RE: Program do naładowania pobliskiej baterii
Witam.

Również przybywam na to forum z podobnym problemem, jak założyciel tematu.
A mianowicie:

Czy jest możliwość wykrycia baterii, która ma określony już poziom energii?
(chcę zaprogramować robota, aby wymieniał zużyte baterie w innych pajacach)
Jeśli nie, to czy poprzez funkcję radar() można wykrywać po kolei obiekty w strefie od najbliższego do najbardziej oddalonego?
Lub może jeszcze jakieś inne rozwiązanie?


Pozdrawiam.


///Błędy! - DeiDara

DemoLisH - 24-12-2008, 15:38
Temat postu: RE: Program do naładowania pobliskiej baterii
ostatni argument funkcji radar:

way: float (domyślna wartość: 1)
Określa sposób wykrywania obiektu. Przy wartości 1, znajduje najbliższy obiekt w podanej strefie. Przy wartości-1, znajduje najdalszy obiekt w strefie.

poczytaj sobie o funkcji radar

shoter - 24-12-2008, 16:05
Temat postu: RE: Program do naładowania pobliskiej baterii
Cytat:
Zibo napisał/a:

Czy jest możliwość wykrycia baterii, która ma określony już poziom energii?
(chcę zaprogramować robota, aby wymieniał zużyte baterie w innych pajacach)
Jeśli nie, to czy poprzez funkcję radar() można wykrywać po kolei obiekty w strefie od najbliższego do najbardziej oddalonego?
Lub może jeszcze jakieś inne rozwiązanie?
Pozdrawiam.

poziom baterii w robocie :
<OBJECT>.energyCell.energyLevel
zużyta :( w ponad 10%)
<OBJECT>.energyCell.energyLevel < 0.9
radarem można wykrywać coraz dalsze obiekty...wystarczy pętla for ;)


///Błędy! - DeiDara

Zibo - 24-12-2008, 18:50
Temat postu: RE: Program do naładowania pobliskiej baterii
Hyyy, zmienna way jest typu float. To w pełni rozwiązuje sprawę ;'].

Cytat:
DemoLisH napisał/a:
Określa sposób wykrywania obiektu. Przy wartości 1, znajduje najbliższy obiekt w podanej strefie. Przy wartości-1, znajduje najdalszy obiekt w strefie.


Przeoczyłem typ tego argumentu, a opis został tak napisany, że byłem przekonany, iż możemy w to miejsce wklepać tylko 2 wartości.


Pozdrawiam.


PS. Miło widzieć, że ta gra wciąż żyje.


EDIT: Problem rozwiązałem trochę innym sposobem, gdyż powyższy sprawiał trudności. Szukanie obiektu spełniającego ustalone warunki wokół bota rozwiązałem konstrukcją:

object wykryty = null;
for( float odleglosc = 0.0; odleglosc <= 20.0; odleglosc += 0.05 )
{
      wykryty = radar( PowerCell, 0, 360, 0, odleglosc, -1 );
      if( wykryty.energyLevel < 1 )
      {
            // co robimy z baterią <100% energii
      }
}


(to chyba rozwiązanie dla autora tematu - jeśli jakieś pytania co do tego, to odpowiem bardzo chętnie :-7 )

Zibo - 24-12-2008, 23:31
Temat postu: RE: Program do naładowania pobliskiej baterii
Ah, skoro już ten temat jest... :)

Wykrywanie wolno stojących pustych baterii jest raczej mało przydatnym algorytmem - z tej racji, że zużyte baterie zazwyczaj zużywają się w bot'ach/budynkach - a z wykryciem takowej baterii mam nie lada kłopot...

Staram się napisać programik dla bota naładowywacza-pustych-baterii ;->. Lecz! Jak sprawdzić stan baterii w JAKIMKOLWIEK bocie? Bo przecież napisanie blisko 20'u funkcji radaru(dla każdego typu bota) i do tego bot.energyCell.energyLevel jest raczej szalone?

Jest jakieś rozwiązanie tego problemu?


///Błędy! - DeiDara[/color]

DemoLisH - 24-12-2008, 23:46
Temat postu: RE: Program do naładowania pobliskiej baterii
Cytat:
Lecz! Jak sprawdzić stan baterii w JAKIMKOLWIEK bocie?

sam sobie odpowiedziałeś bot.energyCell.energyLevel

///Błędy! - DeiDara

Zibo - 25-12-2008, 01:08
Temat postu: RE: Program do naładowania pobliskiej baterii
Nie rozumiemy się.
Mam taki algorytm szukania pustych baterii:

object emptyCell = null;
for( float odleglosc = 0.0; odleglosc <= 20.0; odleglosc += 0.05 )
{
      emptyCell = radar( PowerCell, 0, 360, 0, odleglosc, -1 );
      if( emptyCell.energyLevel == 0 )
      {
            // instrukcje
      }
}


Jak już pisałem - jest to mało użyteczne, bo baterie wsadzone w boty nie są wykrywane (aby je wykryć, to jedyne co mi przychodzi do głowy, to napisanie ~20 różnych funkcji radar( dokładna_nazwa_bota ) i wtedy pobrać stan baterii na których jeżdżą)...

DemoLisH - 25-12-2008, 01:11
Temat postu: RE: Program do naładowania pobliskiej baterii
nie prawda bo zamiast nazwy bota, w radar możesz użyć 0 :)
i sprawdzić co ma w sobie wsadzone albo sprawdzić czy to jest bateria


///Błędy!(Co ma w sobie wsadzone tak:)) - DeiDara

DemoLisH - 25-12-2008, 01:15
Temat postu: RE: Program do naładowania pobliskiej baterii
object emptyCell = null;

for( float odleglosc = 0.0; odleglosc <= 20.0; odleglosc += 0.05 )
{

emptyCell = radar( 0, 0, 360, 0, odleglosc, -1 );

if( emptyCell.category == PowerCell )
{
// instrukcje
}
else if( emptyCell.energyCell.category == PowerCell )
{
// instrukcje
}

}

Zibo - 25-12-2008, 01:52
Temat postu: RE: Program do naładowania pobliskiej baterii
To już wygląda na coś przydatnego. B)
"Jutro" przetestuję niezawodność powyższego.
Dzięki.

Zibo - 25-12-2008, 13:42
Temat postu: RE: Program do naładowania pobliskiej baterii
Cytat:
(...)
else if( emptyCell.energyCell.category == PowerCell )
(...)


Niestety. Jeśli wykryty obiekt będzie np. budynkiem i będziemy z niego chcieli wyciągnąć składową .energyCell program automatycznie jest przerywany, gdyż, zdaje się, jest to niedopuszczalne.

(pomijam oczywiście, że wykryty obiekt musi być niezerowy - bo i bez tego program wylatuje w powietrze po 1-wszym obronie pętli)

Wygląda na to, że będę musiał wstukać 21 alternatyw w warunku... :<


EDIT: Rozwiązanie można przeżyć - trochę więcej operacji dla procka... :

EC_Switcher


(jedną kategorię botów ominąłem)

Mam nadzieję, że komuś się przyda.


Pozdrawiam.

DemoLisH - 26-12-2008, 00:11
Temat postu: RE: Program do naładowania pobliskiej baterii
object emptyCell = null;

for( float odleglosc = 0.0; odleglosc <= 20.0; odleglosc += 0.05 )
{
emptyCell = radar( 0, 0, 360, 0, odleglosc, -1 );
if( emptyCell.category == PowerCell )
{
// instrukcje
}
else if(emptyCell.energyCell != null && emptyCell.energyCell.category == PowerCell )
{
// instrukcje
}
}

to sprobuj to, zapewne chodzilo o to, ze nie bylo baterii w pojezdzie lub budynku

adiblol - 02-01-2009, 19:10
Temat postu: RE: Program do naładowania pobliskiej baterii
Prościej szukać przez funkcję retobject. Poczytajcie na satcom'ie. W moim programie Muliwieżowiec używana jest taka metoda.

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