Dokumentacia k zapoctaku Rybycky
menu
Zadanie
Rybičky
Jedná se o počítačovou hru. V bludišti se pohybuje potápěč ovládaný klávesnicí, který hledá a sbírá poklady. Každý nalezený poklad odnáší do skrýše v jednom místě herního pole a vrací se pro další. Kromě potápěče se v bludišti vyskytují i velmi hladové piraně. Pokud spatří potápěče, vydají se za ním, aby ho sežraly. S každým dalším nalezeným pokladem přibyde do hejna jedna piraňa.(az kym ich nebude nejaky max. pocet);
Pirani jsou ovládané počítačovým algoritmem a jejich chování musí vypadat více méně přirozeně. Velikost bludiště a rozmístění překážek v něm je načítáno ze souboru.
Hlavní úkol
Důraz je kladen na algoritmus ovládající hejno piraní. Úkolem je napsat tento algoritmus tak, aby pohyb rybek splňoval následující podmínky:
- Piraně se neustále pohybují, nesmí dojít k jejich zastavení.
- Pohyb piraní je plynulý, nesmí dojít k „zacyklení“, kdy rybka opisuje malé kruhy či jinak vinou chybného algoritmu „zešílí“
- Piraně se vyhýbají překážkám (dá se použít principu odpudivých sil, tj. skládání vektorů sil, jako by rybička a překážka byly souhlasné póly magnetu – rybka plující za překážku ji pak sama obepluje)
- Piraně se nesmí překrývat (dvě ryby na jedno políčko nepatří)
- Piraně „vidí“ do určité vzdálenosti (např. v okruhu pěti políček). V tomto okruhu rozeznávají potápěče, překážky a jiné piraně
- Pokud piraňa spatří potápěče, vydá se za ním
- Pokud vidí jiné pirani, pluje do místa s největší koncentrací rybek - piraně mají tendenci shlukovat se do hejna
- Pokud nevidí potápěče, hejno plave nějakým směrem, nesmí růstat na místě, aby se v něm jen přeskupovaly rybky.
- Hejno se může rozpadnout na více částí, každá může plavat jiným směrem a opět se mohou spojovat.
- Zákaz podvádění:
- V hejnu není žádná vedoucí ryba, která by určovala směr, ani není hejno řízeno nějakým neviditelným prvkem.
- Pokud není potápeč v zorném poli piraní, tyto ho nevidí.
- Piraně nevidí přes překážky.
Výstup
Výstup bude grafický v Turbo Pascalu,
Vyšší levely
Hráč má zbraň, kterou může piraně odhanat .
Hra má mít více levelů.
Hrac nebude vidiet pyrane cez prekazky.
Dátové štruktúry
Herní plán – Bude načítaný zo súboru, a bude reprezentované jednotlivými prekážkami
Prekážka – typ objekt,
S týmito premennými :
x, y, r : integer; {súradnice prekážky a jej rozmer}
a tieto metódy :
constructor init; {vytvorenie prekážky na zadaných súradniciach a s daným rozmerom}
procedure nakres;
procedure zmaž;
Hráč : - typ objekt
Premenne :
x, y, rx, ry : real; {x, y :súradnice, rx, ry: zložky aktuálnej rýchlosti }
zivot : byte {energia}
poklad : boolean;
harpuna : boolean; {či ma hráč zbraň}
a metódy :
constructor init;
procedure nakres;
procedure zmaz;
procedure pohyb; {zisťovanie klávesnice, a nastavenie potrebných premenných}
procedure pohni; {spočítanie nového vektora rýchlosti, podľa vzdialenosti od prekážky, odrazenie od prekazky alebo ryby a podľa toho odoberie energiu, energia sa bude odoberať po „kvantách“ v určitých časových intervaloch }
}
Ryba : -typ objekt
Premenne :
X, y, rx, ry : real
Vidno : boolean {či je rybu vidno,}
Metody
Constructor init
Procedure nakres
Procedure zmaz
Procedure pohyb {analyzuje pohyb rybičky..na zaklade hraca, prekazok a ostatnych ryb}
Procedure pohni {zráta pohybový vektor}
Function vidi(x, y: real; vzd: integer, odtlačiť :boolean, vzd2:integer): boolean {vráti true ak je bod [x,y] blyzsie ako vzd, ak skúmam prekážku alebo inú rybu tak použijem princíp magnetov aby do seba nenarazili, vzd2 je kritická vzdialenosť. inak sa testuje s hracom a podľa vzdialenosti skryje alebo ukáže rybu.. vzd2 je potom viditeľnosť hráča}
Parametry viditelnosti – v konstantách.
Poklad, zbran : -typ object
Premenne :
X, y : integer
Metody
Constructor init
Procedure nakres
Procedure zmaž
Procedure pohni {zráta pohybový vektor, t.j. ak hráč zbraň odhodil tak je to padanie..}
Strela -potomok zbran
Procedure pohni {pohne nábojom a zisti čí nezasiahol rybu ak áno, zmaže rybu na jaj miesto tam hodí poslednú rybu a zmenší poč , rýb o jeden}
Algoritmy
Hlavní cyklus:
1) Zobraz menu
2) Vyhodnoť voľbu
3) Preveď voľbu (skoč na cyklus hry, zobraz nápovedu, nastav Max počet rybičiek, ukončí program)
Výnimky:
2) zla voľba: skoč na 1
Cyklus hry:
0) inicializácia : nakresli prekážky do hracej plochy..
1) Vyhodnoť ťah hráča
2) Preveď pohyb hráča
3) Vyhodnoť pohyb každej rybičky
o Zisti pre každú rybičku, ktoré rybičky vidí, zaradí každú do hejna, podľa toho sa vydá do toho najväčšieho.
o ak vidí hráča tak zráta vektor pohybu a sa vydá za nim
o Preveď pohyb ryby.
4) Opakuj 1 kým nieje koniec alebo esc;
Výjimky:
1) kláves Esc: spýtaj sa, či chce hráč naozaj skončiť. Pokiaľ áno, vráť sa do hlavného menu. Pokiaľ ne, ako by sa nič nestalo
2) Ak hráč vstúpil na začiatok s pokladom, zväčši skóre a pridaj novu rybu… Ak hráč vstúpil na rybu, odrátaj energiu, ak je nulová, prehraj animáciu umierania vypíš skóre, spýtaj sa či chceš hrať znova
Ak hráč vstúpil na políčko zo zbraňou a nemá zbraň, pridá zbraň hráčovi..
Zistovanie hejna : hejno si definujme tak že je to zoskupenie rybičiek ktoré žiadne dve niesu ďalej ako nejaká vzdialenosť (MAXHEJNO).
Zisťujem to tým, že pre každú rybičku, ktorú vidím prechádzam všetky rybičky , ktoré som už videl. Na začiatku je ryba vo vlastnom hegne. Zisťujem čí nieje od nejakej blizsie ako MAXHEJNO, ak áno a ešte je „len“ vo vlastnom hejne priradím ju do takého istého hejna. Ak je už v nejakom hejne tak hejna „zmergujem“ .
Zisťovanie (ne)viditeľnosti : je jednoduché, pre každú rybu prechádzam všetky prekážky, či neprekrívajú spojnicu medzi rybami (alebo rybou a hracom), kedze prekážky sú kruhové tak nám postačí vzorec na vzdialenosť bodu od priamky,
Dá sa odvodiť :
D = abs((x2-x1)*(y1-y0)-(x1-x0)*(y2-y1))/(odmocnina(x2-x1)2+(y2-y1)2)
Pri tomto prechode zratávam aj odpudivé sily od prekážok.
Ostatne algoritmy sú obyčajné tudiz nezajimave .