Gymnázium, Praha 6, Arabská 16 předmět Programování, vyučující Tomáš Obdržálek Lodě Dokumentace ročníkového projektu Martin Karlík, 1E 17.5.2014
Anotace In this school year we had to chose some year project. So I chose a clasic table game battleships but I make some upgrades. You do not need pencil or paper just your computer or notebook. In my version of battleships you can play with your friend online. By making this project I learn lots of usefull things like online communication to the server. I would like you to play this game and have a fun with it.
Prohášení Prohlašuji, že jsem jediným autorem tohoto projektu, všechny citace jsou řádně označené a všechna použitá literatura a další zdroje jsou v práci uvedené. Tímto dle zákona 121/2000 Sb. (tzv. Autorský zákon) ve znění pozdějších předpisů uděluji bezúplatně škole Gymnázium, Praha 6, Arabská 14 oprávnění k výkonu práva na rozmnožování díla (§ 13) a práva na sdělování díla veřejnosti (§ 18) na dobu časově neomezenou a bez omezení územního rozsahu.
1
Zadání projektu Dva hráči (každý na svém počítači) umístí na hrací pole lodě. Navzájem neznají jejich pozice. Střídají se po jednom výstřelu. Cílem je zničit soupeřovi lodě. * Počítače budou komunikovat přes server (není součástí programu) * Program hráči zobrazuje předchozí úspěšné i neúspěšné výstřely * Program určí vítěze * Nekontroluje správné umístění lodí * Statistiky výstřelů/zásahů Zpracování: Grafické Jazyk: Java Bonus: * Program generuje lodě sám, uživatel pouze volí jejich pozici
2
Pravidla hry Lodě je hra pro dva hráče. Hraje se na čtvercovém hracím poli 10 x 10. Cílem hry je zlikvidovat všechny soupeřovy lodě. Hra začíná ve výchozí situaci, kdy musí každý hráč umístit všechny své lodě na hrací pole. Oba hráči by se měli shodovat v typu i počtu nasazených lodí. Zde je příklad některých typů lodí.
Je možné volit i jiné kombinace. Na hracím poli by se jednotlivé lodě neměli navzájem dotýkat a to ani rohy. Hráč, který je na tahu, zvolí pozici, na kterou chce vystřelit. Hráč si zaznamená výsledek (v našem programu za vás toto učiní počítač) a na tahu je jeho protihráč. V případě zásahu není loď potopena do té doby dokud nejsou zasaženy všechny její části, v takovém případě by měl hráč oznámit soupeří, že byla jedna z jeho lodí potopena. Hra končí když jeden z hráčů přijde o všechny své lodě.
Instalace hry Hra je velice jednoduchá a k úspěšnému spuštení je zapotřebí pouze program samotný a přístup k internetu. K ovládání stačí pouze myš. Program se nepřispůsobuje velikosti obrazovky, proto je dobré mít HD monitor, aby se mohl celý program bez problémů zobrazit.
Vývoj hry Úvod Na začátku jsem chtěl jako svojí ročníkovou práci naprogramovat lodě, které mohou hrát proti sobě dva lidé na různých počítačích. Komunikaci jsem chtěl vyřešit uložením souřadnic do textového souboru, do společného uložného prostoru pro oba počítače a jeho následným načetním protihráčem. Tuto moznast mi však vedoucí práce rozmluvil a nabídl mi pomoc při programování komunikace přes server. Tento server poskytuje Gymnázium Arabská.
Grafické zpracování První fáze byla jednoduchá, využij jsem JPanelu k vykreslení hracího pole. Jediná potíž nastala při převodu systému souřadnic, který hraci pole rozděloval po jednotlivých pixelech na souřadnice vhodné pro umísteni lodí např. místo [1586, 982] použít vhodnejší souřadnice [4, 6]. Tento problém jsem vyřešíl poměrně jednoduše, a to rovnicí: int x = (e.getX() - 100) / 40; V rovnici se int x rovná požadované souřadnici, metoda e.getX() vrátí souřadnice v pixelech, od kterých je odečten okraj (- 100) a jsou vyděleny 40 (šířka jednoho čtverečku 3
na hracím poli v pixelech). Takto získané souřadnice se hned uloží do pole[], kde jsou jim přideleny indexy. Potom jsou lodě pomocí funkce Graphics2D vykresleny na příslušné pozice. Pozice lodí je nutné uchovávat pro pozdější ověřování zásahů. Na stejném principu jsou vykreslovány i střely, úspěšné i neůspěšné. Střěly jsou nejprve roztříděny podle úspěšnosti, potom jsou jejich pozice uloženy do polí[], podobně jako lodě.
4
Online komunikace Oba počítače komunikují pomocí jednoduchých dotazů na server. Hned po spuštení programu se počítač dotáže serveru na své číslo. Toto je nejdůležitější část hry, podle čísla se totiž odvíjí nasledná komunikace i pořadí obou hráčů. Na své číslo se program dotáže pomocí následujícího příkazu: komunikace = new Komunikace(); // login if (komunikace.getCisloHrace() == 1) { tah = true; } Tento příkaz zajistí, že pokud bylo hráči přideleno číslo 1, začíná hru. Metoda getCisloHrace() se pomocí tohoto odkazu dotáže serveru: http://lode.svs.gyarab.cz/?command=login Hráč číslo jedna je tedy na tahu, vybere pozici, na kterou chce střílet, souřadníce se uloží, jak bylo zmíněno vyše, a odešlou se pomoci tohoto odkazu: http://lode.svs.gyarab.cz/?command=send&recipient=1message=X,Y. Recipient=1, tato část určuje pro kterého z hráčů je zpráva určena, message=X,Y odesle zpravu (v našem případě souřadnice) pro zvoleného hráče a hned se přepne do stavu, kdy čeká na odpoveď. Mezi tím druhy hráč pomocí odkazu: http://lode.svs.gyarab.cz/? command=get&recipient=1 stále zkouší, zda pro něj není na serveru zpráva. Pokud na serveru žádná zpráva není, server odpovídá „NO MESSAGE“. Pokud na serveru zpráva je, tak pomoci for cyklu projde pole[], ve kterém jsou uloženy souřadníce všech lodí a vyhodnotí, zda se souřadnice nejaké lodě shodují se souřadnicemi střely. Pokud ano, odešle pomocí odkazu na zasílání zpráv, zmíněného v minulém odstavci, zprávu „zásah“ a zasažená část lodi zmizí z jeho hracího pole. Pokud ne, odešle zprávu „vedle“ a do jeho hracího pole je střela modře zakreslena. První hráč vyhodnotí zprávu a podle výsledku zakreslí střelu červeně, pokud byla úspěšná nebo modře, pokud minula. Potom se hráči vystřídají, střílí protihráč. Na začátku každé metody (tah() nebo cekaniNaTah()) je vložena podmínka, která kontroluje zda mají oba hráči alespoň jednu loď. Pokud ne, hra je ukončena a program oběma hráčům oznámí vítěze.
Pomocné informace a proměnné Hra svému hráčí zobrazuje několik pomocných údajů. Ke každému údaji se váže jedna proměnná. Například v momentě, kdy hra odesílá souřadnice střely, tak se automaticky přičte jedna do proměnné, která počíta celkový počet střel. Nebo proměnná s názvem mojeLode počítá počet mých zbývajícich lodí, je ověřována v momentě, kdy program dostane odpověď ze serveru se souřadnicemi střely. Pokud byla střela úspěšná, automaticky se odečte jedna. V programu je mnoho dalších proměnných, například s počtem nepřátelských lodí. Všechny pomocné informace jsou opět vypisovány pomoci Graprics2D.
5
Závěr Doufám, že zadání ročníkového projektu se mi podařilo splnit. Práce na projektu byla pro mě velmi přínosná,neboť jsem se na celém projektu i spoustu užitečných věcí naučil. V budoucnu se mi určitě bude hodit komunikace přes server. Také jsem zjistil, jak je při programování důležidté vše si třídit do tříd a metod a také dávat proměnným správné názvy, prostě jak je důležité udržovat si v kódu pořádek. Protože jinak se člověk v kódu ztratí a když pak udělá chybu strávi zbytečně dlouhou dobu jejím hledáním. Taky bch chtěl poděkovat vedoucímu projektu a našemu učiteli na programování, že mi tolik pomohl s online komunikaci.
6