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

Problemy [programowanie] - Program do osy.

FE4R - 09-01-2010, 22:26
Temat postu: Program do osy.
Hej hej,

Stworzyłem bardzo prosty program dla osy i mam kilka problemów, dotyczących zmiennych.
Lecz przedtem chciałem przedstawić kilka cech programu:
:arrow: Program nie używa goto();, lecz motor();, więc osa jest szybka i praktycznie się nie zatrzymuje.
:arrow: Osa jest 'celna'
:arrow: Można używać go na wielu osach jednocześnie.
:arrow: Ale czasami się psuje, osa się zatrzymuje albo ma jakieś inne głupie zajawki.
:arrow: Wysokość zrzutu materii organicznej jest 5x większa niż u zwykłej osy, więc bardzo trudno zestrzelić ją z
ziemi.


Problem jest taki, że chciałem podzielić program na 1 funkcję główną extern oraz 3 funkcje poboczne, lecz nie wiem, jak zrobić, aby wszystkie zmienne były dostępne dla wszystkich funkcji.
Na początku zastosowałem sposób, aby wszystkie zmienne były w publicznej klasie.
Jednak w ten sposób tylko jedna osa może mieć ten program, gdyż nie można zadeklarować tej samej klasy kilka razy, tylko jej egzemplarze.
W C++, z tego co przeczytałem można umieścić (zadeklarować) zmienne przed funkcją main, jako 'główne', aby można było ich używać we wszystkich funkcjach.

Jakieś propozycje? ^_^

Kod:
extern void object::WaspPrototype()
{
    point start = position;
    object ammo;
    object enemy;
   
    float alt1;
    float alt2;
    float len1;
    float len2;
   
    float dir;
    float m1;
   
    int list[], i = 0;
   
    list[i++] = Me;
    list[i++] = WheeledGrabber;
    list[i++] = TrackedGrabber;
    list[i++] = WingedGrabber;
    list[i++] = LeggedGrabber;
    list[i++] = WheeledSniffer;
    list[i++] = TrackedSniffer;
    list[i++] = WingedSniffer;
    list[i++] = LeggedSniffer;
    list[i++] = WheeledShooter;
    list[i++] = TrackedShooter;
    list[i++] = WingedShooter;
    list[i++] = LeggedShooter;
    list[i++] = WheeledOrgaShooter;
    list[i++] = TrackedOrgaShooter;
    list[i++] = WingedOrgaShooter;
    list[i++] = LeggedOrgaShooter;
    list[i++] = Subber;
    list[i++] = Thumper;
    list[i++] = Recycler;
    list[i++] = Shielder;
    list[i++] = PhazerShooter;
   
    list[i++] = Houston;
    list[i++] = ExchangePost;
    list[i++] = RadarStation;
    list[i++] = Derrick;
    list[i++] = Converter;
    list[i++] = PowerPlant;
    list[i++] = NuclearPlant;
    list[i++] = BotFactory;
    list[i++] = RepairCenter;
    list[i++] = PowerStation;
    list[i++] = DefenseTower;
    list[i++] = PowerCaptor;
    list[i++] = AutoLab;
    list[i++] = ResearchCenter;
   
    list[i++] = Titanium;
    list[i++] = PowerCell;
    list[i++] = NuclearCell;
   
    while(true)
    {
        ammo = radar(OrgaMatter);
       
        if( load == null)
        {
            if( ammo == null)
            {
                motor(1*rand(), 1);
            }
            else
            {
                alt1 = 8;
                alt2 = altitude;
               
                len1 = distance2d(start, ammo.position);
                len2 = distance2d(start, position);
                m1 = (len1-len2) / 20;
               
                dir = direction(ammo.position);
               
                jet( (alt1 - alt2) / 2);
               
                if(m1 < 0) m1 = -m1;
               
                if(distance2d(position, ammo.position) > 1.25) motor(m1-dir/90, m1+dir/90);
                else
                {
                    while(altitude > 0)
                    {
                        jet(-1);
                    }
                    jet(0);
                   
                    grab();
                }
            }
        }
        else
        {
            enemy = radar(list);
           
            if(enemy == null)
            {
                motor(1*rand(), 1);
               
                alt1 = 20;
                alt2 = altitude;
                jet( (alt1 - alt2) / 2);
            }
            else
            {
                alt1 = 100;
                alt2 = altitude;
               
                len1 = distance2d(start, enemy.position);
                len2 = distance2d(start, position);
                m1 = (len1-len2) / 2;
               
                dir = direction(enemy.position);
               
                jet( (alt1 - alt2) / 2);
               
                if(m1 < 0) m1 = -m1;
               
                if(distance2d(position, enemy.position) > 1) motor(m1-dir/90, m1+dir/90);
                else
                {
                    drop();
                }
            }
        }
    }
}

Berserker - 10-01-2010, 00:13

Mnostwo niepotrzebnego bajzlu...
Po co na poczatku zapisujesz pozycje startowa, a pozniej wszystko liczysz wzgledem tej pozycji? 3/4 zmiennych zniknie, jest zamiast odejmowac distance2d(xx, start)-dist2d(yy, start) zrobisz dist2d(yy, xx).
Ja bym zrobil cos takiego, ze potrzebne zmienne bym uzyl jako parametry funkcji pobocznych. Z drugiej strony nie mam pomyslu, jak to dokladnie rozwiazac, bo bym nie wpadl na pomysl, zeby tak se komplikowac robote :P

sajmon313 - 10-01-2010, 10:13

taka osa powinna sobie wyprodukowac orgamatter jak nie znajdzie zamiast losowo sie poruszać bez celu
wtedy nie trzebaby sie męczyć z umieszczaniem orgamatter na mapie

FE4R - 10-01-2010, 11:43

Nie wiem, czy takie rozwiązanie przyjęłoby się w zwykłych misjach.
Zakładałem, że Gniazdo Obcych będzie obecne na mapie.

Berserker - 10-01-2010, 13:25

Cytat:
taka osa powinna sobie wyprodukowac orgamatter jak nie znajdzie zamiast losowo sie poruszać bez celu
wtedy nie trzebaby sie męczyć z umieszczaniem orgamatter na mapie

1) Trzeba ustalic, gdzie ma sobie produkowac.
2) Idac tym torem myslenia, po co komukolwiek osy, skoro mozna gdzies sobie dac robala jak na elysium i spawnowac pajaki, mrowki i robale wokol astronauty i w srodku bazy :S
Skutecznosc skutecznoscia, ale niech beda jakies granice. Kazdy umie zrobic mrowke, ktora stoi 100m od bazy i nawala jak glupia. Ale sztuka jest osiagnac taka sama efektywnosc trzymajac sie fabularnych ograniczen.

adiblol - 10-01-2010, 13:31

Ja w swoich misjach zrobiłem, że mrówki srają materią organiczną, a osy z niej korzystają :)
Bartek c++ - 10-01-2010, 17:49

Ja przetestowalem ten program, i osa modlila sie nad materia organicznom.
Berserker - 10-01-2010, 19:42

@up
Fear pieknie ustawil funkcje motor() zeby leciala osa w kierunku materii organicznej, bardzo sprytnie jednak zapomnial wyzerowac silniki, zeby osa zatrzymala sie nad materia.

FE4R - 10-01-2010, 21:18

Berserker napisał/a:
@up
Fear pieknie ustawil funkcje motor() zeby leciala osa w kierunku materii organicznej, bardzo sprytnie jednak zapomnial wyzerowac silniki, zeby osa zatrzymala sie nad materia.

To jest kod ze spowalniacza. Osa spowalnia przed materią organiczną, a potem ląduje. Było to jedyne sensowne rozwiązanie według mnie, gdyż osa ma dużą bezwładność, a jej zatrzymanie w powietrzu od tak jest prawie niemożliwe.

Berserker - 10-01-2010, 21:35

Cytat:
To jest kod ze spowalniacza. Osa spowalnia przed materią organiczną, a potem ląduje. Było to jedyne sensowne rozwiązanie według mnie, gdyż osa ma dużą bezwładność, a jej zatrzymanie w powietrzu od tak jest prawie niemożliwe.

Nie lepiej w czasie zlatywania w dol dac jakis kolejny kod motor(), ktory utrzyma ose w miejscu? Osa nie zatrzyma sie od tak nad materia organiczna chocbys dal jej hamowanie 50m przed celem. Zatrzymanie sie chocby o 0.1m za daleko to kolo ktore dzieki wyrazeniu dir/90 osa zakreci. Pomijam opcje innych os, ktore siedza nad gniazdem.

Emxx52 - 05-08-2010, 20:33

Ale się uśmiałem jak czytam te posty.
adiblol napisał/a:
Ja w swoich misjach zrobiłem, że mrówki srają materią organiczną, a osy z niej korzystają
Bardzo dobry pomysł!
Bartek c++ napisał/a:
Ja przetestowalem ten program, i osa modlila sie nad materia organicznom.

Berserker napisał/a:
bardzo sprytnie jednak zapomnial wyzerowac silniki, zeby osa zatrzymala sie nad materia.

Fajny program, ale czy trafi w ruchomy cel? :?:

Korniszon - 02-10-2010, 08:34

A ja widzę tu kolejne błędy. :D
Po co ustawiasz zmienne tak, aby osa wzniosła się na określoną wysokość!

Ona sama ustawia się na odpowiednią wysokość od ziemi.

Zauwarzyłem jeszcze, że zapisałeś dwie zmienne typu object.

// Firefox sprawdza pisownię! -adiblol

Simbax - 02-10-2010, 11:33

Korniszon napisał/a:
ZauwaRZyłem

Wiem, że masz 9 lat i jeszcze (chyba) dobrze nie znasz ortografii, ale po prostu nie mogę się powstrzymać od wytknięcia tak rażącego błędu :-> Pisze się "zauwaŻyłem".

Korniszon - 03-10-2010, 08:31

@Simbax
Dzięki

@adiblol
Ja nie mam Firefoxa!!!!!

adiblol - 03-10-2010, 13:47

Cytat:
Ja nie mam Firefoxa!!!!!

Mamusia zabrania zainstalować?

Simbax - 03-10-2010, 14:44

Ano, Korniszon dlaczego korzystasz z IE? To jest zasobożerny i powolny potwór Microsoftu! Zainstaluj sobie lepiej inną przeglądarkę, np. tak jak adiblol pisze Firefox, albo Google Chrome (moim zdaniem o wiele lepszy od FF, który włącza się po paręnaście sekund i w ogóle zamula ;/). Ew. Operę, też niezła, ale jak kto woli :-P
Korniszon - 03-10-2010, 16:57

adiblol napisał/a:
Mamusia zabrania zainstalować?

Nie, ale mam drugi komputer(!) i tam jest Firefox(piszę teraz na tym drugim komputerze).

adiblol - 03-10-2010, 17:06

Nie możesz zainstalować i używać lepszej przeglądarki na wszystkich komputerach?
Emxx52 - 08-10-2010, 19:43

Simbax napisał/a:
To jest zasobożerny i powolny potwór Microsoftu! Zainstaluj sobie lepiej inną przeglądarkę, np. tak jak adiblol pisze Firefox, albo Google Chrome (moim zdaniem o wiele lepszy od FF, który włącza się po paręnaście sekund i w ogóle zamula ;/)


zgadzam się i to jeszcze jak

____________
PS: Witam z powrotem po zainstalowaniu nowego antywirusa (mój "Powrót_Dżedaja" :mrgreen: )


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