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

Zasoby - Titanium Collector

Mrocza - 29-08-2011, 12:16
Temat postu: Titanium Collector
To mój program. Co o nim sądzicie?
Berserker - 29-08-2011, 19:43

Nie chce mi sie calego komentowac bo generalnie jest dobrze, ale przydaloby sie nie wylaczac programu np kiedy rudy nie ma - co jesli korzystasz z kopalni i jeszcze nie wydobyla?
Mrocza - 31-08-2011, 07:06

Poprawiłem już to o czym napisałeś, a dodatkowo dodałem możliwość uruchomienia programu z nieopróżnionym chwytakiem. Wyrzuciłem też zmienną err
Berserker - 31-08-2011, 18:42

O, nawet jestes chetny by wdrazac w zycie komentarze :)

Warunek, zeby robot szedl sie ladowac przy sztywnej granicy nie ma wiele sensu, gdyz czasem ruda moze byc bardzo daleko i np. nie dojedziesz na polowie ogniwa, wiec fajnym pomyslem jest liczenie, czy warto sie ladowac.

Jestem ciekaw innych twoich programow, bo masz naprawde kilka fajnych pomyslow.

Raptor - 31-08-2011, 20:53

Czyżby rodziła się konkurencja dla Ciebie Berserker?
Berserker - 31-08-2011, 22:10

Moze sie doczekam drugiego pipoka, ktory umial mi wszystko wygarnac :) Ale czuje, ze bede wreszcie mial z kim dyskutowac.
Mrocza - 31-08-2011, 23:06

Napisałem też program toważyszący dla drugiego robota, donosi on tylko rudę jak najbliżej huty wtedy robot z programem TitaniumCollector pracuje bardzo szybko. Testowałem cały układ przez 6 godzin dzięki programowi do niszczenia tytanu działem. Niestety na razie nie mogę wrzucić bo nie mam neta na kompie (pisze z avilli).

"towarzyszący", nie moglem sie powstrzymac //Berek

Berserker - 31-08-2011, 23:21

Ja lubie miec w bazie do kazdej funkcji po jednym robocie (tytan, ogniwa nuklearne, ogniwa elektryczne i inne), wiec ten robot musialby dla mnie maksymalnie w terenie pracowac - miec odpowiednie reakcje na obecnosc zagrozenia etc.
Mrocza - 31-08-2011, 23:47

Chodzi ci o uciekanie przed mrówkami? Nie mam wpływu na robota jeżeli przemieszcza się z punktu A do punktu B używając instrukcji goto. prościej byłoby zaprogramować robota obronnego dla transporterów.
Berserker - 01-09-2011, 12:37

Myslalem o wczesniejszym sprawdzeniu, czy jest w poblizu zagrozenie i jesli jest nie podejmowac w ogole zadnych dzialan, tylko np. za pomoca klas wyslac robota ktory by je zneutralizowal (np oslaniacz).
Mrocza - 02-09-2011, 16:17

To jest nowa wersja mojego programu wraz ze wspomagaczem i prostą obroną.

[ Dodano: 04-09-2011, 12:43 ]
Nadszedł wrzesień. Forum zamilkło.

Berserker - 25-09-2011, 14:23

Ostatnio nie mam czasu i checi by siedziec w Colobocie, ale chetnie kiedys przejrze twoje programy.
Mrocza - 25-09-2011, 17:05

Dzięki za zainteresowanie. Osobiście też ostatnio nie grałem w ColoBoT'a.

[ Dodano: 01-12-2011, 17:55 ]
Kod:


// TitaniumCollector 01.12.11
// Created by MROCZA

extern void object::TitaniumCollector()
{
   
    object  item;                     // deklaracje zmiennych
    object  convert;
    point   flag (0,0);
    int     i = 0;
   
    errmode(0);                       // błędoodporność
   
    convert = radar(Converter);              // znajdź chutę
    if ( convert == null )                   // jeśli jej nie ma
    {
        message("Brak huty",DisplayError);   // wyświetl wiadomość
        return;                              // i przerwij program
    }
   
    recharge();                              // naładuj się
   
    while (true)                             // powtarzaj w nieskończoność
    {
       
        if(load == null or load.category != TitaniumOre)  // jeśli nie trzymasz rudy
        {                                                 //   lub nie trzymasz nic
           
            if(load != null and load.category != TitaniumOre)  // jeśli to co trzymasz
            {                                                  //   nie jest rudą
                goto(space(position));                         //   idź na wolne miejsce
                drop();                                        //   i zostaw to
            }
           
            while(true)                                        // powtarzaj w pętli
            {
                item = radar(TitaniumOre);                     // szukaj rudy
                if ( item != null ) break;                     // jeśli znajdziesz kontynuuj
                if ( i % 100 == 0 ) message("Nie znaleziono więcej tytanu");
                i++ ;                                          // jeśli nie znajdziesz
                wait(0.1);                                     // po prostu czekaj
            }
           
            if(goto(item.position) == 211)                 // udaj się do rudy
            {
                message("Ruda niedostępna",DisplayError);  // jeśli się nie da
                return;                                    // przerwij program
            }
           
            if( grab() != 0 ) continue;    // podnieś tę rudę, jeśli nie ma czego podnieść
        }                                  // szukaj od nowa
       
        while(true)
        {
            if (goto(convert.position) == 000 ) break;     // zanieś rudę do huty
            if (goto(convert.position) == 212 ) continue;  // jeśli się nie da
            message("Huta niedostępna",DisplayError);      // wyświetl wiadomość
            return;                                        // i przerwij program
        }
       
        errmode(1);  // teraz uwaga na błędy!
       
        item = radar(Titanium,0,59,0,3);   // szukaj tytanu w hucie
        if ( item == null )                // jeśli go tam nie ma
        {
            drop();                        // zostaw tę rudę
            move(-2);                      // dosuń się
            wait(10);                      // i zaczekaj
        }
        else                               // jeśli jest tam tytan
        {
            turn(60);                      // obróć się w prawo  //
            drop();                        // upuść rudę          /
            turn(-60);                     // obróć się w lewo    //
            grab();                        // podnieś tytan       //
            turn(-60);                     // obróć się w lewo    ///
            drop();                        // upuść go            /// wymień tytan na rudę
            turn(120);                     // obróć się w prawo   ///
            grab();                        // podnieś rudę        //
            turn(-60);                     // obróć się w lewo    //
            drop();                        // upuść rudę          /
            turn(-60);                     // obróć się w lewo   //
            grab();                        // podnieś tytan
           
            errmode(0);   // błędoodporność
           
            if ( flag.x == 0 )  // jeśli wcześniej nie określono punktu składowania
            {
                goto(space(position,6,50,6));  // znajdź wolne miejsce
                flag = position;               // i ustal ten punkt
            }
            else                // jeśli punkt składowania już istnieje
            {
                while(goto(flag) == 212) wait(1);   // idź  do niego
            }
           
            stock();  // składuj tytan
           
        }
       
        recharge();   // naładuj się
       
    }
}

///////////////////////////////////////////////////////////////////////////

void object::recharge()
{
    object item;
   
    errmode(0);
   
    if (energyCell.category == PowerCell)
    {
        if ( energyCell.energyLevel < 0.3 )
        {
            item = radar(PowerStation);
            if(item != null)
            {
               
                while(true)
                {
                    if (goto(item.position) == 000 ) break;
                    if (goto(item.position) == 212 ) continue;
                    message("Stacja energetyczna niedostępna",DisplayError);
                    return;
                }
               
                while( energyCell.energyLevel < 1 ) wait(0.1);
            }
        }
    }
   
   
    else
    {
       
        if ( energyCell.energyLevel < 0.05 )
        {
            float min = 0;
            int   i  =  0;
           
            while (true)
            {
                item = radar(NuclearCell,0,360,min,1000);
               
                while(true)
                {
                    if ( item != null ) break;
                    if ( i % 100 == 0 ) message("Nie znaleziono więcej ogniw atomowych");
                    item = radar(NuclearCell);
                    i++ ;
                    wait(0.1);
                }
               
                if (item.energyLevel >= 0.5) break;
                min = distance (item.position, position) + 0.02;
            }
           
           
            while(true)
            {
                if (goto(item.position) == 000 ) break;
                if (goto(item.position) == 212 ) continue;
                message("Ogniwo atomowe niedostępne",DisplayError);
                return;
            }
           
            errmode(1);
           
            grab (InFront);
            goto (space(position));
            drop (Behind);
            grab (EnergyCell);
            drop (InFront);
            grab (Behind);
            drop (EnergyCell);
           
        }
       
    }
   
}

//////////////////////////////////////////////////////////////////////

void object::stock()
{
    object item;
    float  angle;
    int    i, j;
    point   flag (0,0);
   
    errmode(1);
   
    item = radar(Converter);
   
    if(direction(item.position) > 0)
    {
        turn(direction(item.position)-180);
    }
    else
    {
        turn(direction(item.position)+180);
    }
   
    jet(1);
    wait(0.5);
    move(4);
    jet(-1);
    wait(0.6);
   
    errmode(0);
   
    while(true)
    {
        angle = 0;
       
        if(category == WingedGrabber) j=9;
        else                          j=7;
       
        for(i=0; i<j; i++)
        {
            if( i % 2 == 0 )
            {
                item = radar(Titanium,angle,30,0,3);
                if ( item == null )
                {
                    turn(angle);
                    while(drop() == 106) wait(0.1);
                    turn(-180 - angle);
                    if(j == 7) move(3);
                    return;
                }
               
                angle = angle / -1 + 40;
            }
           
            else
            {
                item = radar(Titanium,angle,30,0,3);
                if ( item == null )
                {
                    turn(angle);
                    while(drop() == 106) wait(0.1);
                    turn(180 - angle);
                    if(j == 7) move(3);
                    return;
                }
               
                angle = angle / -1;
            }
           
        }
       
    }
   
}


//////////////////////////////////////////////////////////////////////




Oto program z poprawkami.

[ Dodano: 02-12-2011, 07:07 ]
Teraz tak czytam i widzę parę niedociągnięć:
    W funkcji stock() chyba niepotrzebnie dodałem zmienną point flag.
    W jednej z pętli if nie potrzebnie dodałem and load.category =! TitaniumOre.

Dlaczego nikt się nie zainteresuje? :-(

Berserker - 02-12-2011, 11:17

Dzisiaj po 21 może go uruchomie, wiec możesz się cieszyc;)
Knight_in_Fire - 02-12-2011, 18:49

W stosunku do wbudowanych programów jest na pewno lepszy, szuka konkretnego miejsca na tytan, tworząc takie kwiatuszki tytanowe. Testowałem na czwartej misji Nowej Ziemi.
Mrocza - 02-12-2011, 22:15

Nowa ziemia? Czyli używałeś robota nurka?
Nie testowałem na nim tego programu!
Działało bez błędów? :-/

Berserker - 03-12-2011, 00:13

Wlasnie: wypieprz fragment recharge() dla robota nurka, on sobie baterii nie zmieni.
Bartek c++ - 07-12-2011, 06:28

Program idealny! :D Po włączeniu go na robocie nie wyskakiwalo zadne error tylko normalnie działał(nie to co przy programach mojej produkcji :P ).
Mrocza - 07-12-2011, 13:24

Nareszcie ktoś docenił. Tylko mógłbyś jeszcze napisać co poprawić.
Berserker - 07-12-2011, 20:30

@up Jak czekales na jakies pochwaly to mogles napisac, ja tam jestem przestawiony na sadzenie kopow w tylek za kazdy blad i oczekuje tego tez od innych, ale wazelina tez jest dostepna :>

Co do programu. Dziwnie reaguje jak sie zablokuje stacje energetyczna, swoja droga rozladowal mi sie wtedy ten bot :) Pierscien z tytanu jest fajnym pomyslem, jednak przydaloby sie konkretne i stale miejsce wyznaczane jakas metoda przez bota badz przez gracza np. flaga - jak sie restartuje program to tworzy nowy pierscien co po czasie moze wkurzyc.

Mrocza - 07-12-2011, 22:48

Czyli po pierwsze ma być tylko jeden pierścień, przypisanie go do flagi byłoby za proste. Wolałbym tego uniknąć, Im mniej ingerencji gracza tym lepiej. Czy jednak dodać flagę?

Ten fragment jest zły? O co chodzi z tą zablokowaną stacją? Goto zwraca wtedy w wyniku 212 więc powinno być ok.
Kod:
            item = radar(PowerStation);
            if(item != null)
            {
               
                while(true)
                {
                    if (goto(item.position) == 000 ) break;
                    if (goto(item.position) == 212 ) continue;
                    message("Stacja energetyczna niedostępna",DisplayError);
                    return;
                }
               
                while( energyCell.energyLevel < 1 ) wait(0.1);
            }

Jeżeli goto jest równe 212 to robot raczej nie rusza się z miejsca więc nie powinien zużywać energii.

Berserker - 08-12-2011, 17:41

@up

Mozesz wyznaczyc np. miejsce obok huty i tam skladowac. Flagi sa po prostu wygodne, bo mozna poustawiac zasoby w miejscach w ktorych najczesciej sie je wykorzystuje -> tytan obok fabryki botow etc.

A z rechargem to mam wrazenie, ze robot po stwierdzeniu niedostepnosci stacji energetycznej kontynuuje swoja prace przez co traci energie. Nie przygladalem sie kodowi i w sumie robota tez nie widzialem bo gdziestam lazil, ale zanim dojechal jak zwolnilem to padl.

Mrocza - 08-12-2011, 22:23

Czyli jeżeli jest flaga to przy niej, jeżeli flagi nie ma to na wolnym miejscu w pobliżu huty.
Nie wiem o co chodzi z tym rechargem ale wiem że jest słaby.

Berserker - 09-12-2011, 16:53

Z tym rechargem to cos pokombinuje, ale narazie to 15min poprawialem twoj kod, zeby byl czytelny. Po cholere tyle spacji i po cholere komentujesz kazda funkcje? "Obroc w lewo" 20x wyglada, jakby program byl pisany dla idioty.
Mrocza - 11-12-2011, 18:33

Ze spacjami jest według mnie czytelniejszy. A cały komentarz jest w ogóle zbędny. Może kiedyś będzie to przeglądał jakiś idiota.
Berserker - 11-12-2011, 18:48

Ze spacjami czytelniejszy? W 3/4 linijek dales tyle spacji, ze funkcja przechodzi na druga linie, nie wiem co jest w tym czytelnego :P
Raptor - 11-12-2011, 19:00

Jak dla mnie, nie powinno się pisać w ogóle komentarzy. Szkoda czasu/bajtów. W końcu program to program, a nie "Nie-boska komedia"...






...a co ja wiem o programowaniu?...

Simbax - 11-12-2011, 19:55

"Komentarze piszemy w celu wyjaśnienia pewnych fragmentów kodu programu, oddzielenia jednej jego części od drugiej, oznaczania funkcji i modułów itp. Odpowiednia ilość komentarzy ułatwia zrozumienie kodu, więc stosuj je często :) " ~Karol Kuczmarski -Kurs C++
Mrocza - 11-12-2011, 21:16

To w końcu jak z tymi komentarzami? Niepotrzebne są te spacje przed komentarzem! Cały komentarz jest zbędny!


Kod:
// TitaniumCollector 11.12.11
// Created by MROCZA

extern void object::TitaniumCollector()
{
   
    object  item;
    object  convert;
    point   flag (0,0);
    int     i = 0;
   
    errmode(0);
   
    convert = radar(Converter);
    if ( convert == null )
    {
        message("Brak huty",DisplayError);
        return;
    }
   
    recharge();   

    while (true)
    {
       
        if(load == null or load.category != TitaniumOre)
        {
           
            if(load != null)
            {
                goto(space(position));
                drop();
            }
           
            while(true)
            {
                item = radar(TitaniumOre);
                if ( item != null ) break;
                if ( i % 100 == 0 ) message("Nie znaleziono więcej tytanu");
                i++ ;
                wait(0.1);
            }
           
            if(goto(item.position) == 211)
            {
                message("Ruda niedostępna",DisplayError);
                return;
            }
           
            if( grab() != 0 ) continue;
        }
       
        while(true)
        {
            if (goto(convert.position) == 000 ) break;
            if (goto(convert.position) == 212 ) continue;
            message("Huta niedostępna",DisplayError);
            return;
        }
       
        errmode(1);
       
        item = radar(Titanium,0,59,0,3);
        if ( item == null )
        {
            drop();
            move(-2);
            wait(10);
        }
        else
        {
            turn(60);
            drop();
            turn(-60);
            grab();
            turn(-60);
            drop();
            turn(120);
            grab();
            turn(-60);
            drop();
            turn(-60);
            grab();
           
            errmode(0);
           
            if ( flag.x == 0 )
            {
                goto(space(position,6,50,6));
                flag = position;
            }
            else
            {
                while(goto(flag) == 212) wait(1);
            }
           
            stock();
           
        }
       
        recharge();
       
    }
}

///////////////////////////////////////////////////////////////////////////

void object::recharge()
{
    object item;
   
    errmode(0);
   
    if (energyCell.category == PowerCell)
    {
        if ( energyCell.energyLevel < 0.3 )
        {
            item = radar(PowerStation);
            if(item != null)
            {
               
                while(true)
                {
                    if (goto(item.position) == 000 ) break;
                    if (goto(item.position) == 212 ) continue;
                    message("Stacja energetyczna niedostępna",DisplayError);
                    return;
                }
               
                while( energyCell.energyLevel < 1 ) wait(0.1);
            }
        }
    }
   
   
    else
    {

        if(category == Subber)
        {
            message("Niski stan baterii",DisplayError);
            return;
        }
       
        if ( energyCell.energyLevel < 0.05 )
        {
            float min = 0;
            int   i  =  0;
           
            while (true)
            {
                item = radar(NuclearCell,0,360,min,1000);
               
                while(true)
                {
                    if ( item != null ) break;
                    if ( i % 100 == 0 ) message("Nie znaleziono więcej ogniw atomowych");
                    item = radar(NuclearCell);
                    i++ ;
                    wait(0.1);
                }
               
                if (item.energyLevel >= 0.5) break;
                min = distance (item.position, position) + 0.02;
            }
           
           
            while(true)
            {
                if (goto(item.position) == 000 ) break;
                if (goto(item.position) == 212 ) continue;
                message("Ogniwo atomowe niedostępne",DisplayError);
                return;
            }
           
            errmode(1);
           
            grab (InFront);
            goto (space(position));
            drop (Behind);
            grab (EnergyCell);
            drop (InFront);
            grab (Behind);
            drop (EnergyCell);
           
        }
       
    }
   
}

//////////////////////////////////////////////////////////////////////

void object::stock()
{
    object item;
    float  angle;
    int    i, j;
       
    errmode(1);
   
    item = radar(Converter);
   
    if(direction(item.position) > 0)
    {
        turn(direction(item.position)-180);
    }
    else
    {
        turn(direction(item.position)+180);
    }
   
    jet(1);
    wait(0.5);
    move(4);
    jet(-1);
    wait(0.6);
   
    errmode(0);
   
    while(true)
    {
        angle = 0;
       
        if(category == WingedGrabber) j=9;
        else                          j=7;
       
        for(i=0; i<j; i++)
        {
            if( i % 2 == 0 )
            {
                item = radar(Titanium,angle,30,0,3);
                if ( item == null )
                {
                    turn(angle);
                    while(drop() == 106) wait(0.1);
                    turn(-180 - angle);
                    if(j == 7) move(3);
                    return;
                }
               
                angle = angle / -1 + 40;
            }
           
            else
            {
                item = radar(Titanium,angle,30,0,3);
                if ( item == null )
                {
                    turn(angle);
                    while(drop() == 106) wait(0.1);
                    turn(180 - angle);
                    if(j == 7) move(3);
                    return;
                }
               
                angle = angle / -1;
            }
           
        }
       
    }
   
}


//////////////////////////////////////////////////////////////////////




Tak to ma wyglądać!!! :evil:
Bez żadnego komentarza. Jeżeli coś jest niejasne to pytajcie. To komentarz wszystko skomplikował. Spacji i enterów jest tutaj tyle ile ma być!

Do poprawy jest jeszcze recharge i zbieranie tytanu przy fladze jeżeli jest != null.[/code]

Berserker - 12-12-2011, 01:08

@Simbax
1) Jesli potrzebujesz komentarzy zeby zrozumiec swoj program to powodzenia :>
2) Komentarze sa po to, zeby objasniac i zwiekszac czytelnosc programu. Jesli dasz komentarz przy kazdej najglupszej linijce w stylu:
Kod:

{ //to jest klamra
   int x = 2; //x jest rowne dwa
} //to jest druga klamra

To nikt tych komentarzy nie bedzie czytac i program w dodatku bedzie wygladal jak smietnik. Jak juz cos robisz to z glowa.

@MROCZA
Teraz mozna nad tym programem pracowac :)

Mrocza - 12-12-2011, 07:56

Wystarczy po deklaracji zmiennych dorzucić to:
Kod:
    item = radar(RedFlag);
    if ( item != null )
    {
        message("Tytan składowany przy czerwonej fladze",DisplayInfo);
        flag = item.position;
    }

I już mamy tytan przy fladze. :-D

To było genialne posunięcie z mojej strony:
Cytat:
Kod:
    else
    {

        if(category == Subber)
        {
            message("Niski stan baterii",DisplayError);
            return;
        }
       
        if ( energyCell.energyLevel < 0.05 )...

No cóż, najlepszym się zdarza.

Simbax - 12-12-2011, 18:40

@Berserker Ja tylko przytoczyłem cytat, niekoniecznie działam zgodnie z jego myślą ;D Właściwie komentarzy używam tylko po to, aby objaśnić po co jest dana zmienna (np. // pomocnicza) i właśnie do oddzielenia od siebie fragmentów kodu. Wtedy program, przynajmniej według mnie, jest faktycznie czytelniejszy.
Mrocza - 26-12-2011, 12:53

Mam nową koncepcję!
Gdyby tak po uformowaniu jednej grupki tytanu nie czekać tylko pracować dalej.
Wyglądało by to tak:

Idź do flagi;
Zwróć się w stronę przeciwną do huty;
Jeżeli przed tobą jest mniej niż j kostek umieść tytan w grupie przed tobą;
Else: obróć się w lewo i uformuj nową grupkę;

W ten sposób można stwożyć coś na kształt fraktala w którym ilość kostek byłaby równa j do kwadratu.

Dla przypomnienia:
Kod:
        if(category == WingedGrabber) j=9;
        else                          j=7;


Co o tym myślicie?

Berserker - 26-12-2011, 14:27

Po co komu tyle tytanu? Tylko limit obiektow bys zapelnial :>
Mrocza - 26-12-2011, 16:18

To tylko 49 kostek.
A jaki efekt!
Jaki jest limit?

Raptor - 26-12-2011, 17:52

MROCZA napisał/a:
Jaki jest limit?

Z limitem jest właśnie taki problem, że nie wiadomo, jaki on jest. Kiedyś wyliczono coś około 600, jednak potem się okazało, że prawdopodobnie zależy to od rodzaju obiektów lub grup obiektów. Grzebanie w jądrze gry powinno przynieść więcej informacji.

Berserker - 26-12-2011, 18:18

Kolo 400 obiektow przenosnych lub 50 innych.
Mrocza - 26-12-2011, 20:08

Roboty i budynki po prostu składają się z większej liczby segmentów a obiekty przenośne mają pojedyńczy model. To właśnie ilośc tych elementów jest ograniczona.
Jeżeli ograniczenie to około 400 mógłbym odpalic taki program do zbierania tytanu, jego rudy, baterii zwykłych i atomowych to zostałaby mi jeszcze połowa limitu na budynki i roboty.

Berserker - 26-12-2011, 21:05

+ rudy tytanu/uranu rozrzucone po mapie, wszystkie drzewka, grzybki i kamyczki, no i obcy.
Mrocza - 26-12-2011, 21:10

Sporo tego.
Ale na 50 kostek zawsze się znajdzie miejsce. :-D

Berserker - 26-12-2011, 21:48

Po co komu 50 kostek? Ja zawsze ustawiam limit na 5, tylko sie po bazie walaja.
Mrocza - 26-12-2011, 21:55

No to zostaniemy przy siedmiu, ewentualnie dziewięciu dla transportera latającego. :-(

[ Dodano: 12-01-2012, 10:44 ]
Mam teraz zajęcia z informatyki (prezentacje w power poincie) i wpadłem na ciekawy pomysł skrócenia programu. Nie mogę teraz sprawdzić czy to w ogóle działa ale to będzie coś takiego:
Kod:
extern void object::Titanium()
{
  goto(radar(Titanium).position);
  grab();
  goto(radar(Converter).position);
  drop();
  move(-2.5);
  wait(14);
  move(2.5);
  grab();
  goto(space(position));
  drop();
}

Raptor - 12-01-2012, 20:03

Nie działa taka optymalizacja. goto musi się odwołać do konkretnej informacji o pozycji, a nie do funkcji radar. Nawet takie cudo: goto(object item = radar(Titanium).position); nie ma prawa działać. Definicja zmiennej nie jest można w funkcji.

[ Dodano: 12-01-2012, 20:06 ]
Aha! Tutaj już nalicza pościdła! Mrocza, nie ma co marudzić :-P .

Mrocza - 12-01-2012, 21:27

Po prostu pod item podstawiam radar(Titanium)

Ale coś takiego:
Kod:
int i;
i = 5;
move(i);

Moge zastąpić tym:
Kod:
move(5);

Dlaczego więc tego:
Kod:
object item;
item = radar(Titanium);
goto(item.position);

Nie mogę zastąpić tym:
Kod:
goto(radar(Titanium).position);


[ Dodano: 12-01-2012, 21:42 ]
Yey! mam 146 postów!

Raptor - 12-01-2012, 21:46

Bo, jak już pisałem, goto nie może się odwołać do żadnej z tych funkcji, oprócz funkcji, zdaje się, space. Interpretuje tylko suche liczby oraz zmienne. Język CBOT nie jest w pełni uniwersalny. Można powiedzieć, że to emulacja języka programowania.
Mrocza - 12-01-2012, 22:31

Czyli problem leży w języku Cbot?

A można tak:
Kod:
point flag;
flag = radar(Titanium).position;
goto(flag);

Jeżeli tak też się nie da to problem tkwi nie w goto() tylko w zapisie radar(Titanium).position

Emxx52 - 12-01-2012, 23:08

Tak też nie można, ale mogę się mylić... Myślę, że to powinno być:
object cos=radar(Titanium);
point lol=cos.position
Sorry, ze bez kodu i coś mi w tym moim nie pasuje, chyba raczej
point lol;
lol.x=cos.position.x
lol.y=cos.position.y

Berserker - 13-01-2012, 00:00

Nie mozna tak, watpie, zeby w normalnym C++ sie tak dalo. To, ze funkcja zwraca wynik w jakims typie nie oznacza, ze mozna (jesli jest to typ zlozony jak object czy point) odwolywac sie do poszczegolnych pol tego wyniku od razu z funkcji. Nie jest to wina w zadnym wypadku goto(), po prostu zapis
Kod:

point c;
c = radar(Titanium).position;

Jest bledny, gdyz funkcja nie daje informacji o charakterystyce typu wyniku. Nie wie, ze typ object ma pole position i nie mozna sie do niego w taki sposob odwolac. Podobnie jest z zapisem.
Kod:

float x;
x = space(position).x;

Trzeba wynik zapisac w jakiejs zmiennej by miec dostep do takich rzeczy.

Mrocza - 13-01-2012, 14:22

Poprawiona funkcja recharge(). W końcu!
Ale nie testowałem tego zbytnio więc nie mam pewności czy teraz jest lepiej.

Kod:

// TitaniumCollector 13.01.12
// Created by MROCZA

extern void object::TitaniumCollector()
{
   
    object  item;
    object  convert;
    point   flag (0,0);
    int     i = 0;
    float   e0=0,e1=0,e2=0,e3=0;  // e-energia na petli
    float   f0=0,f1=0,f2=0,f3=0;  // f-energia na trasie do stacji
   
    errmode(0);
   
    item = radar(RedFlag);
    if ( item != null )
    {
        message("Tytan składowany przy czerwonej fladze",DisplayInfo);
        flag = item.position;
    }
   
    convert = radar(Converter);
    if ( convert == null )
    {
        message("Brak huty",DisplayError);
        return;
    }
   
    e0 = energyCell.energyLevel;  // energia poczatkowa
   
    while (true)
    {
        if(load == null or load.category != TitaniumOre)
        {
            if(load != null)
            {
                goto(space(position));
                drop();
            }
           
            while(true)
            {
                item = radar(TitaniumOre);
                if ( item != null ) break;
                if ( i % 100 == 0 ) message("Nie znaleziono więcej tytanu");
                i++ ;
                wait(0.1);
            }
           
            if(goto(item.position) == 211)
            {
                message("Ruda niedostępna",DisplayError);
                return;
            }
           
            if( grab() != 0 ) continue;
        }
       
        while(true)
        {
            if (goto(convert.position) == 000 ) break;
            if (goto(convert.position) == 212 ) continue;
            message("Huta niedostępna",DisplayError);
            return;
        }
       
        errmode(1);
       
        item = radar(Titanium,0,59,0,3);
        if ( item == null )
        {
            drop();
            move(-2);
            wait(10);
        }
        else
        {
            turn(60);
            drop();
            turn(-60);
            grab();
            turn(-60);
            drop();
            turn(120);
            grab();
            turn(-60);
            drop();
            turn(-60);
            grab();
           
            errmode(0);
           
            if ( flag.x == 0 )
            {
                goto(space(position,6,50,6));
                flag = position;
            }
            else
            {
                while(goto(flag) == 212) wait(1);
            }
           
            stock();
        }
       
        e1 = e1 + (e0 - energyCell.energyLevel); // laczne zuzycie
        e2 = e2 + 1;
        e3 = e1 / e2; // srednie zuzycie
       
        //////////////////////////////////////////////////////
       
        if (energyCell.category == PowerCell and energyCell.energyLevel < e3+f3+0.1) //dodaje zapas energii
        {
            item = radar(PowerStation);
            if(item != null)
            {
                f0 = energyCell.energyLevel;
               
                while(true)
                {
                    if (goto(item.position) == 000 ) break;
                    if (goto(item.position) == 212 ) continue;
                    message("Stacja energetyczna niedostępna",DisplayError);
                    return;
                }
               
                f1 = f1 + (f0 - energyCell.energyLevel); // laczne zuzycie
                f2 = f2 + 1;
                f3 = f1 / f2; // srednia na trasie do stacji
               
                while( energyCell.energyLevel < 1 ) wait(0.1);
            }
            else
            {
                message("Niski stan baterii",DisplayError);
                return;
            }
           
           
        }
       
        if (energyCell.category == NuclearCell and energyCell.energyLevel < e3+0.05) //dodaje zapas energii
        {
            float min = 0;
           
            if(category == Subber)
            {
                message("Niski stan baterii",DisplayError);
                return;
            }
           
            while (true)
            {
                item = radar(NuclearCell,0,360,min,1000);
               
                while(true)
                {
                    if ( item != null ) break;
                    if ( i % 100 == 0 ) message("Nie znaleziono więcej ogniw");
                    item = radar(NuclearCell);
                    i++ ;
                    wait(0.1);
                }
               
                if (item.energyLevel >= e3*5) break;
                min = distance (item.position, position) + 0.02;
            }
           
            while(true)
            {
                if (goto(item.position) == 000 ) break;
                if (goto(item.position) == 212 ) continue;
                message("Ogniwo atomowe niedostępne",DisplayError);
                return;
            }
           
            errmode(1);
           
            grab (InFront);
            goto (space(position));
            drop (Behind);
            grab (EnergyCell);
            drop (InFront);
            grab (Behind);
            drop (EnergyCell);
        }
    }
}

//////////////////////////////////////////////////////////////////////

void object::stock()
{
    object item;
    float  angle;
    int    i, j;
   
    errmode(0);
   
    item = radar(Converter);
   
    if(direction(item.position) > 0)
    {
        turn(direction(item.position)-180);
    }
    else
    {
        turn(direction(item.position)+180);
    }
   
    jet(1);
    wait(0.5);
    move(4);
    jet(-1);
    wait(0.6);
   
    errmode(1);
   
    while(true)
    {
        angle = 0;
       
        if(category == WingedGrabber) j=9;
        else                          j=7;
       
        for(i=0; i<j; i++)
        {
            if( i % 2 == 0 )
            {
                item = radar(Titanium,angle,30,0,3);
                if ( item == null )
                {
                    turn(angle);
                    while(drop() == 106) wait(0.1);
                    turn(-180 - angle);
                    if(j == 7) move(3);
                    return;
                }
               
                angle = angle / -1 + 40;
            }
           
            else
            {
                item = radar(Titanium,angle,30,0,3);
                if ( item == null )
                {
                    turn(angle);
                    while(drop() == 106) wait(0.1);
                    turn(180 - angle);
                    if(j == 7) move(3);
                    return;
                }
               
                angle = angle / -1;
            }
           
        }
       
    }
   
}


//////////////////////////////////////////////////////////////////////


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