|
Polski Portal COLOBOTa COLOBOT Polish Portal |
|
Programy - Ostrzeliwanie szybko lecących celów.
nieerotycki - 29-07-2009, 14:14 Temat postu: Ostrzeliwanie szybko lecących celów. Siedziałem troszkę nad tym programem. Nie jest on super dokładny bo przyjąłem pewne uproszczenia. Ale zawsze można poprawić.
Liczę ile leci pocisk do miejsca w którym jest obecnie cel.
Następnie obliczam gdzie będzie cel za czas w jaki doleci do niego pocisk.
Zakładam że niewiele się zmieni czas lotu pocisku i mogę się posługiwać dalej tą wartością dla nowego miejsca (choć na pewno zmniejsza to celność ale upraszcza a ja przez ponad rok nie miałem z geometrią do czynienia od matury dokładnie).
Użyłem kawałka kodu z tematu 'Cel Pal' (nie chciało mi się samemu tego rozpracowywać). Mam nadzieję że Pipok się nie obrazi.
Czekam na komentarze i uwagi
Kod: | extern void object::Obrona()
{
object wrog; // informacje o obiekcie
aim(0); // celuj w poziomie
int RodzajWrog=Me; // kogo atakowac
point cel,A,B,C; // gdzie jest wrog
float azymut,alfa,beta,pitchK,rollK,gamma,e,f,epsilon,delta;
float odleglosc,ILP;
while ( true ){ // powtarzaj w nieskonczonosc
while((wrog = radar(RodzajWrog, 0, 360, 0, 50))==null) wait(0.5); //szukaj wroga
//gdzie bedzie za ILP;
A=wrog.position;
wait(0.2);
B=wrog.position;
odleglosc=distance(position,wrog.position);
ILP=1.08*odleglosc/8; // w 0.2 sekundy
C.x=B.x+ILP*(B.x-A.x);
C.y=B.y+ILP*(B.y-A.y);
C.z=B.z+ILP*(B.z-A.z);
if ( wrog != null ){
cel=C; // namierz wroga
azymut = direction(cel); // jaki w plaszczyznie kat do wroga
alfa = atan( (cel.z-position.z)/distance2d(position, cel) );
// -- poprawka na nachylenie terenu
pitchK = pitch*cos(azymut) - roll*sin(azymut);
rollK = roll*cos(azymut) + pitch*sin(azymut);
alfa = alfa - pitchK;
beta = rollK;
gamma = asin( sin(alfa)*cos(beta) );
e = acos ( cos(alfa)/cos(gamma) );
if (alfa<0) e = -e;
//etid
epsilon = acos( cos(alfa)/cos(gamma) );
//edit
f = asin( sin(beta)*sin(epsilon) );
delta=0;
if (cos(f)!=0)
delta = acos( cos(epsilon)/cos(f) );
if (f<0) delta = -delta;
alfa=gamma; // -- koniec poprawki
turn(azymut);
aim(alfa);
if ((alfa > -20) && (alfa < 20) && (distance(C,position)<=40)) fire(0.2);
}
}
} |
Mam zamiar dodać od siebie sprawdzanie czy cel nie jest za przeszkodą ale na razie nie mam czasu.
adiblol - 29-07-2009, 16:30
Daj wcięcia.
Poza tym daj do tagu [ code ] albo jeszcze lepiej do pastebinu.
--
moderator
pipok - 01-08-2009, 13:05 Temat postu: Re: Ostrzeliwanie szybko lecących celów.
nieerotycki napisał/a: | Użyłem kawałka kodu z tematu 'Cel Pal' (nie chciało mi się samemu tego rozpracowywać). Mam nadzieję że Pipok się nie obrazi. | "Nie zapala się światła i nie stawia pod garncem, ale na świeczniku, aby świeciło wszystkim"
Berserker - 18-11-2009, 20:39
Kod: |
float dir1, dir2, dir;
point pos1, pos2;
pos1 = p.position;
wait(0.2);
pos.2 = p.position;
dir1 = direction(pos1);
dir2 = direction(pos2);
dir = 2 * dir2 - dir1
motor(-dir/90, dir/90);
|
Moj program do celowania "w przyszlosc" napisany w 3min Wiem, ze to nie jest ruch po okregu, ale zasieg 40m pozwala na pare przyblizen.
Podziwiam, ze chcialo ci sie robic program, ktorego dzialania praktycznie nie zauwazysz ze wzgledu na szybkosc strzalow w colobocie.
Roll ma duzy wplyw na celowanie? Ja nigdy go nie zauwazalem, tylko pitch dla robotow latajacych.
pipok - 19-11-2009, 08:52
Berserker napisał/a: | Moj program do celowania "w przyszlosc" napisany w 3min | To widać Bo to jest program do obracania się w tę samą stronę, w którą niedawno ruszył się cel, a nie do celowania
Berserker napisał/a: | Podziwiam, ze chcialo ci sie robic program, ktorego dzialania praktycznie nie zauwazysz ze wzgledu na szybkosc strzalow w colobocie. | Przed oddaniem strzału bot ustawia się na cel przez obrót w kierunku pozycji mrówki w chwili pomiaru położenia. Ale w czasie, kiedy się obracał w stronę tego punktu, mrówka się przesuwała. To znaczy, że już w chwili, kiedy bot oddaje strzał, pocisk nie leci dokładnie w kierunku aktualnego położenia mrówki.
Nawet bez uwzględniania tej równicy:
Prędkość pocisku to około 50m/s. Jednostki latające mają prędkość ok.7m/s (w locie), kołowe 5m/s, a wyposażone w nogi - ok.4m/s. To znaczy, że mrówka oddalona o 40 metrów zdąży się przesunąć o 40/50*4, czyli ok. 3m, zanim pocisk dotrze na miejsce. Rozmiar mrówki to około 2m. Zmiana położenia o 3m celu mającego wielkość 2m wystarczy, żeby uniknął trafienia.
Berserker napisał/a: | Roll ma duzy wplyw na celowanie? Ja nigdy go nie zauwazalem, tylko pitch dla robotow latajacych. |
pipok, 10-07-2009, 09:54 napisał/a: | Jeśli przy wypoziomowanym bocie cel był widoczny pod kątem 20 stopni [w pionie], to po obróceniu się bota o 20 stopni na bok cel jest widoczny pod kątem 18,7 stopni. Co przy odległości do celu równej 40 metrów daje metr różnicy w pionie. | W poziomie różnica będzie większa, azymut zmieni się o 6-7stopni, co daje około 4-5m.
Berserker - 19-11-2009, 13:48
Cytat: | Prędkość pocisku to około 50m/s. Jednostki latające mają prędkość ok.7m/s (w locie), |
13-14m/s zaleznie od czasu jaki sie wezmie do obliczen. Przynajmniej tyle porusza sie osa.
Tyle w teorii. 1/5 sekundy nie wystarcza, by dokladnie obliczyc zmiane polozenia. Dla pomiaru predkosci potrzeba przynajmniej jednej sekundy, inaczej program potrafi otrzymac predkosc rzedu 30-70m/s (SIC!).
Ale jak juz jestesmy przy celowaniu z dokladnoscia do pol metra, pociski to nie jest liniowy strumien czastek, lecz cos, co moze ostrzeliwywac pewna powierzchnie. Tak wiec tuz przy robocie salwa obejmie z 0.5m^2, a na koncu bym sie nie zdziwil, gdyby to bylo 3-4m^2 (zwlaszcza dla dzial organicznych), co daje 2m szerokosci.
Jesli chodzi o osy, to nawet ta piata czesc sekundy pozwala jej znacznie zmienic wysokosc i kierunek lotu.
Wiec dalej pozostane przy zdaniu, ze program ciekawy ale daje niewielka roznice (poza nachyleniem terenu, chociaz rzadko zauwazam, zeby robot nie trafil z powodu przechylenia na bok)
pipok - 19-11-2009, 14:20
Berserker napisał/a: | 1/5 sekundy nie wystarcza, by dokladnie obliczyc zmiane polozenia. Dla pomiaru predkosci potrzeba przynajmniej jednej sekundy, inaczej program potrafi otrzymac predkosc rzedu 30-70m/s (SIC!). | Nie zetknąłem się z takim przypadkiem. Z mojego doświadczenia wynika, że 0,2 sekundy wystarczy na sensowny pomiar.
Berserker napisał/a: | na koncu bym sie nie zdziwil, gdyby to bylo 3-4m^2 (zwlaszcza dla dzial organicznych), co daje 2m szerokosci. | Właśnie. Te 2m to wymiar mrówki. A jeśli mrówka podczas strzału przesunie się o 3m, to może spokojnie uniknąć pocisku.
Berserker napisał/a: | Wiec dalej pozostane przy zdaniu, ze program ciekawy ale daje niewielka roznice | Przy trudnej, zaciętej walce, mała różnica decyduje o życiu lub śmierci. Dodatkowa energia, potrzebna na oddanie poprawkowego strzału, również może zdecydować. Kiedy sytuacja jest prosta, wystarczy prosty kod.
FE4R - 22-11-2009, 16:06
pipok napisał/a: | Przy trudnej, zaciętej walce, mała różnica decyduje o życiu lub śmierci. Dodatkowa energia, potrzebna na oddanie poprawkowego strzału, również może zdecydować. Kiedy sytuacja jest prosta, wystarczy prosty kod. |
Daj spokój. Twój najprostszy program, z którym sam się męczyłem pozwolił mi zabić wszystkie osy na mapie używając może 2% energii atomowego ogniwa.
Berserker - 22-11-2009, 19:13
Tez zalezy od programu jaki ma przeciwnik. Piszemy wszyscy programy pod roboty a malo jest dobrych programow dla obych
FE4R - 22-11-2009, 21:18
Berserker napisał/a: | Tez zalezy od programu jaki ma przeciwnik. Piszemy wszyscy programy pod roboty a malo jest dobrych programow dla obych |
Wystarczy fire(item.position)... i przed tym sie nie obronisz, jak walczysz z mrowka... potrafi przestrzelic cala mape i zniszczyc wszystkie twoje budynki...
Berserker - 22-11-2009, 22:51
Kiedys sprawdzalem, calej mapy nie przestrzeli, zasieg to 100-120m, co i tak daje duzaa przewage, ale wracajac do tematu o wiele latwiej jest zestrzelic ose ktora leci w jednym kierunku na jednej wysokosci, a o wiele trudniej zestrzelic ose ktora ma stuningowany program wyciagniety z cwiczen.
Bartek c++ - 26-11-2009, 10:10
Najlepiej ustawić bota wstawić mu if i turn(direction(... Kiedy będzie 40 m w twoim zasięgu Zestrzeli go.
adiblol - 29-11-2009, 20:14
Bartek c++ napisał/a: | Najlepiej ustawić bota wstawić mu if i turn(direction(... Kiedy będzie 40 m w twoim zasięgu Zestrzeli go. |
Nic nie zrozumiałem z Twojego postu...
FE4R - 29-11-2009, 20:44
Ja znam odpowiedź na pytanie!
Zamiast tworzyć programy tak zaawansowane, że Sam ich nie rozumiesz (pipok-style ) - wystarczy mieć budynki blisko siebie i postawić robota w jakiejś 'inteligentnej pozycji'. Osa przez chwile czeka, zanim zrzuca bombę.
Zbyt hipotetyczne sytuacje nie mają sensu...
Berserker - 30-11-2009, 13:55
Cytat: | Ja znam odpowiedź na pytanie!
Zamiast tworzyć programy tak zaawansowane, że Sam ich nie rozumiesz (pipok-style ) - wystarczy mieć budynki blisko siebie i postawić robota w jakiejś 'inteligentnej pozycji'. Osa przez chwile czeka, zanim zrzuca bombę. |
Tylko jesli osa dziala wg standardowego programu i przemieszcza sie do pozycji za pomoca instrukcji goto(). Wystarczy zamienic goto() na motor() i juz masz problem. Pare dodatkowych modyfikacji i taki robot nawet tej osy nie trafi.
FE4R - 30-11-2009, 17:15
Berserker napisał/a: | Cytat: | Ja znam odpowiedź na pytanie!
Zamiast tworzyć programy tak zaawansowane, że Sam ich nie rozumiesz (pipok-style ) - wystarczy mieć budynki blisko siebie i postawić robota w jakiejś 'inteligentnej pozycji'. Osa przez chwile czeka, zanim zrzuca bombę. |
Tylko jesli osa dziala wg standardowego programu i przemieszcza sie do pozycji za pomoca instrukcji goto(). Wystarczy zamienic goto() na motor() i juz masz problem. Pare dodatkowych modyfikacji i taki robot nawet tej osy nie trafi. |
Jeśli użyjesz fire(0.1) zamiast fire(1), wątpię, że robot nie trafi osy, która jest w polu jego zasięgu. Problem jest jedynie, gdy osa leci daleko, przy ok ~30 metrach na godzinie 9 od początkowej orientacji robota. Dlatego ja uruchamiam turn(direction(enemy.position)); gdy cel jest w zasięgu 70 metrów, a strzela dopiero przy 40.
adiblol - 30-11-2009, 18:45
Cytat: | przy ok ~30 metrach na godzinie |
Chyba na sekundę ?!?!
FE4R - 30-11-2009, 21:59
adiblol napisał/a: | Cytat: | przy ok ~30 metrach na godzinie |
Chyba na sekundę ?!?! |
Na godzinie...
Godzinie dziewiątej. Chodzi tutaj o pozycję osy wobec robota.
Czasami mówi się: 'Cel na dziewiątej!', co oznacza 90 stopni w lewo.
No, ale jak już jesteśmy przy prędkości:
Prędkość osy = prędkość robota latającego.
adiblol - 01-12-2009, 16:54
FE4R napisał/a: | Na godzinie... |
A, godzinę kątów!
saf - 26-02-2010, 14:45 Temat postu: ;]] nie wiedze sensu takiego menczenia sie, przecież pisanie programu przez 3h (nie, nie kont tylko czas) a'la pipok niema sensy, gdy w tym czasie można rencznie przejsc cala gre
ja to sie nawet w atan nie bawie tylko pisze
while(this.position.z!=item.position.z)
{
jet(1);
{
i trafiam benz problemu we wszystko, może nie za pierwszym razem ale trafiam
Bartek c++ - 26-02-2010, 15:04
to ma ci trafić?
To tylko unosi ciebie jak wrog jest na równej wysokości co ty.
ty sie lepiej poucz cbot.
[ Dodano: 26-02-2010, 15:04 ]
a jak robot to nie robot latający?
Ten program twoj saf to kit.
|
|