|
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 .
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.
|
|