Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

AI - sztuczna inteligencja

Ostatnio zmodyfikowano 2008-11-02 15:19
Autor Wiadomość
Artras
Temat założony przez niniejszego użytkownika
AI - sztuczna inteligencja
» 2008-11-02 12:23:23
Poszukuje już od kilku dni, algorytmu na poruszanie się wrogów (w grze ) bez mojej pomocy (bez używania jakich kolwiek klawiszy). Nie chodzi mi o gotowy kod, tylko o zarys jak mniej więcej ma to wyglądać. Co po czym ma się wydarzyć itp.

Z góry dziękuje za pomoc.
P-2403
lynx
» 2008-11-02 12:59:59
To zależy jaką grę robisz, jak ma być inteligentny komputer i jaki poziom chcesz ustawić. Jednym słowem wszystko zależy od Ciebie, my nie wiemy co chcesz osiągnąć pisząc kod tej gry. :)
P-2404
Artras
Temat założony przez niniejszego użytkownika
» 2008-11-02 13:19:18
Jest to zwykła platformówka. Chodzi mi o to żeby potworki przesuwały się o jakąś odległość, później wracały. Taka pętla. Jeżeli bohater gry będzie w odległości np 30 px od wroga to wróg ma wystrzelić coś (jakiś pocisk).

a jeżeli chodzi o kod:

http://www.nopaste.pl/76h  <-- pokazuje w takiej formie ze względu na czytelność :P
P-2405
DeBugger
» 2008-11-02 13:41:38
Musisz sobie napisać warunek.
Jeżeli np. ludzik będzie w odległości równej, lub mniejszej od potwora(te 30px), to on wystrzeli.
P-2406
Artras
Temat założony przez niniejszego użytkownika
» 2008-11-02 13:56:44
ok. ale co zrobić żeby potworek sam się poruszał?
P-2407
lynx
» 2008-11-02 14:09:36
A z tym zapętlonym chodzeniem to coś takiego:

C/C++
int x = 40; //potwór x
int y = 20; //potwór y
bool kierunek;

if( kierunek == true )
{
    x++;
    if( x > 60 )
    {
        kierunek = false;
    }
}
else if( kierunek == false )
{
    x--;
    if( x < 40 )
    {
        kierunek = true;
    }
}
I takie coś umieszczasz w głównej pętli while.

To jest taki przykładowy kod jak zrobić poruszanie się przeciwnika w prawo, a następnie w lewo. Mam nadzieję, że zobrazowałem Ci jak takie coś powinno wyglądać. Oczywiście to jest sama podstawa takiego ruchu po ścieżce. Nie wiem czy można to nazwać AI, bo to chyba jest za duże słowo, ale jako prosty ruch po ścieżce napewno. Zaletą takiego ruchu jest jego prostota i brak wymagania żadnego kolwiek sprawdzania kolizji (pod warunkiem, że dokładnie to napiszemy). Niestety wadą takiego rozwiązania jest to, że jest mało realistyczny, i trzeba robić ciągle nowe scieżki, bo pewnie w swojej platwormówce nie masz zawsze drogi prostej. Innym rozwiązaniem jest napisanie ruchu z wykrywaniem kolizji, ale to już inna sprawa, ponieważ trzeba zaprogramować całe AI.
P-2408
DejaVu
» 2008-11-02 14:11:03
Możesz zrobić np. coś takiego:
C/C++
struct SPotworek
{
    int kierunek;
    int czas;
    int uruchomNaCzas;
    double x;
    double y;
    double predkosc;
};

void InicjujPotworka( SPotworek & sPotworek, double x, double y, double predkosc )
{
    sPotworek.kierunek = 0;
    sPotworek.czas = 0;
    sPotworek.uruchomNaCzas = 0;
    sPotworek.x = x;
    sPotworek.y = y;
    sPotworek.predkosc = predkosc;
}

void RuszajPotworka( SPotworek & sPotworek )
{
    sPotworek.czas++;
    switch( sPotworek.kierunek )
    {
    case 1: //lewo
        sPotworek.x += sPotworek.predkosc;
        break;
    case 2: //prawo
        sPotworek.x -= sPotworek.predkosc;
        break;
    default: //nie rusza sie
        break;
    } //switch
   
    if( sPotworek.czas >= sPotworek.uruchomNaCzas )
    {
        sPotworek.kierunek = rand() % 3;
        sPotworek.czas = 0;
        sPotworek.uruchomNaCzas = rand() % 50 + 10;
    } //if
}
//...
int main()
{
    SPotworek stworek[ 10 ];
    InicjujPotworka( stworek[ 0 ], 320, 400, 1.5 );
    while(...)
    {
        RuszajPotworka( stworek[ 0 ] );
    } //while
    return 0;
}
P-2409
Artras
Temat założony przez niniejszego użytkownika
» 2008-11-02 14:25:46
wielkie dzięki. Troszkę przeprogramuje i będzie super ;] dokładnie oto mi chodziło.

Jeszcze jedno pytanie. Jak algorytm powinno mieć strzelanie? Próbowałem napisać tak:
po naciśnięciu np 'z' pokaz bitmapę z pociskiem, jeżeli bitmapa równa ludzik.x+30 usuń bitmapę. Tylko że pocisk się pojawiał wyłącznie podczas trzymania 'z'.

C/C++
pociskx = ludekx;
pocisky = ludeky;
int zmienna = pociskx + 30;

if( key[ KEY_Z ] )
{
    draw_sprite( bufor, ludek5, ludekx, ludeky );
    draw_sprite( bufor, pocisk, pociskx, pocisky );
    pociskx++;
   
    if( pociskx == zmienna )
    {
        // tutaj tez nie wiem co wstawić żeby obrazek znikał
    }
}


przepraszam za nieczytelność tego kodu ale nie wiem jak wstawić to w ramce j.w.
P-2411
« 1 » 2
  Strona 1 z 2 Następna strona