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

colobotwymiiata - 20-02-2009, 22:43
Temat postu: Naprawa
Program służy do naprawy botów i budynków w promieniu x metrów.Niezbyt doskonały, szczególnie funkcja "idz()" domaga się poprawienia. Uwaga, im większy promień wykrywania botów, tym wolniejsza reakcja!
Kod:
Kod:
extern void object::Sanitariusz()
{
    object q;
    point start;
    int qcat,to[],t;
    t=0;
    to[t++]=WheeledGrabber;
    to[t++]=TrackedGrabber;
    to[t++]=WingedGrabber;
    to[t++]=LeggedGrabber;
   
    to[t++]=WheeledShooter;
    to[t++]=TrackedShooter;
    to[t++]=WingedShooter;
    to[t++]=LeggedShooter;
   
    to[t++]=WheeledOrgaShooter;
    to[t++]=TrackedOrgaShooter;
    to[t++]=WingedOrgaShooter;
    to[t++]=LeggedOrgaShooter;
   
    to[t++]=WheeledSniffer;
    to[t++]=TrackedSniffer;
    to[t++]=WingedSniffer;
    to[t++]=LeggedSniffer;
   
    to[t++]=Subber;
    to[t++]=Shielder;
    to[t++]=PhazerShooter;
    to[t++]=Thumper;
    to[t++]=Recycler;
   
    to[t++]=Houston;
    to[t++]=BotFactory;
    to[t++]=ResearchCenter;
    to[t++]=RadarStation;
    to[t++]=ExchangePost;
    to[t++]=RepairCenter;
    to[t++]=DefenseTower;
    to[t++]=AutoLab;
    to[t++]=PowerStation;
    to[t++]=PowerPlant;
    to[t++]=NuclearPlant;
    to[t++]=Converter;
    to[t++]=Derrick;
    to[t++]=PowerCaptor;
    to[t++]=Vault;
   
    start=position;
    errmode(0);
    while(true)
    {
        if(shieldLevel<1)
        {
            while(shieldLevel<1)
            {
                shield(1,10);
            }
            shield(0,0);
        }
        for(float od=0;od<1000;od=od+1)
        {
            q=radar(to,0,360,od-1,od);
            if(q!=null)
            if(q.shieldLevel!=1)
            {
                qcat=q.category;
                idz(q,qcat);
                shield(1,10);
                while(q.shieldLevel<1)wait(0.1);
                shield(0,0);
                goto(start);
            }
        }
    }
}
object object::idz(object q, int qcat)
{
    while(radar(qcat,0,360,0,9)==null)
    {
        turn(direction(q.position));
        motor(1,1);
        if(radar(0,0,360,0,5)!=null)
        {
            turn(-90);
            move(3);
            turn(90);
        }
    }
    motor(0,0);
}

Abadon - 21-02-2009, 09:39

Ciekawy programik, to coś takiego jakby osłaniacz (pewnie działa na podobnych zasadach ten bot). Jak na to wpadłeś??
colobotwymiiata - 21-02-2009, 10:37

a... był gdzieś temat o znajdywaniu tylko pełnych ogniw, i pomyślałem, że przerobie to na szukanie zniszczonych botów
Sioner - 26-03-2009, 15:48
Temat postu: od poczontku
Ja od początku gdy osłaniacza miałem już to robiłem żeby się naprawić
colobotwymiiata - 26-03-2009, 16:13

Ten program robiłeś? Czy co?
Sioner - 26-03-2009, 16:54
Temat postu: only
tylko osłone uruchamialem
Berserker - 26-03-2009, 16:58

Nie lubie tego...
Kod:

...
        for(float od=0;od<1000;od=od+1)
        {
            q=radar(to,0,360,od-1,od);
            if(q!=null)
 ...

Sprawdzanie pierscieni o roznicy promieni 1m jest troche pamieciochlonne...
1) Ustalic pozycje najdalszego robota, i odleglosc od niego ustawic jako granice.
2) Nie sprawdzac po kolei tych pierscieni tylko przeskakiwac od robota do robota. Robotow jest po dluzszym czasie grania 30, a pierscieni? 300.

colobotwymiiata - 26-03-2009, 19:40

Z tym od najdalszego do najbliższego to się sam zorientowałem, tyle że przed napisaniem programu :-P .
A wogóle to napisałem ten program nie z myślą na naprawianiu wszystkich botów, tylko botów w obrębie bazy(pod "od<1000" dajemy promień bazy, 1000 jest przykładową liczbą).

PS.: Powiedz, jak przeskakiwać od robota do robota, to chętnie wstawie to do programu.

Berserker - 26-03-2009, 22:22

Kod:

...
dist = 1;
target = radar(list, 0, 360, 0, 1000, -1, FilterOnlyLanding);
if(target == null) break;
max = distance(target.position, position);
while(dist < max+1)
{
target = radar(list, 0, 360, dist-1, max, 1, FilterOnlyLanding);
if(target.energyCell.energyLevel > 0.2)
{
dist = distance(position, target.position) + 1.5;
}
...

Skopiowane na surowo z programu. Raczej sie zorientujesz co i jak.
Program raczej teoretyczny. bo narazie robot siedzi na "wait(0.1);" ;]

A mapa chyba ma max wspolrzedne od 400 do -400 :)

adiblol - 27-03-2009, 09:55

lepiej skorzystać z retobject.
Berserker - 27-03-2009, 14:13

Retobject to funkcja, o ktorej sie praktycznie dowiaduje w tym samym momencie co o produce, tylko pozniej sie zaczyna rozumiec o co w niej chodzi. W sumie o tym nie pomyslalem ;]

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