Námořní bitva Gymnázium, Praha 6, Arabská 14 předmět Programování, vyučující Tomáš Obdržálek dokumentace ročníkového projektu Otto Vodvářka, 1E květen 2014
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. V Dolních Břežanech dne 10. května 2014
1
Anotace Cílem projektu byl vývoj hry Námořní bitva. Dva hráči si na začátku hry zvolí umístění jejich 5 lodí na hrací ploše 10x10 a střídavě se snaží zničit soupeřovi lodě. Aplikace je vyvinuta pro osobní počítače, je graficky zpracována a umožňuje hru pro dva hráče (není možné hrát proti počítači). Aim of the project was development of a game The Naval battle. In the beginning two players select positions of theirs 5 ships on playing area 10x10 and they are trying alternately destroy opponent’s ships. The application is developed for personal computers, it is graphically designed and allows game for 2 players (it is not possible to play against computer).
Zadaní Funkce
na začátku si oba hráči zvolí umístění jejich 5 lodí (svisle nebo vodorovně) a zvolí si jméno zkontroluje se počet lodí hráč klikne na jedno z políček, označí se, zda se trefil nebo minul program sám pozná, kdy a jaký hráč vyhrál program JAVA
Bonus
pokročilá kontrola pozice lodí počáteční menu nastavení
2
Namorní bitva Pravidla
hraje se na ploše 10x10 na začátku si hráči zvolí pozice lodí různých velikostí lodě se nesmí dotýkat plochami každý hráč má na jedno kolo pouze 1 pokus pokud se trefí, políčko se změní na červenou barvu, pokud mine, změní se na zelenou hráč vítězí, pokud zničí všechny soupeřovi lodě
Typy lodí Křižník Člun
Ponorka
Letadlová loď
Instalace a ovládání hry Hra se ovládá pomocí myši a klávesnice. Hru není možné ovládat přes dotykový displej. Spustitelný JAR soubor se nachází v podsložce projektu Namorni_Bitva pojmenovanou dist. Spustíte dvojitým klinutím myši. Pokud se soubor nespustí, tak zkontrolujte, zda máte na počítači nainstalovanou Javu. Pokud se soubor nespustí, přestože máte Javu nainstalovanou, tak zkuste do příkazového řádku napsat tento příkaz: java –jar nazevSouboruJAR.jar
Datové struktury V projektu jsem se pokoušel co nejvíce oddělit grafické a logické vrstvy. Pro menu a hrací plochu jsem vytvořil třídy typu JFrame a pro okna na rozmístění lodí a nastavení třídy typu JDialog. Dále jsem vytvořil třídy Lode, Hrac, Plocha a Platno. Třida Lode má pouze statické atributy počtu lodí daného typu, protože počet lodí není stálý, ale uživatel ho může 3
v nastavení změnit. Také obsahuje pár metod pro kontrolu pozic (viz. Kontrola pozic). Třída Hrac obsahuje pouze vlastnosti hráče. Třída Platno obsahuje metodu paintComponent, která vykresluje plochu, kterou dostane třída Platno v konstruktoru. Ve třídě Plocha je většina logické vrstvy jako např. vyhodnocení kliknutí.
Kontrola pozic Kontrola pozic pro mě byla nejobtížnější věcí na tomto projektu. Jelikož jsem pozice lodí měl uložené v poli, tak jsem si toto pole naklonoval do nového, protože ho potřebuji upravovat. Poté všechny procesy jsem dělal v tomto poli. Nejdříve jsem musel dvojicí for cyklů najít vždy počáteční část lodi. Poté jsem zjistil, jakým směrem tato loď vede. Poté jsem volal metody, které měly v parametru souřadnice počátku lodi, typ lodi a její směr. Metoda vracela true nebo false, pokud se tam loď daného typu opravdu nacházela. Pokud metoda vrátila true, tak se zavolala metoda, která vracela pole tak, aby program věděl, že tu loď už má označenou.
Grafické zpracování Pro grafickou část projektu jsem použil technologii Swing. Rozmístění tlačítek, velikost okna atd. jsem dělal v grafickém návrháři, se kterým jsem se naučil pracovat, protože mi to přijde mnohem praktičtější než vše dělat ručně. Hrací plocha je tvořena JPanelem, na který se vykresluje 10x10 čtverců.
Řešené problémy Součásti projektu byly samozřejmě i problémy. Velký problém mám s vykreslováním na JPanel. Zvláštností je, že tento problém na nějakých počítačích z neznámého důvodu nemám. Vždy když na JPanel kliknu, tak se velmi zvláštně rozmaže. Bohužel tento problém se mi nepodařilo vyřešit. Před kliknutím:
Po kliknutí:
4
Další problém jsem měl při klonování pole. Zkoušel jsem jednoduše tento kód: int[][] pole1 = pole2; Tento kód nefungoval, což bylo celkem pochopitelné, protože pole1 odkazovalo na pole 2. Poté jsem použil metodu clone: int[][] pole1 = pole2.clone(); Z mě neznámých důvodů tento kód pořád nefungoval, tak jsem byl nucen klonování pole udělat ručně: for (int i = 0; i < pole1.length; i++) { for (int j = 0; j < pole1[0].length; j++){ pole1[i][j] = pole2[i][j]; } }
Zaver Tato ročníková práce byla moje první větší práce z programování a jsem s ní velice spokojen. Ze začátku jsem si moc nevěřil, takže jsem si do zadání dal lehké věci, ale během projektu jsem zjistil, že na tom nejsem zas tak špatně, takže jsem si trochu ztížil zadání a přidal pár bonusů. Také jsem velmi rád, že se mi podařilo splnit všechny bonusy. Tato práce mě velice bavila a rozhodně se budu pokoušet programovat i další hry.
5