Algorytmy Użyte W Grze

Algorytm generowania labiryntu

Algorytm generowania labiryntu w najprostrzym rozważaniu, startuje od wejścia i generuje losowe ścieżki do krańców ekranu. Pseudokod przedstawiony poniżej prezentuje podejści. Jest ono zbliżone do wypełniania przez przesiewanie. W ten sposób powstaje struktura nieregularnych przejść, które prowadzą do (od) punktu startowego. Punkt startowy można uznać jako środek ekranu, w ten sposób mamy pewność, że będzie conajmniej jedne punkt zbiegu wszystkich ścieżek, więc pozostałe punkty (startowe dla graczy, strategiczne, bonusy) można wybrać bez obaw, że nie będą miały one połączeń między sobą. Tak samo jak przy wypełnianiu przez przesiewanie algorytm ten prowadzi do przepełnienia stosu, dlatego też stosuje się stos pomocniczy.

przechodz_komorki( x, y )
{
	jesli ( odwiedzona( x, y ) ) return;
	tworz_losowa_permutacje( p )_zbioru_0_3
	w_kolejnosci_wyznaczonej_przez_p_wolaj
	{
		przechodz_komorki( x-1, y );
		przechodz_komorki( x+1, y );
		przechodz_komorki( x, y-1 );
		przechodz_komorki( x, y+1 );
	}
}

Algorytm pouraszania się robaków - klonów

W założeniach opisaliśmy, że robaki mogą natrafić na zdolność „stwórz klona”. Po najściu na tą zdąlność pojawia się robak - klon. Robak ten kieruje się wyłącznie instynktem, ma wstępnie zakrytą całą planszę i przemieszcza się po niej w celu dotarcia do celów. Robak ten jednak wykazuje zdolność do trafnego ocenienienia odległości od celu i wyboru najkrótszej ścieżki.

W tym celu robak z odkrytej plaszy buduje własny model (graf nieskierowany z wagami). Wagami w grafie są odległości między punktami. Wierzchołek grafu natomiast to punkt, z którego występują więcej niż dwie drogi (rozgałęzienie) lub punkt do którego prowadzi dokładnie jedna droga, albo punkt strategiczny.

W celu wyznaczenia najkrótrzej ścieżki, robak wykorzystuje algorytm Dijstry, który tworzy dla danego grafu tablicę d[v] najkrótrzych odległości z punktu startoweog do punktu 'v'. Następnie wykorzystuje prosty algorytm wyznaczania najkrótszej drogi w grafie dla znanej odległości opisany poniżej.

odloz_na_stos( s, wierzch_koncowy );
v = wierzch_koncowy
while ( v != wierzch_start ) 
{
	u = znajdz_wierzch ( v ); // taki, że D(v)=D(u)+A[u,v]
	odloz_na_stos( s, u );
	v = u;
}

Robak po przejściu do kolejnego węzła sprawdza, czy nie został odsłonięty nowy węzeł (w przypadku szczególnym cel) i wylicza od nowa najkrótrze ścieżki z nowym punktem startowym. Algorytm ten w połączeniu z Dijstrą daje złożoność O( V^2 ), co jest niską złożonością, dlatego nie jest krytyczne ponowne wyznaczanie tych wartości.

Przypadek spotkanie człowieka i karalucha

Człowiek jest postacią kierowana wyłącznie przez gracza (opcja AI być może pojawi się późniejszych wersjach programu). Ruch odbywa się poprzez naciskanie przycisków ( strzałki). Umiejętności przyporządkowane są na stałe pod odpowiadające im skróty klawiszowe. Brak możliwość przechodzenia przez ściany labiryntu. To samo dotyczy postaci karalucha.

W momencie gdy student nawiąże kontakt z karaluchem zarówno jedne jak i drugi są wstanie użyć swoich specjalnych zdolności. Student może za pomoc swojego arsenału pozbawić karalucha punktów życia lub gdy ten ma ich dostatecznie mało doprowadzić do jego śmierci. Karaluch posiada tylko jedną ofensywną zdolność za pomocą której jest wstanie otruć człowieka co daje my chwile na wycofanie się w bezpieczne miejsce. Pozostałe dwie umiejętności pozwalają na bezkarną ucieczkę przed studentem. Uwaga w przypadku gdy dojdzie do kontaktu (student najdzie na pole na którym znajduje się karaluch) postaci student traci punkty życia.

Każda zdolność jest jednorazowa. Po tym gdy jej użyjemy możemy ją uzupełnić gdy w labiryncie odnajdziemy pole gdzie ona się znajduje (umiejętności pojawiają się losowo). W momencie gdy na zajętym przez na polu labiryntu znajduje się umiejętność gracza przeciwnego niszczymy ją.

W przypadku gdy klon czyli prysak wejdzie na pole na którym znajduje się student zostaje on automatycznie zdeptany przez studenta. Klon nie może zbierać umiejętności.

Bibliografia

pl/projects/theprusak/alg.txt · ostatnio zmienione: 2010/07/25 18:16 (edycja zewnętrzna)
Recent changes RSS feed Creative Commons License Donate Driven by DokuWiki