Oryginalna strona colobot.cba.pl umarła, gdy cba.pl przestało oferować darmowy hosting. To jest statyczny mirror, pobrany w 2018. ~krzys_h
|
Forum - Polski Portal COLOBOTa |
|
|
Przesunięty przez: Abadon 20-02-2010, 14:12 |
Ciekawe programy dla Obcych |
Autor |
Wiadomość |
adiblol
Administrator forum FLOSS FTW!
Twoja ulubiona misja: porównywanie formatów audio
Pomógł: 18 razy Dołączył: 21 Kwi 2008 Posty: 1313 Skąd: pokój odsłuchowy
|
Wysłany: 26-04-2008, 10:51 Ciekawe programy dla Obcych
|
|
|
Oto moje produkcje - programy dla Obcych, wykorzystane we własnych poziomach (niedługo te własne poziomy będzie można ściągnąć).
Program 1. To jest program dla mrówek. Jeśli nie ma żadnego robota itp. to podchodzi do innej mrówki, strzela do niej, a jeśli będzie za blisko to odchodzi.
Kod: |
// składnia cmdline: czułość;max_pitch;nav_x;nav_y
extern void object::Attack() {
errmode(0);
float d1, d2;
int i=0;
object item;
int list[];
list[i++] = WingedGrabber;
list[i++] = TrackedGrabber;
list[i++] = WheeledGrabber;
list[i++] = LeggedGrabber;
list[i++] = WingedShooter;
list[i++] = TrackedShooter;
list[i++] = WheeledShooter;
list[i++] = LeggedShooter;
list[i++] = WingedOrgaShooter;
list[i++] = TrackedOrgaShooter;
list[i++] = WheeledOrgaShooter;
list[i++] = LeggedOrgaShooter;
list[i++] = WingedSniffer;
list[i++] = TrackedSniffer;
list[i++] = WheeledSniffer;
list[i++] = LeggedSniffer;
list[i++] = Thumper;
list[i++] = PhazerShooter;
list[i++] = Recycler;
list[i++] = Shielder;
list[i++] = Subber;
list[i++] = Me;
list[i++] = Derrick;
list[i++] = BotFactory;
list[i++] = PowerStation;
list[i++] = Converter;
list[i++] = RepairCenter;
list[i++] = DefenseTower;
list[i++] = ResearchCenter;
list[i++] = RadarStation;
list[i++] = ExchangePost;
list[i++] = PowerPlant;
list[i++] = AutoLab;
list[i++] = NuclearPlant;
i=0;
float sens=cmdlineDef(0,70);
point nav1;
point prevpos;
if ((cmdline(3)<-1000) or (cmdline(3)>1000)) {
nav1.x=position.x;
nav1.y=position.y;
} else {
nav1.x=cmdline(2);
nav1.y=cmdline(3);
}
wait(1);
prevpos=space(position);
float dir;
point dpnt;
while(ismovie()!=0) wait(1);
//message(nav1.x);
//message(nav1.y);
while(true) {
i++;
item=radar(list,0,360,0, sens);
if (item==null) {
if ((topo(PozPrzed(position,orientation,4))>0) and (abs(pitch)<cmdlineDef(1,15))) {
prevpos=position;
item=radar(AlienAnt, 0,360,0,8);
if (item!=null) {
if (distance(item.position,position)>4) {
fire(item.position);
dir=direction(item.position);
if (abs(dir)>10) {
if (dir<0) motor(1,0.5*rand()); else motor(0.5*rand(),1);
} else motor(0.7, 0.7);
} else {
//fire(item.position);
//dpnt=PozPrzed(item.position,item.orientation, -3);
dpnt=space(item.position, 5, 14, 5);
/*dir=direction(dpnt);
if (abs(dir)>10) {
if (dir<0) motor(0.5,0.4*rand()); else motor(0.4*rand(),0.5);
} else motor(0.4, 0.4);*/
//goto(dpnt);
turn(OppDir(item.position));
motor(0.8,0.8);
//wait(rand()*2+1);
}
} else {
motor((rand()*0.3)+0.7, (rand()*0.3)+0.7);
}
wait((rand()*0.65)+0.5);
//motor(0.9, 0.9);
} else {
//message("DEBUG: za stromo lub woda!");
turn(direction(prevpos));
motor(0.8,0.8);
}
wait((rand()*1.5)+0.5);
if (distance(prevpos,position)<1) turn((rand()*360)-180); //jesli trafil na przeszkode
if (distance(nav1, position)>sens) {
//message("DEBUG: za daleko od bazy!");
turn(direction(nav1));
//move(7);
}
continue;
}
turn(direction(item.position));
if (distance(position, item.position)<30) {
fire(item.position);
}
if (distance(position, item.position)>15) {
if (topo(PozPrzed(position,orientation, 4))>0) {
prevpos=position;
motor(1,1);
} else {
goto(prevpos);
//fire(item.position);
}
wait(0.65+rand());
}
}
}
float object::cmdlineDef(int nr, float def) {
float par;
par=cmdline(nr);
if (abs(par)>10000) {
return def;
} else {
return par;
}
}
point object::PozPrzed(point pos, float ang, float dist) {
point zpos;
zpos.x=cos(ang)*dist+pos.x;
zpos.y=sin(ang)*dist+pos.y;
return zpos;
}
float object::OppDir(point pos) {
float opdir;
float stdir=direction(pos);
if (stdir<0) {
opdir=stdir+180;
} else {
opdir=stdir-180;
}
}
|
Funkcje:
PozPrzed: wylicza pozycję przed punktem, użyte do wykrywania wody/lawy
OppDir: kierunek przeciwny, do uciekania przed czymś
Program 2. Program dla os. Niszczy osłony obiektów poprzez uderzanie ich. Napisałem go dawno i jest trochę niedoskonały.
Kod: |
extern void object::Attack() {
errmode(0);
int list[];
int i=0;
list[i++] = WingedGrabber;
list[i++] = TrackedGrabber;
list[i++] = WheeledGrabber;
list[i++] = LeggedGrabber;
list[i++] = WingedShooter;
list[i++] = TrackedShooter;
list[i++] = WheeledShooter;
list[i++] = LeggedShooter;
list[i++] = WingedOrgaShooter;
list[i++] = TrackedOrgaShooter;
list[i++] = WheeledOrgaShooter;
list[i++] = LeggedOrgaShooter;
list[i++] = WingedSniffer;
list[i++] = TrackedSniffer;
list[i++] = WheeledSniffer;
list[i++] = LeggedSniffer;
list[i++] = Thumper;
list[i++] = PhazerShooter;
list[i++] = Recycler;
list[i++] = Shielder;
list[i++] = Subber;
//list[i++] = Me;
list[i++] = Derrick;
list[i++] = BotFactory;
list[i++] = PowerStation;
list[i++] = Converter;
list[i++] = RepairCenter;
list[i++] = DefenseTower;
list[i++] = ResearchCenter;
list[i++] = RadarStation;
list[i++] = ExchangePost;
list[i++] = PowerPlant;
list[i++] = AutoLab;
list[i++] = NuclearPlant;
object item;
point lastpos;
float victim_z;
while(ismovie()!=0) { wait(2); }
while(true) {
item=radar(list,0,360,0, 70);
if (item==null) { // jeśli nic nie ma, to się nudź ...
jet(-0.4);
while(altitude>0) wait(0.8);
motor(rand()-0.5, rand()-0.5);
wait(rand()*3);
continue;
}
victim_z=item.position.z+1; // wysokość n.p.m. uderzeń
turn(direction(item.position));
//motor(1,1);
wait(0.1);
motor(1,1);
wait(0.5);
// while ((distance(lastpos, position)>0.3) and (item!=null) and (abs(direction(item.position))<70)) {
if (abs(victim_z-position.z)>0.1) { // korekcja wysokości
if (victim_z > position.z) { jet(0.3); } else { jet(-0.3); }
}
wait(0.3);
jet(0);
motor(1,1);
lastpos=position;
wait(0.5);
// }
if (distance(lastpos,position)<0.3) {
motor(-1, -1);
wait(5);
}
}
}
|
Program 3. Program dla Królowej. Produkuje robaki, a w sytuacji zagrożenia jakimś robotem wytwarza dodatkowo mrówki i osy do walki z tym robotem, dodatkowo idzie za tym robotem. Należy zmienić nazwy programów w parametrach funkcji produce.
Kod: |
extern void object::WormProd() {
errmode(0);
int list[];
int i=0;
list[i++] = WingedGrabber;
list[i++] = TrackedGrabber;
list[i++] = WheeledGrabber;
list[i++] = LeggedGrabber;
list[i++] = WingedShooter;
list[i++] = TrackedShooter;
list[i++] = WheeledShooter;
list[i++] = LeggedShooter;
list[i++] = WingedOrgaShooter;
list[i++] = TrackedOrgaShooter;
list[i++] = WheeledOrgaShooter;
list[i++] = LeggedOrgaShooter;
list[i++] = WingedSniffer;
list[i++] = TrackedSniffer;
list[i++] = WheeledSniffer;
list[i++] = LeggedSniffer;
list[i++] = Thumper;
list[i++] = PhazerShooter;
list[i++] = Recycler;
list[i++] = Shielder;
list[i++] = Subber;
list[i++] = Me;
point srodek;
srodek.x=cmdline(1);
srodek.y=cmdline(2);
point prevpos;
point dest;
prevpos=srodek;
object item;
string kidscript;
int kidcat;
float randnum;
while(ismovie()!=0) wait(1);
while(true) {
motor(0.5+(rand()*0.3), 0.5+(rand()*0.3));
if ((rand()<0.2) and (ObjCount(AlienWorm)<14)) {
produce(position, orientation, AlienWorm, "%user%\\worm01.txt");
}
if (position.z<0) {
goto(prevpos);
} else {
prevpos=position;
}
wait(rand()+0.5);
if (distance(position, prevpos)<1) {
turn((rand()-0.5)*170);
}
item=radar(list,0,360,0, 80);
if (item!=null) {
turn(direction(item.position));
motor(1,1);
wait(1);
if ((rand()<0.8) and (TotalAliensCount()<30)) {
randnum=rand();
if (randnum<0.33) {
kidcat=AlienAnt;
kidscript="%user%\\ant01.txt";
} else if (randnum<0.66) {
kidcat=AlienAnt;
kidscript="%user%\\ant02.txt";
} else {
kidcat=AlienWasp;
kidscript="%user%\\wasp01.txt";
}
produce(position, orientation, kidcat, kidscript);
}
} else if (distance(srodek, position)>cmdline(0)) {
turn(direction(srodek));
}
}
}
int object::ObjCount(int cat) {
int i=0;
int num=0;
object item;
while(true) {
item=retobject(i);
if (item==null) break;
if (item.category==cat) num++;
i++;
}
return num;
}
int object::TotalAliensCount() {
int num=0;
num+=ObjCount(AlienAnt);
num+=ObjCount(AlienWasp);
num+=ObjCount(AlienSpider);
num+=ObjCount(AlienWorm);
num+=ObjCount(AlienEgg);
return num;
}
|
|
_________________ 1Tbps Project && Telecomix Network
|
|
|
|
|
Tomesy
Dołączył: 10 Lut 2008 Posty: 103 Skąd: Łomża
|
Wysłany: 26-04-2008, 22:06 RE: Ciekawe programy dla Obcych
|
|
|
Programy są ok, ale wolałbym, żeby były umieszczone za pomocą code, bo te cyferki po lewej trochę utrudniają życie. |
_________________ Piszę bo lubię. |
|
|
|
|
adiblol
Administrator forum FLOSS FTW!
Twoja ulubiona misja: porównywanie formatów audio
Pomógł: 18 razy Dołączył: 21 Kwi 2008 Posty: 1313 Skąd: pokój odsłuchowy
|
Wysłany: 26-04-2008, 22:19 RE: Ciekawe programy dla Obcych
|
|
|
Wtedy w ogóle nie widać struktury, bo spacje są zamieniane na białe znaki. Możesz zrobić cytowanie. |
_________________ 1Tbps Project && Telecomix Network
|
|
|
|
|
adiblol
Administrator forum FLOSS FTW!
Twoja ulubiona misja: porównywanie formatów audio
Pomógł: 18 razy Dołączył: 21 Kwi 2008 Posty: 1313 Skąd: pokój odsłuchowy
|
|
|
|
|
|
Nie możesz pisać nowych tematów Możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Nie możesz załączać plików na tym forum Możesz ściągać załączniki na tym forum
|
Wersja do druku
|
|
| |
|
|
|
|
Polski Portal COLOBOTa © 2008 - 2012 |
|
|