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

Simbax - 30-07-2010, 19:52
Temat postu: BotCreator
Co robi program?

Zastępuje gracza w procesie tworzenia robota. Potrafi przetopić rudę, dać robotowi baterię i cierpliwie czekać na stworzenie robota ;-) Nie jest on przystosowany do transporterów latających, ale ten typ w ogóle się moim zdaniem do tej roboty nie nadaje :->

+ Sam wytwarza tytan jeśli go nie znalazł
+ Sam wytwarza baterie jeśli jej nie znalazł
+ W kulturalny sposób informuje o niepowodzeniu :lol:
+ Możesz w tym czasie robić coś innego np. dajmy na to, pozwiedzać okolicę

- Może mieć problem z dojściem do fabryki (wyświetli błąd, że miejsce docelowe niedostępne), nie wiem od czego to zależy (to pewnie wina instrukcji goto albo radar)
- Nie zrobi za nas wszystkiego... poprosi nas o rozpoczęcie produkcji robota, ale to kwestia dwóch kliknięć...
- Nowym robotem musimy sami wyjechać

EDIT: Robot już potrafi wytwarzać baterie, ale testowałem tylko na ogniwach atomowych. Znalazłem też parę błędów, więc poprawiłem nieco program.

Kod źródłowy:
Kod:
// funckje ----------------------------------------------------------------
int object::Przetop()
{
        object item, item2;
       
        // sprawdzanie czy mozliwe jest wykonanie funkcji
        // -----------------------------------------------
        item = radar(TitaniumOre); // znajdz rude
        item2 = radar(Converter); // znajdz hute
        if (item == null || item2 == null) // jesli nie ma rudy LUB huty wyswietl blad i przerwij program
            {
                message("Nie mozna wytworzyc kostki tytanu.", DisplayError);
                return 1;
            }
        // ------------------------------------------------
        // jesli warunki zostaly spelnione wykonaj
        message("Wytwarzam kostkę tytanu.", DisplayInfo);
       
        item = radar(TitaniumOre);
        goto(item.position);
        grab(); // znajdz i podnies rude tytanu
       
        item = radar(Converter);
        goto(item.position);
        drop();
        move(-2.5);
        wait(15);
        move(2.5);
        grab(); // wytworz :P
}

int object::Power()
{
    object item, item2;
       
    item = radar(NuclearCell);
    if (item == null) // Czy istnieje atomowe ogniwo?
    {
        // Sprawdzanie czy mozliwe jest stworzenie ogniwa atomowego
        item = radar(UraniumOre);
        item2 = radar(NuclearPlant);
        if (item == null || item2 == null)
        {
            message("Nie mozna wytworzyc ogniwa atomowego.", DisplayError);
        }
        // ----------------------------------
        else // jesli tak
        {
            item = radar(UraniumOre);
            goto(item.position);
            grab();
           
            item = radar(NuclearPlant);
            goto(item.position);
            drop();
            move(-3);
            wait(32);
            move(3);
            grab(); //wytworz
            return 0;
        }
    }
    else // jesli istnieje ogniwo
    {
        goto(item.position);
        grab();
        return 0;
    }
   
   
    item = radar(PowerCell);
    if (item == null) // czy istnieje zwykle ogniwo?
    {
        // sprawdzanie czy mozliwe jest stworzenie zwyklego ogniwa
        item = radar(PowerPlant);
        item2 = radar(Titanium);
        if (item == null)
        {
            message("Nie mozna wytworzyc ogniwa elektrycznego.", DisplayError);
            return 1;
        }
       
        if (item2 == null)
        {
            if (Przetop() == 1)
            {
                message("Nie mozna wytworzyc ogniwa elektrycznego.", DisplayError);
                return 1;
            }
        }
        // ---------------------------------------
        else
        {
            goto(item2.position);
            grab();
        }
       
        goto(item.position);
        drop();
        move(-3);
        wait(14);
        move(3);
        grab();
    }
    else
    {
        goto(item.position);
        grab();
    }
}
// ----------------------------------------------------



extern void object::BotCreator()
{
        object item; // zmienna pomocnicza
       
        int robot[21]; // <-- robot ktory ma zostac stworzony
       
        robot[0] = WheeledGrabber;         //Transporter na kołach
        robot[1] = TrackedGrabber;         //Transporter na gąsienicach
        robot[2] = WingedGrabber;         //Transporter latający
        robot[3] = LeggedGrabber;          //Transporter na nogach
        robot[4] = WheeledSniffer;         //Szperacz na kołach
        robot[5] = TrackedSniffer;         //Szperacz na gąsienicach
        robot[6] = WingedSniffer;          //Szperacz latający
        robot[7] = LeggedSniffer;          //Szperacz na nogach
        robot[8] = WheeledShooter;         //Działo na kołach
        robot[9] = TrackedShooter;         //Działo na gąsienicach
        robot[10] = WingedShooter;         //Działo latające
        robot[11] = LeggedShooter;        //Działo na nogach
        robot[12] = WheeledOrgaShooter;     //Działo organiczne na kołach
        robot[13] = TrackedOrgaShooter;     //Działo organiczne na gąsienicach
        robot[14] = WingedOrgaShooter;      //Latające działo organiczne
        robot[15] = LeggedOrgaShooter;      //Działo organiczne na nogach
        robot[16] = Subber;                 //Robot nurek
        robot[17] = Recycler;               //Robot recykler
        robot[18] = Shielder;               //Robot osłaniacz
        robot[19] = Thumper;                //Robot uderzacz
        robot[20] = PhazerShooter;          //Działo fazowe
       
       
       
       
        item = radar(Titanium); // znajdz tytan
        if (item == null) // jesli nie znaleziono, zrob go
        {
                message("Nie znaleziono tytanu", DisplayWarning);
                if (Przetop() == 1) return;
        }
        // znaleziono
        else
            {
                 item = radar(Titanium);
                 goto(item.position);
                 grab();
                 // podnies tytan
            }
       
        item = radar(BotFactory);
        goto(item.position);
        drop();
        move(-3); // znajdz fabryke i zostaw tytan, nastepnie cofnij sie
        message("Prosze rozpoczac produkcje robota", DisplayWarning); // prosba o rozpoczecie produkcji
        if (Power() == 1) return; // tym czasem robot "idzie" po zrodlo energii
        goto(item.position);
        move(-3);
        message("Przynioslem ogniwo.", DisplayWarning); // informacja
        while (true)
        {
                item = radar(robot,0,90,0,8); // szukaj robota (kategoria w zmiennej robot)
               
                if (item == null) // jesli nie ma, powiadom, ze czekasz ;) i czekaj chwile, jesli nadal nie ma, to znowu powiadom itd.
                {
                        message("Czekam na robota.", DisplayWarning);
                        wait(5);
                    }
                else // jesli jest wloz mu baterie i pozwol wyjechac
                {
                        move(3);
                        drop();
                        move(-10);
                        break;
               }
    }
    message("Robot zostal stworzony!", DisplayInfo); // powiadomienie o powodzeniu :)
}


A, i proszę się nie czepiać, jestem kompletnym nowicjuszem ;P Ciekawe, komu się to przyda... :roll:

Berserker - 31-07-2010, 03:45

Idz i podnies zrodlo ftw.

Po cholere robot ma szukac wolne miejsce i tam polozyc tytan, skoro zaraz go podniesie? Strata czasu.

Simbax - 31-07-2010, 11:25

Chodzi o źródło energii... baterię, jak wolisz :roll:

Fakt, już poprawiam...

Emxx52 - 05-08-2010, 20:06

Fajny program.
Możesz dodać jeszcze komendę
Kod:
produce(space(), orientation, TitaniumOre, "");
jeżeli nie będzie żadnej rudy tytanu.
(trochę możesz oszukać) :lol:

Korniszon - 09-10-2010, 11:54

Emxx52 napisał/a:
produce(space(),orientation,TitaniumOre,"");

Emxx52, ten program polega na nie oszukiwaniu, a nie przeciwnie.

Emxx52 - 09-10-2010, 14:28

Korniszon napisał/a:
Emxx52, ten program polega nie oszukiwaniu, a nie przeciwnie.


Dobra, ale ułóż to zdanie bardziej po naszemu ;-)

Korniszon - 10-10-2010, 08:43

@up: Poprawiłem

Simbax napisał/a:
int object::Power()
{
object item, item2;

item = radar(NuclearCell);
if (item == null) // Czy istnieje atomowe ogniwo?
{
// Sprawdzanie czy mozliwe jest stworzenie ogniwa atomowego
item = radar(UraniumOre);
item2 = radar(NuclearPlant);
if (item == null || item2 == null)
{
message("Nie mozna wytworzyc ogniwa atomowego.", DisplayError);
return 1;
}
// ----------------------------------
else // jesli tak
{
item = radar(UraniumOre);
goto(item.position);
grab();

item = radar(NuclearPlant);
goto(item.position);
drop();
move(-3);
wait(32);
move(3);
grab(); //wytworz
return 0;
}
}
else // jesli istnieje ogniwo
{
goto(item.position);
grab();
return 0;
}


item = radar(PowerCell);
if (item == null) // czy istnieje zwykle ogniwo?
{
// sprawdzanie czy mozliwe jest stworzenie zwyklego ogniwa
item = radar(PowerPlant);
item2 = radar(Titanium);
if (item == null)
{
message("Nie mozna wytworzyc ogniwa elektrycznego.", DisplayError);
return 1;
}

if (item2 == null)
{
if (Przetop() == 1)
{
message("Nie mozna wytworzyc ogniwa elektrycznego.", DisplayError);
return 1;
}
}
// ---------------------------------------
else
{
goto(item2.position);
grab();
}

goto(item.position);
drop();
move(-3);
wait(14);
move(3);
grab();
}
else
{
goto(item.position);
grab();
}
}

Simbaxie, ta funkcja wytworzy tylko atomowe ogniwo, jeśli będzie można je wytworzyć, a jeśli je znajdzie to tylko je weźmie i zakończy funkcję. Popraw ją.

Simbax - 11-10-2010, 17:01

Analizując mój program nie widzę żadnego błędu, wystarczy spojrzeć do głównej funkcji, po if (Power() == 1) return; (czyli po wykonaniu całej tej funkcji bez błędu) są linijki, które każą robotowi iść do fabryki, więc funkcja zdaje się jest napisana dobrze. Na razie nie testuje, bo nie zainstalowałem jeszcze Colobot-a, później sprawdzę dokładnie ten program.

Może mi ktoś powiedzieć czy działa ta część, w której wytwarza zwykłą baterię? Jeśli dobrze pamiętam, to tego akurat na pewno nie sprawdzałem.

Korniszon - 14-10-2010, 11:19

Poprawa:
Kod:
// funckje ----------------------------------------------------------------
int object::Przetop()
{
        object item, item2;
       
        // sprawdzanie czy mozliwe jest wykonanie funkcji
        // -----------------------------------------------
        item = radar(TitaniumOre); // znajdz rude
        item2 = radar(Converter); // znajdz hute
        if (item == null || item2 == null) // jesli nie ma rudy LUB huty wyswietl blad i przerwij program
            {
                message("Nie mozna wytworzyc kostki tytanu.", DisplayError);
                return 1;
            }
        // ------------------------------------------------
        // jesli warunki zostaly spelnione wykonaj
        message("Wytwarzam kostkę tytanu.", DisplayInfo);
       
        item = radar(TitaniumOre);
        goto(item.position);
        grab(); // znajdz i podnies rude tytanu
       
        item = radar(Converter);
        goto(item.position);
        drop();
        move(-2.5);
        wait(15);
        move(2.5);
        grab(); // wytworz :P
}

int object::Power()
{
    object item, item2;
       
    item = radar(NuclearCell);
    if (item == null) // Czy istnieje atomowe ogniwo?
    {
        // Sprawdzanie czy mozliwe jest stworzenie ogniwa atomowego
        item = radar(UraniumOre);
        item2 = radar(NuclearPlant);
        if (item == null || item2 == null)
        {
            message("Nie mozna wytworzyc ogniwa atomowego.", DisplayError);
            return 1;
        }
        // ----------------------------------
        else // jesli tak
        {
            item = radar(UraniumOre);
            goto(item.position);
            grab();
           
            item = radar(NuclearPlant);
            goto(item.position);
            drop();
            move(-3);
            wait(32);
            move(3);
            grab(); //wytworz
            return 0;
        }
    }
    else // jesli istnieje ogniwo
    {
        goto(item.position);
        grab();
        return 0;
    }
}
int object::Power2()
{
    object item, item2;
    item = radar(PowerCell);
    if (item == null) // czy istnieje zwykle ogniwo?
    {
        // sprawdzanie czy mozliwe jest stworzenie zwyklego ogniwa
        item = radar(PowerPlant);
        item2 = radar(Titanium);
        if (item == null)
        {
            message("Nie mozna wytworzyc ogniwa elektrycznego.", DisplayError);
            return 1;
        }
       
        if (item2 == null)
        {
            if (Przetop() == 1)
            {
                message("Nie mozna wytworzyc ogniwa elektrycznego.", DisplayError);
                return 1;
            }
        }
        // ---------------------------------------
        else
        {
            goto(item2.position);
            grab();
        }
       
        goto(item.position);
        drop();
        move(-3);
        wait(14);
        move(3);
        grab();
    }
    else
    {
        goto(item.position);
        grab();
    }
}
// ----------------------------------------------------



extern void object::BotCreator()
{
        object item; // zmienna pomocnicza
       
        int robot[21]; // <-- robot ktory ma zostac stworzony
       
        robot[0] = WheeledGrabber;         //Transporter na kołach
        robot[1] = TrackedGrabber;         //Transporter na gąsienicach
        robot[2] = WingedGrabber;         //Transporter latający
        robot[3] = LeggedGrabber;          //Transporter na nogach
        robot[4] = WheeledSniffer;         //Szperacz na kołach
        robot[5] = TrackedSniffer;         //Szperacz na gąsienicach
        robot[6] = WingedSniffer;          //Szperacz latający
        robot[7] = LeggedSniffer;          //Szperacz na nogach
        robot[8] = WheeledShooter;         //Działo na kołach
        robot[9] = TrackedShooter;         //Działo na gąsienicach
        robot[10] = WingedShooter;         //Działo latające
        robot[11] = LeggedShooter;        //Działo na nogach
        robot[12] = WheeledOrgaShooter;     //Działo organiczne na kołach
        robot[13] = TrackedOrgaShooter;     //Działo organiczne na gąsienicach
        robot[14] = WingedOrgaShooter;      //Latające działo organiczne
        robot[15] = LeggedOrgaShooter;      //Działo organiczne na nogach
        robot[16] = Subber;                 //Robot nurek
        robot[17] = Recycler;               //Robot recykler
        robot[18] = Shielder;               //Robot osłaniacz
        robot[19] = Thumper;                //Robot uderzacz
        robot[20] = PhazerShooter;          //Działo fazowe
       
       
       
       
        item = radar(Titanium); // znajdz tytan
        if (item == null) // jesli nie znaleziono, zrob go
        {
                message("Nie znaleziono tytanu", DisplayWarning);
                if (Przetop() == 1) return;
        }
        // znaleziono
        else
            {
                 item = radar(Titanium);
                 goto(item.position);
                 grab();
                 // podnies tytan
            }
       
        item = radar(BotFactory);
        goto(item.position);
        drop();
        move(-3); // znajdz fabryke i zostaw tytan, nastepnie cofnij sie
        message("Prosze rozpoczac produkcje robota", DisplayWarning); // prosba o rozpoczecie produkcji
        if (Power() == 1) if(Power2()==1) return; // tym czasem robot "idzie" po zrodlo energii
        goto(item.position);
        move(-3);
        message("Przynioslem ogniwo.", DisplayWarning); // informacja
        while (true)
        {
                item = radar(robot,0,90,0,8); // szukaj robota (kategoria w zmiennej robot)
               
                if (item == null) // jesli nie ma, powiadom, ze czekasz ;) i czekaj chwile, jesli nadal nie ma, to znowu powiadom itd.
                {
                        message("Czekam na robota.", DisplayWarning);
                        wait(5);
                    }
                else // jesli jest wloz mu baterie i pozwol wyjechac
                {
                        move(3);
                        drop();
                        move(-10);
                        break;
               }
    }
    message("Robot zostal stworzony!", DisplayInfo); // powiadomienie o powodzeniu :)
}

Simbax - 04-11-2010, 15:25

Aha... Już wiem o co ci chodzi, źle cię poprzednio zrozumiałem xD Twoja poprawa jest dobra, ale po co tworzyć kolejną funkcję, wystarczyło jedynie usunąć linijkę:
Kod:
int object::Power()
{
    object item, item2;
       
    item = radar(NuclearCell);
    if (item == null) // Czy istnieje atomowe ogniwo?
    {
        // Sprawdzanie czy mozliwe jest stworzenie ogniwa atomowego
        item = radar(UraniumOre);
        item2 = radar(NuclearPlant);
        if (item == null || item2 == null)
        {
            message("Nie mozna wytworzyc ogniwa atomowego.", DisplayError);

return 1;
Kod:

        }
        // ----------------------------------
        else // jesli tak
        {
            item = radar(UraniumOre);
            goto(item.position);
            grab();
           
            item = radar(NuclearPlant);
            goto(item.position);
            drop();
            move(-3);
            wait(32);
            move(3);
            grab(); //wytworz
            return 0;
        }
    }
    else // jesli istnieje ogniwo
    {
        goto(item.position);
        grab();
        return 0;
    }
   
   
    item = radar(PowerCell);
    if (item == null) // czy istnieje zwykle ogniwo?
    {
        // sprawdzanie czy mozliwe jest stworzenie zwyklego ogniwa
        item = radar(PowerPlant);
        item2 = radar(Titanium);
        if (item == null)
        {
            message("Nie mozna wytworzyc ogniwa elektrycznego.", DisplayError);
            return 1;
        }
       
        if (item2 == null)
        {
            if (Przetop() == 1)
            {
                message("Nie mozna wytworzyc ogniwa elektrycznego.", DisplayError);
                return 1;
            }
        }
        // ---------------------------------------
        else
        {
            goto(item2.position);
            grab();
        }
       
        goto(item.position);
        drop();
        move(-3);
        wait(14);
        move(3);
        grab();
    }
    else
    {
        goto(item.position);
        grab();
    }
}


Wtedy program automatycznie przejdzie do fragmentu z PowerCell, dlatego że cały program do tworzenia baterii jest w instrukcji if i else :) Pozdrawiam!


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