|
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 .
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 ;]
|
|