Gymnázium, Praha 6, Arabská 14
!
Loydova patnáctka Dokumentace ročníkového projektu Předmět: Programování Vyučující: Ing. Tomáš Obdržálek Třída: 1.E
! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
Jan Zaoral květen 2014
1. Úvod
!
1.1. Anotace
Česky Cílem tohoto projektu bylo vytvořit hlavolam (hru) “Loydova patnáctka”. Aplikace je vytvořena v programovacím jazyce Java s využitím vývojivého prostředí NetBeans. English The main goal of this project was to create a puzzle “Loyd’s 15” also known as “15 Puzzle”. This application was created in Java programming language using NetBeans development suit.
! !
1.2. Prohláš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.3. Zadání projektu 1.3.1. Předem schválené vlastnosti
• Vytvoření aplikace na principu hry “Loydova patnáctka”. • V aplikaci budou kameny označené čísly. • Aplikace bude zaznamenávat počet tahů s kameny, aby se na konci mohl vypsat celkový počet tahů ve hře.
! !
1.3.2. Bonusové vlastnosti
• V grafickém rozhraní se nachází tlačítko “Zamíchat”, které zamíchá kameny (dále jako hrací tlačítka) pro začátek hry. • Vedle tlačítka na zamíchaní hracích tlačítek se také nachází krokoměr, který ukazuje aktuální počet tahů. • Při každém stisknutí tlačítka na zamíchání se automaticky vynuluje počet kroků, aby hráči neukazoval jejich nesprávný počet (např. z předchozích her). • Na konci hry se objeví okno s gratulací k dokončení hry a s finálním počtem kroků.
! !
DOKUMENTACE ROČNÍKOVÉHO PROJEKTU
(2
! !
2. Hra
!
2.1. Historie a princip hry
Loydova patnáctka je jednoduchý hlavolam, ve kterém musí hráč přesouvat hrací tlačítka ve čtvercovém poli (4×4) a dostat je do správné pozice. Hrací tlačítka jsou označena čísly 1-15 a pomocí jednoho volného místa se musí všechna složit do správného pořadí. Hlavolam se považuje za vyřešený v momentě, kdy jsou herní tlačítka seřazená vzestupně od nejmenšího po největší číslo. V počítačové verzi to není možné, ale ve fyzické verzi hlavolamu je zakázáno vyndávat a přemisťovat kameny na jiná místa v herním poli. Pokud by tak někdo učinil, celá hra by byla “neplatná”. Autorem tohoto hlavolamu není Sam Loyd, po kterém je hra pojmenována, protože byl jejím hlavním popularizátorem. Ve hlavolamu existují různé kombinace herních tlačítek, ze kterých se nelze dostat do finální složené podoby. Loyd nabídl odměnu 1000 dolarů tomu, kdo jako první nabídne řešení těchto pozic. Díky této nabídce na hře velice zbohatl a zároveň hru velice proslavil. Navíc odměnu nikomu dávat nemusel, protože sám věděl, že tyto pozice doopravdy vyřešit nejdou.
! !
3. Aplikace Výsledná aplikace vypadá jako na následujícím obrázku.
Tlačítko ”Zamíchat”
Herní tlačítko
Hrací pole
Krokoměr
! ! DOKUMENTACE ROČNÍKOVÉHO PROJEKTU
(3
! !
3.1. Spuštění aplikace
Aplikaci je vytvořena do spustitelného balíčku typu JAR, který lze spustit na počítačích s nainstalovaným prostředím Java. Žádný instalační balíček není potřeba.
! !
3.2. Grafické rozhraní
Pro vytvoření grafického rozhraní mojí aplikace jsem do svého projektu naimportoval knihovnu Swing. Hned na první pohled jsou v okně aplikace vidět 4 hlavní prvky: 1. pole, ve kterém se nachází herní tlačítka, 2. herní tlačítka, 3. tlačítko “Zamíchat”,
!
4. tzv. krokoměr, který počítá počet kroků s herními tlačítky.
První věc, kterou jsem udělal, byla třída s názvem Tlacitko s následujícími vlastnostmi a metodami: • int radek: určuje řádek
v herním poli, ve kterém se bude herní tlačítko nacházet.
• int sloupec: určuje sloupec
v herním poli, ve kterém se bude herní tlačítko nacházet.
• int velikost: určuje šířku a výšku • presun: metoda zajišťující
tlačítka.
přesunutí tlačítka na pozici určenou předanými parametry.
(konstruktor): úvodní nastavení tlačítka, tzn. jeho popisu, vzhledu a úmístění ve hracím poli.
• Tlacitko
!
Takto speciálně nadefinované tlačítko má jednotné vlastnosti a metody oproti ostatním ovládacím prvkům na formuláři, pro které jsem nemusel vytvářet další speciální třídy.
!
Po vytvoření třídy Tlacitko bylo zapotřebí vytvořit okno, ve kterém se budou nacházet všechna herní tlačítka. V tomto kroku bylo potřeba nastavit rozměry okna, které jsem odvodil z rozměrů tlačítek. Velikost tlačítka jsem musel ale nejprve otestovat. Poprvé jsem zkusil tlačítko o velikosti 50x50 bodů. To se mi zdálo dost malé, a proto jsem na druhý pokus vytvořil tlačítko 100x100 bodů. Tato velikost se mi zdála být dostačující. Jelikož jsou ve hře tlačítka 4 v každém řádku a také 4 v každém sloupci, vypočítal jsem si, že základní velikost okna pro samotné hrací pole bude 400x400 bodů. Tyto rozměry jsem také zadal do kódu pro vytvoření okna. Protože ve spodní části formuláře jsou i další objekty jako je krokoměr a tlačítko na míchání, musel jsem zvětšit výšku okna.
DOKUMENTACE ROČNÍKOVÉHO PROJEKTU
(4
Po vykreslení hracího pole je potřeba umístit 15 herních tlačítek. Ta jsou vytvořena a umístěna na hrací ploše pomocí dvou cyklů, které určují zároveň pozici řádku a sloupce. Odkazy na jednotlivé objekty tlačítek jsou umístěny v kolekci tlacitka typu HashMap. Když je vytvořeno hrací pole s herními tlačítky, musí se vytvořit tlačítko “Zamíchat”, které slouží k náhodnému rozmístění kamenů na začátku hry. Jak už jsem výše zmínil, není možné tlačítka rozházet zcela náhodně, protože by se mohla dostat do postavení, kdy není možné hlavolam vyřešit. Pro zamíchání tlačítek jsem tedy použil tento postup: 1. najdu volnou pozici v hracím poli, 2. náhodně určím směr, ze kterého se tlačítko posune, 3. otestuji, jestli ve zvoleném směru je tlačítko a není konec hracího pole, 4. přesunu požadované tlačítko. Tento postup se opakuje tak dlouho, kolikrát je to nastaveno v cyklu. Přednastavených je 100 opakování. Tímto je vyřešen problém s tím, aby se dalo postavení vždy vyřešit. U každého přesunu je nutné otestovat, aby se to tlačítko nedostalo mimo hrací pole.
! !
3.3. Základní metody
V tomto odstavci uvedu důležité metody, které jsou v aplikaci použity a přidám k nim jejich význam: • presun - zajišťuje přesun • jeVolne - zkontroluje,
hracího tlačítka,
zda je pozice volná,
• rozhazejTlacitka - metoda,
která po svém zavolání prohází tlačítka po hrací ploše,
• addComponentsToPane - slouží • kontrola - kontroluje, • main - vytváří
pro vykreslení objektů na formuláři,
zda jsou herní tlačítka na správném místě,
se v něm formulář a spouští se zde aplikace.
! !
3.4. Ovládání
Ovládání aplikace je velice jednoduché, protože ke hraní není potřeba nic jiného než myš. Klávesnici aplikace nevyžaduje a ani nepodporuje.
! !
3.5. Problémy
Jeden z hlavních problémů byl jak vytvořit okno, ve kterém budou umístěna tlačítka, protože jsme v hodinách skoro vůbec neprobírali grafickou stránku programování. Musel jsem si proto nastudovat, jak vytvořit formulář, do kterého dám tlačítka a další objekty. Další problém nastal, když jsem potřeboval tlačítka rozpohybovat, tzn. aby reagovaly na kliknutí tlačítka myši. Na internetu jsem našel návod na vytvoření třídy ActionListener. Ta
DOKUMENTACE ROČNÍKOVÉHO PROJEKTU
(5
slouží ke zpracování událostí, které se dějí s objekty. Když jsem si vytvořil tuto třídu, musel jsem ještě nastavit, jak budou reagovat objekty, na které se právě klikne (herní tlačítka a tlačítko na zamíchání).
! !
3.6. Možná vylepšení
Zde uvádím několik námětů, se kterými by se aplikace dala ještě vylepšit: • Aplikace by mohla obsahovat vlastnost s požadovanými rozměry, takže by si hráč mohl nastavit, jakou velikost hracího pole chce. Čím větší by pole bylo, tím déle by trvalo hru vyřešit. Od těchto rozměrů by se také automaticky určily rozměry formuláře. • Hráč by si mohl do hry naimportovat obrázek, který by se automaticky “rozkouskoval” a rozházel. Úkol by potom byl jasný: složit obrázek do původní podoby. • Při míchání tlačítek by bylo možné zajistit, aby se v rámci cyklu nevracelo tlačítko na pozici, ze které se předtím přesunulo. Díky tomu by bylo míchání pečlivější. • Pro uložení odkazů na objekty by bylo také možné použít jiné druhy kolekcí (např. ArrayList). Zvolil jsem HashMap v rámci procvičení aktuálně probíraného učiva a zároveň se mi líbila možnost procházet jednoduše kolekci pomocí cyklu for-each.
!
4. Vyhodnocení, závěr Tuto ročníkovou práci považuji za úspěšně dokončenou a mám z ní dobrý pocit, protože jsem splnil schválené i bonusové zadání, naučil jsem se v Javě novým věcem a procvičil jsem si látku, kterou jsme se za celý školní rok naučili.
! !
4.1. Zdroje
• Popis hlavolamu: http://cs.wikipedia.org/wiki/Patn%C3%A1ctka • O Samu Loydovi: http://cs.wikipedia.org/wiki/Sam_Loyd • Dokumentace Java: http://docs.oracle.com/javase/7/docs/api/ • Dokumentace NetBeans: https://netbeans.org/kb/ • Programátorské diskusní fórum: http://stackoverflow.com/ • Články na internetu ke Swing, Java, ActionListener atd.
DOKUMENTACE ROČNÍKOVÉHO PROJEKTU
(6