// main() zavola tuto funkciu, ked chce vediet, aky prikaz chceme vykonat, // co tato funkcia rozhodne pomocou toho, ako nastavi prikaz; void zistiTah() { Hrac ja = stav.hraci[0]; Vec mojavec = vecovat(ja.obj.pozicia); Vec konRych(0, 0); // Bonusy DoStuff(konRych, square, ZLATO, 3000000, mojavec); DoStuff(konRych, [](double d)->double{return d*d*5000.0;}, BOSS, -12000000, mojavec); DoStuff(konRych, square, ASTEROID,-6000000, mojavec); DoStuff(konRych, square, PLANETA, -6000000, mojavec); Vec temp; //DoStuff(temp, [](double d){return d;}, STRELA, -4000000, mojavec); //temp *= Vec(0, 1); //otocit o 90 deg konRych += temp; //hraci for(auto p : stav.hraci) { if(p.obj.id == ja.obj.id) continue; Vec diff = (vecovat(p.obj.pozicia) - mojavec); konRych += (norm2(diff) * (-6000000 / square(abs(diff) + 1))); } double vx= konRych.real(); double vy= konRych.imag(); double kmagiaodstien=800000; vx=max(min(vx,kmagiaodstien*(max(0.0,mapa.w-8*LOD_POLOMER-mojavec.real()))-15),-kmagiaodstien*(max(0.0,mojavec.real()-8*LOD_POLOMER))+15); vy=max(min(vy,kmagiaodstien*(max(0.0,mapa.h-8*LOD_POLOMER-mojavec.imag()))-15),-kmagiaodstien*(max(0.0,mojavec.imag()-8*LOD_POLOMER))+15); konRych=Vec(vx,vy); //double force = INF; //vy += (mapa.h / 2 < mojavec.imag()) ? force / cube(mojavec.imag()+1) : -force / cube(mojavec.imag() - mapa.h / 2 + 1) ; //vx += (mapa.w / 2 < mojavec.real()) ? force / cube(mojavec.real()+1) : -force / cube(mojavec.real() - mapa.w / 2 + 1); //konRych=Vec(vx,vy); //konRych += Vec(1, 0) * (6000000 / square(abs(mojavec.real()) + 1)); //konRych += Vec(-1, 0) * (6000000 / square(abs(mapa.w - mojavec.real()) + 1)); //konRych += Vec(0, 1) * (6000000 / square(abs(mojavec.imag()) + 1)); //konRych += Vec(0, -1) * (6000000 / square(abs(mapa.h - mojavec.imag()) + 1)); konRych-=vecovat(ja.obj.rychlost); double v=abs(konRych); v=max(v,-200.0); v=min(v,200.0); konRych=norm2(konRych)*v; prikaz.acc = odvecovat(konRych); //STRIELAJ //strielaj na strelu co ide na teba }
// main() zavola tuto funkciu, ked chce vediet, aky prikaz chceme vykonat, // co tato funkcia rozhodne pomocou toho, ako nastavi prikaz; void zistiTah() { Hrac ja = stav.hraci[0]; Vec mojavec = vecovat(ja.obj.pozicia); Vec konRych(0, 0); // Bonusy DoStuff(konRych, square, ZLATO, 150000000 / (stav.obj[ZLATO].size() + 1), mojavec); Vec tempboss; DoStuff(tempboss, linear, BOSS, -1200000, mojavec); tempboss*=Vec(0,1); konRych+=tempboss; DoStuff(konRych, square, ASTEROID,-6000000, mojavec); DoStuff(konRych, square, PLANETA, -6000000, mojavec); Vec temp; DoStuff(temp, [](double d){return d;}, STRELA, -10000, mojavec); temp *= Vec(0, 1); //otocit o 90 deg konRych += temp; //hraci for(auto p : stav.hraci) { if(p.obj.id == ja.obj.id) continue; Vec diff = (vecovat(p.obj.pozicia) - mojavec); konRych += (norm2(diff) * (-6000000 / square(abs(diff) + 1))); } double vx= konRych.real(); double vy= konRych.imag(); double kmagiaodstien=16000000000; vx=max(min(vx,kmagiaodstien*(max(0.0,mapa.w-25*LOD_POLOMER-mojavec.real()))-15),-kmagiaodstien*(max(0.0,mojavec.real()-25*LOD_POLOMER))+15); vy=max(min(vy,kmagiaodstien*(max(0.0,mapa.h-25*LOD_POLOMER-mojavec.imag()))-15),-kmagiaodstien*(max(0.0,mojavec.imag()-25*LOD_POLOMER))+15); konRych=Vec(vx,vy); //double force = INF; //vy += (mapa.h / 2 < mojavec.imag()) ? force / cube(mojavec.imag()+1) : -force / cube(mojavec.imag() - mapa.h / 2 + 1) ; //vx += (mapa.w / 2 < mojavec.real()) ? force / cube(mojavec.real()+1) : -force / cube(mojavec.real() - mapa.w / 2 + 1); //konRych=Vec(vx,vy); //konRych += Vec(1, 0) * (6000000 / square(abs(mojavec.real()) + 1)); //konRych += Vec(-1, 0) * (6000000 / square(abs(mapa.w - mojavec.real()) + 1)); //konRych += Vec(0, 1) * (6000000 / square(abs(mojavec.imag()) + 1)); //konRych += Vec(0, -1) * (6000000 / square(abs(mapa.h - mojavec.imag()) + 1)); konRych-=vecovat(ja.obj.rychlost); double v=abs(konRych); v=max(v,-200.0); v=min(v,200.0); konRych=norm2(konRych)*v; prikaz.acc = odvecovat(konRych); //STRIELAJ double minscore=1E18; for(Hrac h:stav.hraci) { if(!h.zije()) continue; if(vecovat(h.obj.pozicia)==mojavec) continue; if((abs(vecovat(h.obj.pozicia) - mojavec)+ h.obj.zivoty) < minscore ) { minscore=(abs(vecovat(h.obj.pozicia) - mojavec)+ h.obj.zivoty); prikaz.ciel=odvecovat(zratajxclenku(vecovat(h.obj.pozicia)-mojavec,vecovat(h.obj.rychlost)-vecovat(ja.obj.rychlost))); } } bool debugstrely=true; if(mojavec.real()<(20*LOD_POLOMER)) {if(debugstrely) prikaz.ciel=Bod(0,0); prikaz.acc=prikaz.acc+Bod(1000000,0);} if(mojavec.imag()<(20*LOD_POLOMER)) {if(debugstrely) prikaz.ciel=Bod(0,0); prikaz.acc=prikaz.acc+Bod(0,1000000);} if(mojavec.real()>(mapa.w-20*LOD_POLOMER)) {if(debugstrely) prikaz.ciel=Bod(0,0); prikaz.acc=prikaz.acc-Bod(1000000,0);} if(mojavec.imag()>(mapa.h-20*LOD_POLOMER)) {if(debugstrely) prikaz.ciel=Bod(0,0); prikaz.acc=prikaz.acc-Bod(0,1000000);} }
Bod odvecovat(Vec vec) { return Bod(vec.real(), vec.imag()); }