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

Programy - CollectTitaniumOre

Korniszon - 09-10-2010, 11:42
Temat postu: CollectTitaniumOre
A oto program:
Kod:
extern void object::CollectTitaniumOre()
{
    while(true)
    {
        if(energyCell.energyLevel<0.4) lado();
        ruda();
        huta();
        tytan();
        spa();
    }
}
void object::ruda()
{
    object item;
    while((item=radar(TitaniumOre))==null)
    {
        Message("Nie znaleziono rudy. Czekam.");
        wait(1);
    }
    mygoto(item.position);
    grab();
}
void object::huta()
{
    object conver;
    while((conver=radar(Converter))==null)
    {
        Message("Nie znaleziono huty. Czekam.");
        wait(1);
    }
    mygoto(conver.position);
    drop();
    move(-2.5);
}
void object::tytan()
{
    object titan;
    Message("Czekam na wytworzenie tytanu");
    do
    {
        titan=radar(Titanium,0,45,0,5);
    }
    while(titan==null);
    mygoto(titan.position);
    grab();
}
void object::spa()
{
    Message("Idę do wolnej pozycji");
    mygoto(space(position));
    errmode(0);
    drop();
    while(load!=null)
    {
        Message("Upuszczenie tytanu nie powiodło się");
        mygoto(space(position));
        drop();
    }
    Message("Upuszczenie tytanu powiodło się.");
    errmode(1);
}
void object::lado()
{
    Message("Niski poziom energii. Szukam zasoby energytyczne.");
    while(!A() and !B())
    {
        Message("Uwaga. Nie znaleziono zasobów energytycznych.");
        wait(1);
    }
    Message("Ładowanie zakończone");
}
bool object::A()
{
    object station;
    int sta[];
    sta[0]=PowerStation;
    sta[1]=PowerCaptor;
    station=radar(sta);
    if(station!=null)
    {
        mygoto(station.position);
        while(energyCell.energyLevel<1);
        return true;
    }
    return false;
}
bool object::B()
{
    object cell=radar(PowerCell);
    if(cell!=null)
    {
        if(cell.energyLevel>0.75)
        {
            mygoto(cell.position);
            grab();
            drop(Behind);
            grab(EnergyCell);
            drop();
            grab(Behind);
            drop(EnergyCell);
            return true;
        }
    }
    return false;
}
void object::mygoto(point pos)
{
    errmode(0);
    while(goto(pos)!=0);
    errmode(1);
}
void object::Message(string msg)
{
    message("(RT) "+category+": "+msg);
}

Program działa kojelno etapami:

    extern void object::TitaniumC()
    {

      while(true)
      {

        :arrow: Sprawdza stan baterii
        :arrow: Szuka rudę i bierze ją
        :arrow: Szuka huty, jedzie tam, i zostawia rudę
        :arrow: Czeka na tytan i go bierze
        :arrow: Zostawia tytan w wolnym miejscu

      }

    }


UWAGA: Program był testowany i działa.

adiblol - 09-10-2010, 11:52

Proszę o wklejenie z wcięciami bo tak nic z tego nie rozumiem.
1. zapisz program z poziomu Colobota
2. otwórz odpowiedni plik: ścieżka\do\colobota\program\nazwa_pod_jaką_zapisałeś.txt
3. skopiuj i wklej na forum w tagu [ code ]

Korniszon - 09-10-2010, 11:58

Dzięki

Albo:
scieżka_do_colobota/savegame/nazwa_użytkownika/Program/nazwa_programu.txt

Berserker - 09-10-2010, 12:07

Kod:
void object::mygoto(point pos)
{
    errmode(0);
    while(goto(pos)!=0);
    goto(pos);
    errmode(1);
}

Bez sensu, wykonujesz goto() 2 razy.

Kod:
    while(goto(space(position))!=0)

Wypadaloby wlaczyc moze errmode(0)...

Bardzo mi sie podoba twoj uroczy angielski, zwlaszcza te wstawki "No find...", nie ma to jak poszanowanie dla gramatyki :) Poza tym, po co te wszystkie message()? To ja musze wiedziec co moj robot wlasnie robi? :o

Simbax - 09-10-2010, 13:34

@Korniszon Po co się z ang. bawisz, mieszkamy w końcu w Polsce i swój język mamy. Sam używam ang. nazw do zmiennych itd. Ale "mesycze" wypadałoby już po polsku...
Korniszon - 10-10-2010, 09:30

@Simbax Poprawiłem
Simbax napisał/a:
mesycze

Pisze się message'e

@Berserker Poprawiłem. A z tymi message'ami: chciałem sobie żeby mi wyświetlało. Dzięki temu wiem co teraz robot robi. :D

Apus - 10-10-2010, 14:19

Jakby uruchomić ten program na kilku robotach to by wiadomości od nich tak szybko były zastępowane nowymi że zanim by którąś przeczytał to by znikła z ekranu.
Berserker - 10-10-2010, 15:20

Dla mnie jak robot ma wyeliminowac osy to cecha dobrego programu jest to, ze uruchamiam ten program i o nim zapominam, a chwile pozniej tych os nie ma. Jakby mi spamowal wiadomosciami to bym go w koncu wylaczyl i sam wybil te osy:)
Simbax - 11-10-2010, 16:52

Korniszon napisał/a:
Pisze się message'e


OK, dzięki za informację. Właśnie się tak zastanawiałem jak to napisać ;-)

Korniszon - 23-10-2010, 08:59

@Apus & Berserker:
Jak chcecie, mogę wykasować te message'e "spamowe"(jak to Berserker napisał) ;)

Berserker - 23-10-2010, 12:48

Nie tyle, ze chcemy zebys dla nas je wykasowal tylko, zebys nauczyl sie radzic sobie bez nich :)
Zreszta nie wiem jak ty to wytrzymujesz:
Kod:
 while(goto(space(position))!=0)
    {
        mesage("Wolna pozycja jest zablokowana.");
        wait(1);
    }

Co sekunde dowiadujesz sie, ze nie ma robot gdzie pojsc, ciebie w ogole by to obchodzilo? :P

adiblol - 23-10-2010, 13:59

Najlepiej napisać funcję debug(string msg), która odwoływałaby się do message(...) dodając prefiks - nazwę robota, ale gdybyśmy nie chcieli oglądać komunikatów to można by zawartość funkcji debug(...) wykomentować.
Korniszon - 24-10-2010, 11:35

@Berserker:
Dobra, dobra, ja umiem posługiwać się bez nich, ale ten program tak ma i już. :D :) :>


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