|
Polski Portal COLOBOTa COLOBOT Polish Portal |
 |
Problemy [programowanie] - Nalot
Zibo - 25-12-2008, 19:02 Temat postu: Nalot Męczę się i męczę i nie mogę odnaleźć pożądanej funkcji, dzięki której mógłbym wydać rozkaz bot'owi, aby po namierzeniu celu zbliżył się do niego utrzymując ustaloną odległość.
A dokładniej pragnę napisać jakiś ubogi programik dla Shooter'a, aby po ustaleniu pozycji mrówki poleciał do niej i zatrzymał x metrów przed nią.
Jak to osiągnąć?
Halp!
///Pokemonizm! - DeiDara
DemoLisH - 26-12-2008, 00:21 Temat postu: RE: Nalot if(distance(twojaPoz.position, robak.position)<50)
// jeśli dystans dzielący ciebie od mrówki jest mniejszy od 50 to...
{
motor(0,0) // zatrzymuje się
}
///Błędy! - DeiDara
Zibo - 26-12-2008, 18:09 Temat postu: RE: Nalot No właśnie interesują mnie wcześniejsze instrukcje. W ten sposób nie przyniesie skutku zastosowanie powyższego, bo polecenie goto() musi zostać wykonane do końca (czyli bot siądzie wrogowi na łeb ;] ), aby móc przejść do kolejnego.
Nie robimy tego chyba przy pomocy motor(), bo tracimy możliwość omijania przeszkód (jak przy goto), prawda..?
Wciąż poszukuję kodu do stworzenia masakratora szukającego wroga i strzelającego do niego z ust. odległości. :-]
adiblol - 02-01-2009, 19:17 Temat postu: RE: Nalot Nie możesz używać polecenia goto...
Kod: | float DIST = 40; //podstawiasz odległość przy której się zatrzyma
turn(direction(enemyPos));
if (distance(position,enemyPos)>DIST) motor(1,1); else motor(0,0);
wait(0.1); |
Tylko jest jeden problem - nie wyszukuje automatycznie drogi, ale to jest raczej nieistotne w robotach latających.
WRIM - 10-01-2009, 17:19 Temat postu: RE: Nalot Rozwiązanie znajduje się na ostatniej misji na Nowej Ziemi w programie osłaniacza. Oblicza on za pomocą pewnych funkcji pozycję 5 metrów za działem fazowym i na tę pozycję się udaje. Generalnie najprościej można zmodyfikować ten program, aby zamiast działa fazowego liczył pozycję mrówki, a dystans wynosił 50m. Jednak tak duża odległość wymagałaby jeszcze kilku poprawek, ale od biedy taki program może być.
adiblol - 11-01-2009, 12:03 Temat postu: RE: Nalot Można też obliczać pozycję tą funkcją: http://colobotpl.pastebin.com/f87a6acc
I sprawdzić jaki kąt powoduje najmniejszą drogę, a później to już tylko goto.
float bestdist=10000;
float bdangle=0;
float dist;
for (float i=0;i<360;i+=10) {
dist=distance(position,PosInFront(enemyPos, i, 40));
if (dist<bestdist) { bestdist=dist; bdangle=i; }
}
goto(PosInFront(enemyPos, bdangle, 40));
Problem pojawia się gdy wyliczenie padnie na miejsce gdzie znajduje się jakaś przeszkoda. Dlatego można zamienić ostatnią linijkę na:
point pos=PosInFront(enemyPos, bdangle, 40);
errmode(0);
while (goto(pos)!=0) {
pos=space(pos);
wait(0.5);
}
errmode(1);
Program nie był testowany.
|
|