|
Polski Portal COLOBOTa COLOBOT Polish Portal |
|
Programy pomiarowe - Losowe pozycje
colobotwymiiata - 26-05-2009, 20:22 Temat postu: Losowe pozycje Oto mój kolejny, mocno skomplikowany program!
Służy on do losowania pozycji, i tworzenia na tych pozycjach dowolnych obiektów(przenośne+ obcy).
Posiada funkcję sprzężenia z(nieco zmodyfikowanym) programem "Zapiszobiekt" autorstwa COLOBOTa, więć może tworzyć losowe obiekty dla własnych poziomów.
Składnia funkcji "LosPoz":
"int spzZO" - sprzężenia z funkcją "Zapiszobiekt". Przy wartości "1" zapisuje pozycje do pliku, przy innych działanie normalne.
"point gdzie" - pozycja w pobliżu której będą tworzone obiekty.
"int cat" - kategoria obiektu.
"int ile" - decyduje ile obiektów zostanie utworzonych.
"float min" - odległość od pozycji, bliżej obiekty nie będą tworzone.
"float ok" - odległość, około której będzie się wachała odległość obiektu od pozycji.
"float mod" - odległość między obiektami.
Przykład:
LosPoz(0,position,Mine,5,25,26,5);
Tworzy 5 min(nie zapisuje do pliku), w odległości większej niż 25m od robota wykonującego program, w odległości plus minus 26m, odległość między minami to conajmniej 5m.
W razie pytań tradycyjnie wypowiadać się w tym temacie
PS.:Myślę że to już jeden z ostatnich programów w Colobocie.... Nie ma już natchnienia wszystkie możliwości wyczerpane....
Kod: | extern void object::DL()
{
}
void object::LosPoz(int spzZO, point gdzie, int cat,int ile, float min, float ok, float mod)
{
point pnt;
pnt=Los(gdzie,min,ok,mod);
if(spzZO==1)
{
for(int i=0;i<ile;i++)
{
pnt=Los(gdzie,min,ok,mod);
produce(pnt,0,cat,"");
Zapiszobiekt(pnt);
}
return;
}
else
{
for(int i=0;i<ile;i++)
{
pnt=Los(gdzie,min,ok,mod);
produce(pnt,0,cat,"");
}
return;
}
}
point object::Los(point pos, float min, float ok, float mod)
{
float p;
point w;
bool juz;
juz=false;
while(juz!=true)
{
p=rand();
if(p>0.00 and p<0.25)
{
w.x=pos.x+rand()*rand()*ok+rand()*3.2;
w.y=pos.y+rand()*rand()*ok+rand()*3.2;
}
if(p>0.25 and p< 0.50)
{
w.x=pos.x-rand()*rand()*ok+rand()*3.2;
w.y=pos.y-rand()*rand()*ok+rand()*3.2;
}
if(p>0.50 and p< 0.75)
{
w.x=pos.x+rand()*rand()*ok+rand()*3.2;
w.y=pos.y-rand()*rand()*ok+rand()*3.2;
}
if(p>0.75 and p< 1.00)
{
w.x=pos.x-rand()*rand()*ok+rand()*3.2;
w.y=pos.y+rand()*rand()*ok+rand()*3.2;
}
if(distance2d(position,w)>min and szuk(w, mod)==true)juz=true;
}
return w;
}
bool object::szuk(point q, float mod)
{
object w;
w=search(0,q);
if(w!=null)
{
if(distance(q,w.position)>mod)return true;
}
else return false;
}
void object::Zapiszobiekt(point pos)
{
string msg, poz;
float dir;
int i;
dir = 2 - (orientation / 180);
if (dir > 1.99) dir = 0.00;
poz = pos.x+";"+pos.y;
file plik();
file p2();
if (!plik.open("Obiekty.txt", "r"))
{
plik.open("Obiekty.txt", "w");
plik.writeln("CreateObject pos="+poz+" dir="+dir+" type=");
plik.close();
message(pos.x+" ; "+pos.y+" , "+dir);
return;
}
p2.open("Obiekty2.txt", "w");
while(!plik.eof())
{
msg = plik.readln();
if (msg != "") p2.writeln(msg);
}
plik.close();
p2.close();
plik.open("Obiekty.txt", "w");
p2.open("Obiekty2.txt", "r");
while(!p2.eof())
{
msg = p2.readln();
if (msg != "") plik.writeln(msg);
}
plik.writeln("CreateObject pos="+poz+" dir="+dir+" type=");
plik.close();
p2.close();
message(pos.x+" ; "+pos.y+" , "+dir);
} |
PS.2: Wiem, że podobne efekty można uzyskać za pomocą "space", ale "space" robi to dość dziwnie(przynajmniej u mnie). Ten program ma trochę więcej funkcji, i mam nadzieję że się spodoba.
Abadon - 26-05-2009, 20:24
Ciekawy ten twój program. Widać że się trochę napracowałeś i pomysłów ci nie brak. Brawa.
|
|