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 - 5 w jednym

Majkel - 26-12-2011, 01:57
Temat postu: 5 w jednym
Witam, stworzyłem kilka funkcji i postanowiłem zmienić trochę styl programowania, staram się wszystkie procedury pisać w jednej tak aby główny program pisać w pierwszym module
chciałbym wiedzieć czy wszystko jest ok, czy można coś poprawić, skrócić, ulepszyć :) i jakiej długości kod może się zmieścić w jednym pliku ? Program będzie nadal rozbudowywany.

Wszystko robiłem latającym robotem i było ok, jedynym problemem była natura (roslinki) pozatym wszystko ok.

Program - tu piszemy główny program
Procedury:
Zasilaj(miejsce) - robot wyszukuje pełną baterię i zasila nią budynek lub robota
IdzDo(miejsce) - robocik podąża do wybranego miejsca lub obiektu albo mobka
LadujBaterie(miejsce, punkt) robot szuka niepełnych baterii ładuje i zwozi do jednego miejsca, punkt - jeżeli true to zostawia baterie w dokładnie w miejscu w które mu wskażemy, jeżeli false to od miejsca które wskażemy znajdzie najbliższe wolne.
Zbieraj(rzecz, miejsce, punkt) - zbiera przedmioty które mu wskażemy i zanosi do danego miejsca (punkt true lub false j/w)
SprawdzBaterie - sprawdza stan akumulatorka i robi co trzeba :)

pamiętamy o używaniu flag np jako miejsca zwożenia itemów albo wskazywania drogi
poza tym wszystkie funkcje wzbogaciłem o komunikaty :)

Kod:
extern void object::Program()
{
         /////////////Tu piszemy cały program

         /////////////Koniec programu
}
void object::Zasilaj(float miejsce)
{
    object item;
    int zasieg;
    zasieg=1;
    while ( zasieg != 50 )
    {
        item = radar(PowerCell,0,360,zasieg,zasieg+1,-1);
        if (item != null)
        {
            if (item.energyLevel == 1)
            {
                goto(item.position);
                grab();
                IdzDo(miejsce);
                drop();
                message(this.category + ": -Obiekt zasilony", DisplayInfo);
                zasieg=49;
            }
        }
        zasieg=zasieg+1;
    }
}
void object::IdzDo(float miejsce)
{
    object item;
    item = radar(miejsce);
    goto(item.position);
    message(this.category + ": -Cel osiagniety: " + item.category, DisplayInfo);
}
void object::LadujBaterje(float miejsce, bool punkt)
{
    object item;
    int zasieg;
    zasieg=1;
    while ( zasieg != 50 )
    {
        IdzDo(miejsce);
        item = radar(PowerCell,0,360,zasieg,zasieg+1,-1);
        if (item != null)
        {
            if (item.energyLevel < 0.9)
            {
                goto(item.position);
                grab();
                IdzDo(PowerStation);
                while (item.energyLevel<1)
                {}
                IdzDo(miejsce);
                if (punkt == false)
                {
                    goto(space(position));
                }
                drop();
                message(this.category + ": -" + item.category + " na miejscu.", DisplayInfo);
            }
        }
        zasieg=zasieg+1;
    }
}
void object::Zbieraj(float rzecz, float miejsce, bool punkt)
{
    object item;
    IdzDo(miejsce);
    item = radar(rzecz,0,360,20,50099,-1);
    goto(item.position);
    grab();
    message(this.category + ": -" + item.category +" podniesiony.", DisplayInfo);
    IdzDo(miejsce);
    if (punkt == false)
    {
        goto(space(position));
    }
    drop();
    message(this.category + ": -" + item.category + " na miejscu.", DisplayInfo);
}
void object::SprawdzBaterie()
{
    if (energyCell.energyLevel < 1)
    {
        message (this.category + ": -Bateria rozladowana.");
        IdzDo(PowerStation);
        while (energyCell.energyLevel != 1)
        {}
    }
    message(this.category + ": -Bateria pelna");
}

Mrocza - 26-12-2011, 13:10

Zamiast tego:
Kod:
while (item.energyLevel<1)
{}
Pisz tak:
Kod:
while (item.energyLevel<1) wait(0.1);


Nie spamuj tak tymi wiadomościami. Dobry program to taki o którym możesz zapomnieć po jego uruchomieniu.

Używaj tego:
Kod:
errmode(0);
Takie programy są odporne na błędy więc nie trzeba się w ogóle nimi przejmować.

Nie lubię programów uniwersalnych, wolę wyspecjalizowane.

Berserker - 26-12-2011, 14:22

Kod:
  zasieg=1;

Formatuj:
Kod:

zasieg = 1;

<czyta dalej program>
Nie bede wszystkiego wyszczegolnial, przede wszystkim formatuj zawsze tak samo, a nie co funkcja to inaczej.

Przy nawiasach spacji sie nie daje, nie robisz
Kod:

move ( 5 ) ;
goto( position );
while (true)

tylko
Kod:

move(5);
goto(position);
while(true)

W ten sposob nie odciagasz uwagi od rzeczy wazniejszej, ktora sa operacje matematyczne i logiczne. Zawsze oddzielamy je spacja od zmiennych (oprocz / i %, ktore ja lubie pisac razem).

Czyli przyklad ktory MROCZA dal:
Kod:
while (item.energyLevel<1) wait(0.1);

Ja bym zapisal:
Kod:
while(item.energyLevel < 1) wait(0.1);

I teraz jakbym przypadkiem pomylil sie i postawil znak > zamiast <, to nie szukalbym kupki pixeli w zbitym tekscie, tylko ladnie mam wydzielone spacjami.

Nazwy zmiennych. Maja byc krotkie i sensownie nazwane. 80% moich zmiennych lamie ten drugi punkt, ale to juz kwestia jak orientujesz sie w swoim programie. Co do dlugosci, to jak widzisz 10znakowego potwora pojawiajacego sie w co drugiej funkcji, to potrafi troche zniesmaczyc, ale najgorsza rzecza sa wlasnie operacje na takich zmiennych. Inaczej wyglada:
Kod:

dist = len * len - sin(dir) * 3/(x + len);

A inaczej.
Kod:

zasieg = odleglosc * odleglosc - sin(azymut) * 3/(odleglosc + info);

A to jest proste dzialanie.

Wiec lepiej nazwac zmienna z, a przy deklaracji dac komentarz "to jest zasieg", niz przez caly program pisac "zasieg".

@up
Z errmode(0) trzeba uwazac, program potrafi cale funkcje przeskakiwac i mozna dziwne rezultaty uzyskac.

Mrocza - 26-12-2011, 17:26

Berserker napisał/a:
Przy nawiasach spacji sie nie daje, nie robisz

Kod:
move ( 5 ) ;
goto( position );
while (true)


tylko

Kod:
move(5);
goto(position);
while(true)

ja piszę to tak:

Kod:
move (5);
goto (position);
while(true)


Tamten przykład dałem z jego programu sam też daje spacjeprzy znakach takich jak: < > - + =.

Jeżeli chodzi o zmienne to używam tylko słów angielskich takich jak "item" czy "flag" albo skrótów typu "err"

[ Dodano: 26-12-2011, 17:30 ]
Co do errmode(0); to nieumiejętnie wykożystane może narobic sporego bigosu.
Lepiej żeby program został przerwany po błędzie niż później robił jakieś bzdury.
Dlatego jak się tego używa to trzeba się przygotowac na każdą ewentualnośc.

Majkel - 26-12-2011, 20:22

super, dzięki za uwagi, zaraz zrobię z tym porządek, jednak program w jednym module - tak wolę, bo chyba nie da się zrobić odwołania do innych modułów (plików) - niewiem za bardzo jak to nazwać

message postanowiłem pozostawić gdyż czasami zdarza się że program się wykrzacza a wtedy wiem na jakim etapie :)

mam też problem z radarowaniem, robot radaruje z miejsca w którym się znajduje, a czy da sie taj zrobić żeby radarował z innego miejsca ? bez jechania do niego ?

Berserker - 26-12-2011, 21:04

Cytat:
mam też problem z radarowaniem, robot radaruje z miejsca w którym się znajduje, a czy da sie taj zrobić żeby radarował z innego miejsca ? bez jechania do niego ?


Funkcja search().

Cytat:
message postanowiłem pozostawić gdyż czasami zdarza się że program się wykrzacza a wtedy wiem na jakim etapie


Nie lepiej pisac odrazu dobrze? :)

Cytat:
super, dzięki za uwagi, zaraz zrobię z tym porządek, jednak program w jednym module - tak wolę, bo chyba nie da się zrobić odwołania do innych modułów (plików) - niewiem za bardzo jak to nazwać

Wydaje mi sie, ze chodzi ci o funkcje, wtedy to kazdy tak robi, ze jest glowna funkcja ktora odpowiada za program i funkcje pomocnicze sluzace porzadkowaniu programu.

MROCZA napisał/a:

wykożystane

Warna bys chcial?

Mrocza - 26-12-2011, 21:14

Przepraszam. To dlatego, że teraz piszę z laptopa kuzynki z Internet Eksplorera a to to nie ma słownika. Z resztą yrażnie widac jaki mam system i przeglądarkę. Zazwyczaj używam opery.
Simbax - 27-12-2011, 10:31

Berserker napisał/a:
Warna bys chcial?


Oj tam, każdemu może się zdarzyć jeden błąd. To jeszcze nie powód do warna, gorzej, gdy nie widać nawet chęci poprawy.


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