Dokumentace bakalářské práce
Transkript
České vysoké učení technické v Praze Fakulta elektrotechnická ČVUT FEL katedra počı́tačů Bakalářská práce MahJong Malinský Radek Vedoucí práce: Ing. Miroslav Balík, Ph.D. Studijní program: Elektrotechnika a informatika, strukturovaný bakalářský Obor: Výpočetní technika červen 2007 Poděkování Velmi rád bych poděkoval a vyslovil uznání všem, kteří se podíleli na vzniku této práce. Především vedoucímu bakalářské práce Ing. Miroslavu Balíkovi, Ph.D., za trpělivost a pevné nervy při vedení a poskytování praktických rad. Dále bych rád poděkoval mé rodině a přátelům, kteří mě podporovali a neustále přicházeli s novými nápady na zlepšení. ii Prohlášení Prohlašuji, že jsem svou bakalářskou práci vypracoval samostatně a použil jsem pouze podklady uvedené v přiloženém seznamu. Nemám závažný důvod proti užití tohoto školního díla ve smyslu §60 Zákona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů (autorský zákon). V Praze dne 1. 6. 2007 ........................................................................... iii Abstract The bachelor thesis discusses the creation software interface for playing the MahJong game. The main part describes design and implementation of the rules for the tiles group generator. Next part is focused on creation the tiles layout editor. The implementation is created in Java object-oriented language. Abstrakt Tato bakalářská práce se zabývá tvorbou softwarového rozhraní pro hraní hry MahJong. Hlavní část popisuje návrh a implementaci pravidel pro generátor nových rozložení kostek. Další část je zaměřena na tvorbu editoru rozvržení kostek. Implementace je provedena v objektově orientovaném jazyce Java. iv Obsah Seznam obrázků vii Seznam tabulek viii 1 Úvod 1.1 Historie hry MahJong . . . . . . . . 1.1.1 Počátky v Číně . . . . . . . 1.1.2 Rozvoj v západním světě . 1.1.3 Aktuální vývoj . . . . . . . 1.1.4 Historie MahJong Solitaire 1.2 Pravidla . . . . . . . . . . . . . . . 1.2.1 Jak hrát . . . . . . . . . . . . 1.2.2 Motivy kostek . . . . . . . . . . . . . . . . 1 1 1 2 2 2 3 3 4 2 Popis problému, specifikace cíle 2.1 Popis řešeného problému . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Vymezení cílů . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 6 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Analýza a návrh řešení 3.1 Výběr implementačního prostředí . . . . . . 3.1.1 Značkovací jazyk XHTML . . . . . . . 3.1.2 Zahrnutí appletu do webové stránky 3.2 Generátor rozložení kostek . . . . . . . . . . 3.2.1 Popis generátoru . . . . . . . . . . . . 3.2.2 Princip funkce generátoru . . . . . . . 3.3 Editor rozvržení kostek . . . . . . . . . . . . . 3.3.1 Popis editoru . . . . . . . . . . . . . . 3.3.2 Pravidla pro tvorbu sestav . . . . . . . 3.4 Řešitel rozložených sestav . . . . . . . . . . . 3.4.1 Popis řešitele . . . . . . . . . . . . . . 3.4.2 Definování složitosti sestav . . . . . . 3.5 Návrh uživatelského prostředí . . . . . . . . 3.5.1 Grafické knihovny AWT a Swing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 7 7 7 9 9 9 12 12 12 13 13 13 13 14 4 Realizace 4.1 Implementace základních objektů . . . . . . . . . . . . . . . . 4.1.1 Reprezentace hrací plochy . . . . . . . . . . . . . . . . 4.1.2 Reprezentace kostky . . . . . . . . . . . . . . . . . . . 4.1.3 Reprezentace posunu kostky . . . . . . . . . . . . . . 4.2 Generátor rozložení kostek . . . . . . . . . . . . . . . . . . . 4.2.1 Vstupní informace . . . . . . . . . . . . . . . . . . . . 4.2.2 Realizace generátoru . . . . . . . . . . . . . . . . . . . 4.2.3 Implementace pravidel . . . . . . . . . . . . . . . . . 4.3 Editor rozvržení kostek . . . . . . . . . . . . . . . . . . . . . . 4.3.1 Realizace editoru . . . . . . . . . . . . . . . . . . . . . 4.3.2 Implementace pravidel . . . . . . . . . . . . . . . . . 4.3.3 Vytvoření řetězce s informacemi o rozmístění kostek 4.4 Uživatelské rozhraní . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 15 15 15 16 16 16 17 17 18 18 19 19 20 v . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4.1 4.4.2 4.4.3 Základní rozvržení . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dvojitý buffering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Grafické zpracování kostek . . . . . . . . . . . . . . . . . . . . . . . . . . 20 20 21 5 Testování 5.1 Průběh testování . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Srovnání s existujícími řešeními . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 23 23 6 Závěr a náměty pokračování práce 25 7 Literatura 26 A Seznam použitých zkratek 27 B Uživatelská příručka B.1 Komu je hra určena . . . . . . B.2 Adresa hry, spuštění hry . . . B.3 Systémové požadavky . . . . B.4 Pravidla hry . . . . . . . . . . B.4.1 Jak hrát . . . . . . . . . B.4.2 Motivy kostek . . . . . B.4.3 Strategie hry . . . . . . B.5 Popis uživatelského prostředí B.5.1 Spuštění appletu . . . B.5.2 Úvodní obrazovka . . B.5.3 Výběr nové hry . . . . B.5.4 Prostředí editoru . . . B.5.5 Prostředí spuštěné hry 28 28 28 28 29 29 30 32 32 32 33 34 35 36 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C Obsah přiloženého CD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 vi Seznam obrázků 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 Kostky blokované zakrytím . . . . . . . Kostky blokované sousedními kostkami Kostky s motivem puntíků . . . . . . . . Kostky s motivem bambusů . . . . . . . Kostky s motivem znaků . . . . . . . . . Kostky s motivem ročních období . . . . Kostky s motivem větrů . . . . . . . . . Kostky s motivem květin . . . . . . . . . Kostky s motivem draků . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 4 4 4 5 5 5 5 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 Chybné rozložení kostek, bez posuvného pravidla . . . Správné rozložení kostek, s posuvným pravidlem . . . Chybné rozložení kostek, bez výměnného pravidla . . Správné rozložení kostek, s výměnným pravidlem . . . Chybné rozložení kostek, bez pravidla extra kostky . . Správné rozložení kostek, s pravidlem extra kostky . . Správné rozložení kostek z různých řádků . . . . . . . Umístění zaměřovacího obdélníku v editoru rozvržení Možnosti rozložení kostek v editoru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 9 10 10 11 11 11 12 13 4.1 4.2 4.3 Posunutí kostky na hrací ploše . . . . . . . . . . . . . . . . . . . . . . . . . . . . Realizace posuvného pravidla pro kostky ležící na různých řádcích . . . . . . . Struktura obrazu se vzhledem všech druhů kostek . . . . . . . . . . . . . . . . . 16 18 22 B.1 B.2 B.3 B.4 B.5 B.6 B.7 B.8 B.9 B.10 B.11 B.12 B.13 B.14 Kostky blokované zakrytím . . . . . . . . . Kostky blokované sousedními kostkami . . Kostky s motivem puntíků . . . . . . . . . . Kostky s motivem bambusů . . . . . . . . . Kostky s motivem znaků . . . . . . . . . . . Kostky s motivem ročních období . . . . . . Kostky s motivem větrů . . . . . . . . . . . Kostky s motivem květin . . . . . . . . . . . Kostky s motivem draků . . . . . . . . . . . Ověřovací certifikát . . . . . . . . . . . . . . Úvodní obrazovka . . . . . . . . . . . . . . Panel s možnostmi rozložení uložených her Prostředí editoru rozvržení kostek . . . . . Prostředí nové hry . . . . . . . . . . . . . . 29 29 30 30 30 31 31 31 31 32 33 34 35 36 vii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Seznam tabulek 4.1 4.2 Umístění kostky na hrací ploše v závislosti na pozici ve vstupním řetězci . . . . Pozice kostky v řetězci s informacemi o rozmístění kostek v závislosti na umístění na hrací ploše . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . viii 17 19 KAPITOLA 1. ÚVOD 1 1 Úvod Tato bakalářská práce se zabývá tvorbou prostředí pro hraní hry MahJong. Součástí je řešení problematiky generátoru rozložení kostek, spolu s odhadem složitosti vygenerovaného řešení. Práce se také zabývá tvorbou editoru rozvržení kostek a implementací pravidel pro vytváření řešitelných sestav. Nemalá část je věnována i celkovému zakomponování do Java appletu. Práce je rozdělena do šesti kapitol. První kapitolou je tento úvod zabývající se historickým vývojem a pravidly hry, ve druhé je stručný přehled problémů týkajících se tvorby práce, třetí kapitola je zaměřena na popis analýzy implementace a návrhu řešení, čtvrtá kapitola obsahuje podrobnější popis metod a funkcí použitých během realizace, v páté kapitole je souhrn výsledků testování aplikace a šestá kapitola je shrnutím výsledků bakalářské práce. Tato úvodní kapitola je rozdělena na dvě hlavní části. První část je zaměřena na historii a vývoj hry MahJong. Druhá je věnována popisu hry, vysvětlení významu obrázků jednotlivých kostek a pravidel. Popis pravidel je uveden pro úplnost a je výňatkem z dodatku B „Uživatelská příručka“. Převážná část textu se opírá o poznatky získané z všeobecné internetové encyklopedie Wikipedia [6] [7], webového serveru MahJong Solitaire [3] a webového serveru Mah Jong Museum [4]. 1.1 Historie hry MahJong 1.1.1 Počátky v Číně Původní MahJong je hra pocházející z Číny, určená pro čtyři hráče. Pro její úspěšné hraní je třeba umění strategie, předvídavosti, dobrá pamět’, ale stejně tak i štěstí. V závislosti na variantě hry, může být štěstí rozhodujícím faktorem k úspěchu. V Asii je MahJong velmi populární, stejně jako tamní hazardní a počítačové hry. Jedna z Čínských legend říká, že slavný čínský filozof Confucius vymyslel tuto hru již kolem roku 500 před naším letopočtem. Podle legendy se hra objevovala v různých čínských státech ve stejné době, kdy je Confucius navštívil, aby učil své nové doktríny. Také se říká, že Confucius měl rád ptáky, což by vysvětlovalo jméno hry MahJong, v překladu vrabec. Další dohady naznačují, že hra byla vyvinuta někdy kolem roku 1850 z již existující čínské karetní hry domina. O této hře mnoho dějepisců tvrdí, že byla založena na čínské karetní hře Ma Tiae (v západním světě známé jako Hanging Horse) na začátku vlády dynastie Ming (13681644). Tato hra se hrála se 40 papírovými kartami, narovnanými do čtyř řad ohodnocených od 1 do 9 se čtyřmi extra kartami s motivem květin. Toto je svým označením velmi podobné dnešnímu číslování MahJongových kostek. Existuje mnohem více teorií o vzniku hry MahJong. Jedna tvrdí, že si ji pro zkrácení času vymysleli armádní důstojníci při čínském Povstání velkého míru v letech 1851-1864. Jiné, že ji vytvořil šlechtic žijící v Shanghaiské oblasti mezi léty 1870 až 1875. A další říkají, že má původ ve městě Nigpo, kde ji kolem roku 1850 měli vymyslet dva bratři ze starší hry Madiro. Neexistují žádné přímé důkazy o tom, jak to s jejím zrodem vlastně bylo. Ale ví se, jak to bylo s jejím koncem. Roku 1949 byla tato tradiční čínská hra ve své mateřské zemi, při založení Čínské lidové republiky, zakázána. Nová komunistická vláda zakázala jakékoli aktivity týkající se hazardu, který byl považován za symbol kapitalistické zkaženosti. Po kulturní revoluci došlo k její renesanci a hra se opět stala jednou z oblíbených kratochvílí Číňanů. KAPITOLA 1. ÚVOD 1.1.2 2 Rozvoj v západním světě Roku 1895 americký antropolog Stewart Culin sepsal první známý popis hry MahJong v jiném než čínském jazyce. Z něho o pár let později čerpal Joseph Park Babcock1 ve své knize Rules of the Mah-Jongg (Pravidla MahJongu), ve které představil zjednodušenou verzi hry, kterou chtěl přiblížit Americe. Hra se stala velmi populární a během času si získávala stále více příznivců. Vznikalo mnoho úprav a pravidel lišících se od původních Babcockových, až v roce 1937 vznikl Národní svaz pro hru MahJong spolu s první americkou směrnicí: The American Version of the Ancient Chinese Game (Americká verze starověké čínské hry). 1.1.3 Aktuální vývoj Dnes se popularita a charakteristika hry v různých zemích značně odlišuje, třeba v Japonsku je kladen velký důraz na hazard. Mnoho ctitelů věří, že hra ztrácí na popularitě a snaží se ji oživit. Například tvorbou video her, kde se během hry zobrazují obrázky žen, které se při úspěšném hraní svlékají. Vznikají i různé variace s lišícími se pravidly a způsobem hraní. 1.1.4 Historie MahJong Solitaire MahJong Solitaire, známý jako Shanghai Solitaire nebo počítačový MahJong, dnes označován samotným slovem MahJong, je srovnávací hra typu pexeso, která místo karet užívá MahJongových kostek. První počítačová verze hry byla vytvořena Brodie Lockardem2 v roce 1981 na počítači typu PLATO3 , jmenovala se Mah-Jongg a originální rozvržení kostek nazval "The Turtle" (želva). Mah-Jongg byla zdarma a lidé se k ní mohli připojovat z celého světa. Online hra byla tak populární, že v roce 1986 vypustila firma Activision novou verzi hry zvanou Shanghai, určenou pro počítače typu Apple Macintosh. Na programování a grafice se opět podílel Brodie Lockard. Hra se stala velmi úspěšnou a bylo prodáno kolem 10 milionů kopií. V dalších letech byly vyvíjeny nové verze hry, s propracovanějším grafickým rozhraním a zvukem a na kostkách se objevovaly nové symboly, jež nahradily tradiční čínské obrázky. Jedna z verzí, známá jako TaiPei, byla v roce 1990 zahrnuta ve speciálním zábavním balíčku Microsoft Entertainment Pack pro Microsoft Windows 3.x, což vedlo k jejímu masovému rozšíření. A taktéž nová verze operačního systému firmy Microsoft Windows Vista obsahuje variantu této hry, zvanou Mahjong Titans. 1 Joseph Park Babcock - americký inženýr, který strávil část života v Číně Brodie Lockard - americký programátor a podnikatel 3 PLATO - otevřený informační vzdělávací systém 2 KAPITOLA 1. ÚVOD 3 1.2 Pravidla 1.2.1 Jak hrát Na hrací plochu jsou v různých řadách, sloupcích a vrstvách umístěny hrací kostky, s různými symboly na lícové straně. Kostek je sudý počet, protože každá má k sobě párovou kostku, a cílem hry je takové kostky najít a odebrat. Dvě kostky jsou párové, jestliže mají na lícové straně shodné znaky. Na počátku hry je spoustu kostek zakrytých jinými a nejsou vidět, takže je třeba se k nim postupně dostat. Aby se párové kostky mohly odebrat, musejí být obě volné. Kostka je volná, pokud: • žádná jiná kostka na ní neleží nebo není částečně krytá (obr. 1.1) Obrázek 1.1: V těchto sestavách je možné odebrat jen kostku uprostřed. Kostky po stranách jsou kryté. • žádná jiná kostka s ní nesousedí napravo a současně nalevo a ani ji v těchto směrech částečně nezakrývá (obr. 1.2) Obrázek 1.2: V těchto sestavách lze odebrat jen krajní kostky. Kostka uprostřed je blokována sousedními kostkami. Zdá se to být snadné, ale přesto hra může skončit i neúspěchem. A to, když na stole zůstanou kostky, které už nemohou být odebrány. Proto musíte být před odstraněním páru obezřetní. Není to jen hra štěstí, ale hlavně strategie. KAPITOLA 1. ÚVOD 1.2.2 4 Motivy kostek MahJong se hraje se 168 kostkami, z nichž 136 je hracích a 32 prémiových. Kostky jsou rozděleny do 7 skupin nazvaných sady. Hrací kostky se dělí na řadové, kterých je 108, a zvláštní, kterých je 28. Řadové kostky se dělí do tří řad po 36, zvaných puntíky, bambusy a znaky. Každá obsahuje kostky ohodnocené od 1 do 9, od každé hodnoty 4 kusy. Zvláštní kostky jsou tři draci (bílý, zelený a červený) a čtyři větry (východní, jižní, západní a severní). Od každého druhu jsou ve hře 4 identické zvláštní kostky. Drakům, větrům, jedničkám a devítkám se říká velké kostky. Řadovým kostkám od 2 do 8 včetně, se říká malé. Prémiové kostky obsahují sadu čtyř květin a sadu čtyř ročních období. První řada kostek (obr. 1.3) obsahuje 9 „puntíkových“ kostek (také známé jako kruhové, znakové nebo tečkované). Jejich číselná hodnota (1 až 9) je reprezentována počtem puntíků. Od každého druhu 4 kostky (celkem 36 kostek s motivem puntíků). Obrázek 1.3: Kostky s motivem puntíků Druhá řada (obr. 1.4) obsahuje 9 „bambusových“ kostek (také známé jako tyčové nebo duté). Jejich číselná hodnota je reprezentována počtem tyček. Od každého druhu 4 kostky (celkem 36 kostek s motivem bambusů). Na kostce číslo jedna je podle typu kostek zobrazován páv, vrabec (MahJong pták) nebo bambusový výhonek, podobající se ananasu. Obrázek 1.4: Kostky s motivem bambusů Třetí řada (obr. 1.5) obsahuje 9 „znakových“ kostek (také známých jako číselné, bledé, desetitisícé nebo prasklé). Červený symbol je čínské znamení pro 10 000 (vyjadřuje také blahobyt). Černý symbol nad ním je popis pro čísla od 1 do 9. Kostky jsou tak popsány čísly od 10 000 do 90 000. Některé typy kostek mohou navíc obsahovat arabské číslice, které byly přidány pro přiblížení hry lidem ze západního světa. Od každého druhu 4 kostky (celkem 36 kostek s motivem znaků). Obrázek 1.5: Kostky s motivem znaků KAPITOLA 1. ÚVOD 5 Čtvrtá řada (obr. 1.6) začíná čtyřmi kostkami „ročního období“. Zleva doprava: jaro, léto, podzim, zima. Jsou potištěny bud’ obrázkem nebo čínským symbolem, popisujícím dané období. O každého druhu 4 kostky (celkem tedy 16 kostek s motivem ročního období). Obrázek 1.6: Kostky s motivem ročních období Čtvrtá řada (obr. 1.7) končí čtyřmi „větrnými“ kostkami. Zleva doprava: východní, jižní, západní, severní. Každá kostka zobrazuje čínský symbol popisující daný vítr. Pro zjednodušení, mohou být kostky opět potištěny prvním písmenem z jejich latinského názvu. Od každého druhu 4 kostky (celkem 16 kostek s motivem větrů). Obrázek 1.7: Kostky s motivem větrů Pátá řada (obr. 1.8) začíná čtyřmi „květinovými“ kostkami. Zleva doprava: violka, lilie, pivoňka, sasanka. Mohou být potištěny odpovídajícími znaky květin. Od každého druhu 4 kostky (celkem 16 kostek s motivem květin). Obrázek 1.8: Kostky s motivem květin Pátá řada (obr. 1.9) končí „dračími“ kostkami. Zleva doprava: zelený, bílý, červený. Bílý může být zobrazován jako prázdná kostka nebo jako obraz obdélníku s rysy červené nebo modré barvy. Od každého druhu čtyři kostky (celkem tedy 12 kostek s motivem draků). Obrázek 1.9: Kostky s motivem draků KAPITOLA 2. POPIS PROBLÉMU, SPECIFIKACE CÍLE 6 2 Popis problému, specifikace cíle Cílem práce je vytvořit Java applet, který bude umožňovat hraní hry MahJong, vytvářet rozvržení kostek, generovat rozložení kostek a vyhodnocovat kroky uživatele při hraní hry. 2.1 Popis řešeného problému Protože se jedná o applet, odpadají problémy s instalací aplikace. Ta je umístěna v nějakém úložném prostoru, na lokálním počítači nebo serveru, a uživatel ji spustí načtením příslušné webové stránky, jež bude na aplikaci odkazovat. V takovém případě kontrolu nad aplikací přebírá prohlížeč, který v sobě samozřejmě musí mít implementovaný JVM1 . Applet není jen důvodem k radosti. Vzhledem k tomu, že obecně se k appletu stahovanému ze sítě přistupuje jako k nedůvěryhodnému objektu, platí pro něj některá omezení činnosti, jejichž cílem je zamezit provedení určitých operací. Ačkoliv tato omezení závisí na prohlížečích, a mohou se mírně odlišovat, obecně se předpokládají následující restrikce: • ukončení práce virtuálního stroje, • spouštění jiných aplikací na straně klienta, • přístup k souborům na straně klienta a manipulace s nimi, • navazování sít’ových spojení s výjimkou svého domovského serveru, • modifikace systémových proměnných a čtení některých z nich (tzv. citlivé proměnné). Při pokusu o jejich překročení je vyvolána výjimka java.security.AccessControlException a applet je ukončen. Existují však způsoby jak tato omezení zmírnit. Například změnou oprávnění pro daný server, podepsáním appletu digitálním certifikátem nebo spuštěním appletu jako aplikace - v takovém případě se mu dostávají stejná práva jako má uživatel. Podíváme-li se na hierarchii tříd v Javě [2], zjistíme, že třída JApplet je potomkem třídy Applet. Ta je potomkem třídy Panel a tím pádem i třídy Container. Z toho plyne, že applet je nejen komponentou GUI2 , ale že rovněž může další GUI komponenty obsahovat. 2.2 Vymezení cílů 1. Vytvořit generátor rozložení kostek, který podle vloženého řetězce s informacemi o umístění kostek, vytvoří takové herní zadání, které bude mít vždy alespoň jedno řešení. 2. Vytvořit editor rozvržení kostek, jehož výstupem bude jen takový řetězec s informacemi o umístění kostek, z něhož vytvořené herní zadání bude mít alespoň jedno řešení. 3. Vytvořit uživatelské rozhraní, které implementuje generátor rozložení kostek a editor rozvržení kostek společně s jejich metodami kontroly správnosti funkce a řešitelnosti jejich výstupů. 1 Java Virtual Machine (Virtuální stroj) - abstraktní počítač, který obsahuje runtime system (realizuje spojení s hardwarem) a interpreter (vykonává binární kód) 2 Graphical User Interface (Grafické uživatelské rozhraní) - druh komunikace s počítačem mající podobu interaktivních grafických prvků KAPITOLA 3. ANALÝZA A NÁVRH ŘEŠENÍ 7 3 Analýza a návrh řešení Tato kapitola se zabývá analýzou abstraktních problémů a cílů práce a jejich přeformulování na konkrétní návrhy řešení. Důraz je kladen na popis návrhu generátoru rozložení kostek a principu jeho správné funkce. Další část kapitoly je zaměřena na editor rozvržení kostek a jeho pravidla pro vytvoření řešitelných sestav. Závěr kapitoly je věnován řešiteli rozložených sestav a určování složitosti řešení. 3.1 Výběr implementačního prostředí Jak bylo zmíněno, applet není třeba nikterak instalovat. K jeho spuštění je třeba se připojit k určité webové stránce, která odkazuje na aplikaci umístěnou na serveru nebo lokálním počítači. Do takové určité webové stránky je třeba applet nějak vložit. 3.1.1 Značkovací jazyk XHTML EXtensible HyperText Markup Language (rozšiřitelný značkovací jazyk pro hypertext), je značkovací jazyk určený pro tvorbu hypertextových dokumentů, neboli webových stránek, vyvinutý konsorciem W3C1 . Každá webová stránka se skládá ze značek (tagů), které popisují její strukturu a umožňují do ní zahrnout i různé externí objekty, jako obrázky, zvuky, videa, animace, ale i applety. 3.1.2 Zahrnutí appletu do webové stránky Pro zahrnutí appletu do webového dokumentu se používá XHTML značka object, která může obsahovat různé atributy, z nichž nejdůležitější pro applet jsou: • classid - identifikace programu, který bude data interpretovat • type - typ objektu, • archive - jméno archivu s appletem, • height - výška objektu, • width - šířka objektu. Proměnné se danému objektu předávají pomocí značky param, jejíž jsou atributy jsou: • name - jméno proměnné, • value - hodnota proměnné. 1 World Wide Web Consortium - mezinárodní konsorcium dohlížející na vývoj internetových standardů KAPITOLA 3. ANALÝZA A NÁVRH ŘEŠENÍ 8 Samotný zdrojový XHTML kód pro vkládání appletu může mít několik podob a to v závislosti na tom, v jaké formě se budou data prohlížeči předávat. Zda jako soubory typu java class nebo jako komprimovaný JAR2 . Pro prvně zmiňovaný vypadá zdrojový text následovně: <!--[if !IE]>--> <object classid="java:MahJong.class" type="application/x-java-applet" height="700" width="500" > <!--<![endif]--> <object classid="clsid:CAFEEFAC-0016-0000-0001-ABCDEFFEDCBA" height="700" width="500" > <param name="code" value="MahJong" /> </object> <!--[if !IE]>--> </object> <!--<![endif]--> Značka <!--[if !IE]>--> zaručí, že v ní umístěná část kódu nebude použita v internetovém prohlížeči s jádrem Trident, tedy v Internet Exploreru (dále jen IE). Ten užívá jiných standardů a proto se kód liší. V atributu classid je pro ostatní prohlížeče umístěn název souboru s hlavní spouštěcí třídou. U IE tento atribut udává jedinečný řetězec, který specifikuje objekt pro Microsoft COM3 model. Jméno hlavní spouštěcí třídy se objektu předává pomocí atributu code v tagu param. Atribut type definuje MIME4 specifikaci, která popisuje co data představují. Význam ostatních parametrů je z výše uvedeného popisu zřejmý. Pro JAR soubor se zdrojový kód nepatrně liší. Je specifikován atribut archive, který určuje jméno JAR archivu. Atribut code ve značce param a atribut classid určují jméno a umístění spouštěcí třídy. <!--[if !IE]>--> <object classid="java:mahjong.MahJong.class" type="application/x-java-applet" archive="MahJong.jar" height="700" width="500" > <!-- prohlížeč Konqueror vyžaduje následující značku param --> <param name="archive" value="MahJong.jar" /> <!--<![endif]--> <object classid="clsid:CAFEEFAC-0016-0000-0001-ABCDEFFEDCBA" height="700" width="500" > <param name="code" value="mahjong.MahJong.class" /> <param name="archive" value="MahJong.jar" /> </object> <!--[if !IE]>--> </object> <!--<![endif]--> 2 Java Archive - platformě nezávislý formát pro archivaci souborů Component Object Model - komponentový objektový model umožňující komunikaci mezi všemi objekty v něm registrované 4 Multipurpose Internet Mail Extensions - standardizovaný způsob označování obsahu zpráv 3 KAPITOLA 3. ANALÝZA A NÁVRH ŘEŠENÍ 9 3.2 Generátor rozložení kostek 3.2.1 Popis generátoru Generátor rozložení kostek je „základním kamenem“ aplikace. Jeho úkolem je zajistit, aby kostky byly rozloženy do určitého tvaru (rozvržení) takovým způsobem, aby hra měla alespoň jedno řešení. Na vstupu přijímá informace, podle nichž rozhodne, na které pozice bude kostky umíst’ovat. 3.2.2 Princip funkce generátoru V úvodní kapitole bylo zmíněno, že jsou kostky párové a že se každá dá odebrat jen se stejnou kostkou. Aby generátor vytvořil řešitelné rozložení, musí mít na hrací ploše každá kostka svého „dvojníka“ - z toho vyplývá, že musí být položen sudý počet kostek. Aby bylo vytvořeno takovéto správné rozložení, postupně přidává generátor na hrací plochu kostky ve stejných párech. To zaručí, že kostek je sudý počet a že každý naposled přidaný pár je stejný. Žádná z kostek však nemůže být položena náhodně. Třeba v situaci se čtyřmi volnými pozicemi vedle sebe. První párová kostka se přidá na první pozici zleva a druhá na třetí na pozici zleva (obr. 3.1 a). Další pár kostek se přidá na zbylé dvě pozice a vznikne rozložení kostek, které nemá podle daných pravidel řešení (obr. 3.1 b). Aby k takovým anomáliím nedocházelo, zahrnuje generátor sérii pravidel, která zaručí, že po rozložení všech kostek bude mít hra alespoň jedno řešení. Obrázek 3.1: Chybné rozložení kostek, bez použití posuvného pravidla. Čtyři volné pozice vedle sebe. První párová kostka se přidá na první pozici zleva a druhá na třetí na pozici zleva (část a). Další pár kostek se přidá na zbylé dvě pozice a vznikne rozložení kostek, které nemá řešení (část b). První ze série pravidel, tzv. „posuvné pravidlo“, se provede před přidáním každé kostky. Jeho funkce spočívá v prozkoumání řádku, na nějž se má kostka přidat. Jestliže už je na řádku nějaká kostka položena, posune se původní kostka na sousední pozici vedle nalezené kostky, a to ve směru od své původní pozice (obr. 3.2). Pakliže se na řádku jiná kostka nenajde, přidá se kostka na svou původní pozici. Obrázek 3.2: Správné rozložení kostek, s posuvným pravidlem. Pokud na řádku kam se má přidat kostka, již nějaká kostka leží, posune se přidávaná kostka na sousední pozici vedle ní. Po několika vygenerovaných rozloženích, se může vyskytnout další problém. Opět v situaci se čtyřmi volnými pozicemi vedle sebe. První pár stejných kostek se přidá na první dvě KAPITOLA 3. ANALÝZA A NÁVRH ŘEŠENÍ 10 pozice zleva a druhý pár na zbylé dvě pozice (obr. 3.3). Opět vznikne rozložení, které podle daných pravidel nemá řešení. Obrázek 3.3: Chybné rozložení kostek, bez výměnného pravidla. Čtyři volné pozice vedle sebe. První pár stej- ných kostek se přidá na první dvě pozice zleva a druhý pár na zbylé dvě pozice. Vznikne rozložení kostek, které nemá řešení. Generátor proto musí zahrnout další pravidlo, tzv. „výměnné“. Jak bylo zmíněno výše, posuvné pravidlo přidává kostku na sousední pozici jiné kostky na stejném řádku. Princip výměnného pravidla spočívá v kontrole právě této „jiné“ kostky. Jestliže je stejná nebo podobná přisunuté kostce, provede se postupná výměna její pozice s pozicemi všech kostek ve směru sousední kostky. Zjednodušeně řečeno, posunutá kostka se vyjme (obr. 3.4 a), všechny kostky na řádku se posunou o jednu pozici ve směru vyjmuté kostky (obr. 3.4 b) a ta se nakonec přidá na pozici naposled posunuté kostky (obr. 3.4 c). Obrázek 3.4: Správné rozložení kostek, s výměnným pravidlem. Stejná volná kostka se vyjme (část a), všechny kostky na řádku se posunou o jednu pozici ve směru vyjmuté kostky (část b) a ta se nakonec přidá na pozici naposled posunuté kostky (část c). Podobný problém jako v předchozím případě může nastat při přidání po sobě následujících stejných párů kostek. Třeba v situaci se šesti volnými pozicemi vedle sebe. První a druhý pár kostek se přidá stejně jako v předchozím případě (obr. 3.5 a). První kostka třetího páru se přidá na pátou pozici a protože sousední kostka je stejná, přesune se podle výměnného pravidla na první pozici (obr. 3.5 b). Druhá kostka třetího páru se přidá na šestou pozici a protože sousední kostka je stejná, přesune se opět podle výměnného pravidla na první pozici (obr. 3.5 c). Opět vznikne rozložení, které podle daných pravidel nemá řešení. Pravidlo, které zabrání takovému chybnému rozložení je rozšířením výměnného pravidla a nazývá se „pravidlo extra kostky“. Výměnné pravidlo při zjištění stejné nebo podobné sousední kostky vymění postupně pozici přidávané kostky se všemi ostatními kostkami na řádku (obr. 3.6 a). Pravidlo extra kostky poté provede detekci souseda naposled přidané kostky. Jestliže je tato sousední kostka opět stejná, provede se kontrola existence sousední pozice nejkrajnější kostky na druhém konci řady (obr. 3.6 a) šedě zvýrazněná pozice). Pakliže tato pozice existuje, přidá se na ni kostka stejného typu, jako původní sousední (obr. 3.6 b). Přidání takové KAPITOLA 3. ANALÝZA A NÁVRH ŘEŠENÍ 11 Obrázek 3.5: Chybné rozložení kostek, bez pravidla extra kostky. Šest volných pozic vedle sebe. První a druhý pár se přidají s pomocí posuvného a výměnného pravidla(část a). První kostka třetího páru se přidá na pátou pozici a výměnným pravidlem je přesunuta na první pozici (část b). Druhá kostka třetího páru se přidá na šestou pozici a výměnným pravidlem je přesunuta na první pozici (část c). Vznikne rozvržení kostek, které nemá řešení. extra kostky proběhne uvnitř výměnného pravidla, takže tato pozice nebude vybrána generátorem a na kostku nebude aplikováno výměnné pravidlo. Obrázek 3.6: Správné rozložení kostek, s pravidlem extra kostky. První a druhý pár se přidají s pomocí po- suvného a výměnného pravidla. První kostka třetího páru se přidá na pátou pozici a výměnným pravidlem je přesunuta na první pozici (část a). Pravidlo extra kostky provede detekci šesté pozice zleva (šedě zvýrazněná). Ta existuje a je volná, proto se druhá kostka třetího páru přidá na šestou pozici(část b). Nepřidá-li se kostka pomocí žádného pravidla, tzn. při prohledávání řádky kam má být přidána nebyla v obou směrech nalezena žádná jiná kostka, přidá se na původní pozici, pro ni určenou. Všechna tato pravidla jsou aplikována nejen na kostky ve stejném řádku, ale i na všechny kostky, které svým umístěním do řádku zasahují (obr. 3.7). Obrázek 3.7: Správné rozložení kostek z různých řádků. Všechna pravidla generátoru rozložení kostek musejí být aplikovatelná i na kostky ležící mimo původně určený řádek. KAPITOLA 3. ANALÝZA A NÁVRH ŘEŠENÍ 12 3.3 Editor rozvržení kostek 3.3.1 Popis editoru Editor rozvržení kostek je jedna z vizuálních částí aplikace. V jeho prostředí může uživatel vytvářet sestavy prázdných kostek (kostky bez obrázku), které definují do jakého tvaru se po dokončení označené kostky rozloží. Po otevření editoru se zobrazí mřížka identická s velikostí hrací plochy a červený obdélníček o velikosti hrací kostky. Obdélníček mění svou pozici v závislosti na pozici kurzoru myši a „přilepuje“ se na části buňek editorové mřížky. Může být umístěn bud’ celý na jedné buňce (obr. 3.8 a) nebo na dvou buňkách, na každé polovinou (obr. 3.8 b) a nebo na čtyřech buňkách, na každé čtvrtinou (obr. 3.8 c). Při stisknutí levého tlačítka myši se na pozici, kterou obdélníček zaměřuje umístí prázdná kostka. Při najetí obdélníčku na kostku a stisknutí pravého tlačítka myši se kostka odebere. Obrázek 3.8: Umístění zaměřovacího obdélníku v editoru rozvržení. Celý na jedné buňce (část a), na dvou buňkách (část b), na čtyřech buňkách (část c). Po vytvoření sestavy a stisknutí tlačítka pro tvorbu hry se provede série pravidel, které překontrolují zda může být daná sestava kostek po rozložení na hrací plochu řešitelná. Pokud budou pravidla vyhodnocena pozitivně, vygeneruje editor na svém výstupu řetězec s informacemi o umístění kostek. Po negativním vyhodnocení pravidel se na obrazovce zobrazí varovná hláška spolu s návrhem řešení. 3.3.2 Pravidla pro tvorbu sestav Každá uživatelem vytvořená sestava nemusí být řešitelná, proto editor zahrnuje určitá pravidla, která její řešitelnost kontrolují. Po spuštění nové hry musí být na hrací ploše umístěn sudý počet kostek. První pravidlo proto kontroluje, zda se uživatelem vytvořená sestava skládá taktéž ze sudého počtu kostek. Další neřešitelná sestava by mohla vzniknout skládáním kostek do jediného sloupce nebo do sloupce jehož výška z kostek je větší než počet kostek ležících mimo něj (obr. 3.9 a). Podle pravidel může uživatel odebrat jen nejvyšší kostku ve sloupci. Mohla by tak nastat situace, kdy by měl možnost označit jedinou kostku a k ní žádnou jinou párovou. Editor proto zahrnuje další pravidlo, které kontroluje, aby počet všech kostek ležících mimo nejvyšší sloupec byl minimálně roven počtu kostek ve sloupci (obr. 3.9 b). Díky tomu je po rozložení možné označit alespoň dvě kostky a sestava má řešení. KAPITOLA 3. ANALÝZA A NÁVRH ŘEŠENÍ 13 Obrázek 3.9: Možnosti rozmístění kostek v editoru. Kostky jsou umístěny ve sloupci, jehož výška je větší než počet kostek ležících mimo něj - sestava nemá řešení (část a). Počet kostek ležících mimo nejvyšší sloupec je roven počtu kostek ve sloupci - sestava je řešitelná (část b). 3.4 Řešitel rozložených sestav 3.4.1 Popis řešitele Řešitel rozložených sestav je jedna z doplňkových částí aplikace. Není potřebná pro její správný chod, ale je důležitá pro součásti, o které ji rozšiřuje. Mezi ně mimo jiné patří: • informace o počtu zbývajících kostek na hrací ploše, • informace o počtu kostek, které lze aktuálně odebrat, • zvýraznění párů kostek, které lze aktuálně odebrat, • vrácení naposledy odebraného páru kostek zpět do hry, • definování složitosti sestav a možnosti spuštění hry s různou obtížností. 3.4.2 Definování složitosti sestav Každá hra se dá podle počtu kostek sestavit několika nebo mnoha různými způsoby. V závislosti na způsobu sestavení hry se může odebrat určitý počet volných párových kostek. Po každém následujícím odebrání páru kostek se přepočítá počet zbývajících volných párových kostek a přičte se k počtu kostek odebraných v předchozích tazích. Výsledný součet po odebrání všech kostek spolu s celkovým počtem kostek v sestavě má přímý vliv na určování složitosti sestavy. Ta je definována celým číslem, podle něhož se určí stupeň obtížnosti. 3.5 Návrh uživatelského prostředí V dnešní době operačních systémů s graficky orientovaným rozhraním, je velmi malá možnost setkat se s aplikací, která by tohoto rozhraní nevyužívala. Programovací jazyk Java obsahuje hned několik knihoven pro tvorbu a práci s vizuálními komponentami (okna, tlačítka, dialogy, obrázky, atd.). KAPITOLA 3. ANALÝZA A NÁVRH ŘEŠENÍ 3.5.1 14 Grafické knihovny AWT a Swing Knihovna AWT (Abstract Window Toolkit) je součástí Java Core API5 a je první implementací grafického rozhraní v Javě. Programy psané pomocí této knihovny jsou v duchu jazyka Java plně přenositelné, ale zároveň využívají nativních prvků operačního systému na němž jsou spuštěny. To přináší nejen vzhledové, ale i ovládací komplikace. Proto se tato knihovna pro tvorbu vizuálních komponent téměř nepoužívá. Na použitelnosti ale nestrádá, obsahuje několik dalších balíčků (event, graphics, image, color, atd.), které fungují jako podpůrná část pro novější grafické knihovny. Swing je další z grafických knihoven umožňujících tvorbu a práci s vizuálními komponentami. Je součástí JFC6 , zároveň je nadstavbou AWT (Abstract Window Toolkit) a taktéž je zahrnuta v Java Core API. Její hlavní výhody oproti knihovně AWT jsou: • Nepoužívá nativní komponenty. Aplikace psané s knihovnou Swing jsou zcela platformě nezávislé. • Bohatší množství komponent. Mohou také intenzivněji využívat dědičnost a kompozici a tak složitější komponenty vznikají zděděním nebo složením z jednodušších. • Důsledné oddělení funkcionality od vzhledu. Rozšíření o nastavení různého vzhledu GUI. • Oddělení dat od objektů u složitějších komponent (např. strom, tabulka). Zlepšení možností přizpůsobení a rozšíření o opakovanou použitelnost dat. • Rychlejší a flexibilnější. 5 Application Programming Interface (Aplikační programové rozhraní) - základní knihovny pro psaní programů v Javě 6 Java Foundation Classes - sestava knihoven pro tvorbu přenositelných grafických uživatelských rozhraní KAPITOLA 4. REALIZACE 15 4 Realizace Součástí této kapitoly je podrobnější popis tříd, metod a algoritmů použitých pro tvorbu uživatelského prostředí hry MahJong a realizaci generátoru a editoru kostek. Generátor a editor kostek jsou záměrně tvořeny jako dvě na sobě nezávislé aplikace. Jako spojení od editoru ke generátoru funguje řetězec s informacemi o rozmístění kostek, který může být při znalosti jeho struktury vytvořen i v jiném editoru. 4.1 Implementace základních objektů Než budou popsány hlavní funkce jednotlivých částí aplikace, je třeba definovat termíny, které jejich popis doplňují a zjednodušují. Tato část je věnována tomuto popisu a jsou zde rozebrány funkce a vlastnosti nejzákladnějších objektů. 4.1.1 Reprezentace hrací plochy Hrací plocha je vyhrazená část okna z hlavní komponenty typu třídy JApplet, určená pro vykreslování kostek. Lze si ji představit jako imaginární mřížku o velikosti 15 sloupců a 8 řádků. Všechny buňky v této mřížce mají stejnou velikost a představují pozici pro umístění hrací kostky. V prostředí editoru rozvržení kostek je uživateli tato mřížka zobrazena, což umožňuje lepší orientaci při umíst’ování kostek na hrací plochu. Struktura hrací plochy se mimo jiné skládá z: • vektorKostek - proměnná typu Vector, obsahuje všechny kostky umístěné na hrací ploše, • jmenoHry - proměnná typu String, obsahuje název aktuálně rozložené hry. S hrací plochou jsou svázány metody pro zachytávání uživatelských událostí. Pod slovy „uživatelské události“ si lze představit například označení kostky. To se provede najetím kurzoru myši na její pozici a následným stiskem levého tlačítka myši. Označení kostky je realizováno přidáním události typu MousePressed ze skupiny událostí MouseEvent. Při stisknutí levého tlačítka myši se uloží x a y souřadnice kurzoru myši. Ty se porovnají se všemi kostkami ve vektoru kostek a z něj se vyberou takové kostky, které na těchto souřadnicích leží. Může jich být více, protože kostky ve sloupci jsou svou pozicí stejné a liší se jen vrstvou. Z nich se nakonec vybere jen kostka s nejvyšší vrstvou a ta se označí. 4.1.2 Reprezentace kostky Každá kostka na hrací ploše je objekt popsaný třídou Kostka. Její struktura se skládá z následujících položek: • radek, sloupec, vrstva - proměnné typu int, které reprezentují umístění kostky na hrací ploše pro výpočetní algoritmy, • pozice - proměnná typu Point(int, int), reprezentuje pozici kostky v rovinné soustavě souřadnic (osy x, y) na hrací ploše, do které bude kostka vykreslena, • posun - proměnná datového typu enum PosunKostky, popisuje způsob posunutí kostky vůči své původní pozici, • id - proměnná typu int, která udává jednoznačný identifikační kód identické skupiny kostek (celkem 42 skupin), • vybrana - proměnná typu boolean, definuje zda je kostka uživatelem označena. KAPITOLA 4. REALIZACE 4.1.3 16 Reprezentace posunu kostky Kostky se umíst’ují do řádků, sloupců a vrstev. Některé kostky mohou být umístěny ve dvou řádcích nebo i ve dvou sloupcích. Každá je však reprezentována jen jednou hodnotou řádku a sloupce, což neumožňuje takové umístění kostky popsat. Kostka má proto definovanou proměnnou posun, která určuje jakým způsobem bude vůči svému řádku nebo sloupci posunuta. Jinak řečeno, posun kostky říká na kolika buňkách z mřížky hrací plochy bude kostka umístěna. Posun je proměnná datového typu enum PosunKostky, která definuje následující položky: • zadny(1) - žádný posun, kostka je položena na jedné buňce (obr. 4.1 a), • posunDolu(2) - posun o půl řádku dolů od svého původního řádku, kostka je položena na dvou buňkách (obr. 4.1 b), • posunVpravoDolu(3) - posun o půl řádku od svého původního řádku a o půl sloupce od svého původního sloupce, kostka je položena na čtyřech buňkách (obr. 4.1 c). Obrázek 4.1: Posunutí kostky na hrací ploše. Žádný posun (část a), posun o půl řádku dolů (část b), posun o půl řádku od svého původního řádku a o půl sloupce od svého původního sloupce (část c). Každá položka obsahuje atribut typu int, který je využit pro metody datového typu: • boolean jePlatnyZnak(int) - pokud se vstupní hodnota shoduje s atributem některé z položek datového typu, vrátí hodnotu true. V opačném případě vrátí false. • int posunNaZnak(PosunKostky) - pokud se vstupní hodnota shoduje s názvem některé položky z datového typu, vrátí hodnotu jejího atributu. V opačném případě vrátí nulu. • PosunKostky znakNaPosun(int) - pokud se vstupní hodnota shoduje s atributem některé z položek datového typu, vrátí název této položky. V opačném případě vrátí null. 4.2 Generátor rozložení kostek Úkolem generátoru je rozmístit kostky na hrací plochu do určitého tvaru (rozvržení) takovým způsobem, aby hra měla alespoň jedno řešení. Na vstupu přijímá informace, podle nichž rozhodne, na které pozice bude kostky umíst’ovat. 4.2.1 Vstupní informace Informace o tom, kde budou kostky na hrací ploše umístěny jsou uloženy v řetězci typu třídy String. Ten je sestaven z numerických hodnot a každý jeho byte představuje jednu kostku. KAPITOLA 4. REALIZACE 17 Atribut posunu kostky je roven číselné hodnotě daného bytu. Pozice bytu v řetězci udává umístění kostky do imaginární mřížky na hrací ploše (viz tab. 4.1). Pozice v řetězci 0 15 119 120 Pozice v mřížce hrací plochy 1 16 120 121 Umístění na hrací ploše řádek 1, sloupec 1, vrstva 1 řádek 2, sloupec 1, vrstva 1 řádek 8, sloupec 15, vrstva 1 řádek 1, sloupec 1, vrstva 2 Tabulka 4.1: Pozice kostky na hrací ploše v závislosti na pozici ve vstupním řetězci pro generátor rozložení kostek. Při prozkoumání tabulky je patrné, že pozice bytu v řetězci s informacemi je o jednu menší než číselná hodnota pozice kostky v mřížce hrací plochy. Délka řetězce udává počet kostek, které se mají na hrací plochu umístit. 4.2.2 Realizace generátoru Generátor rozložení kostek se skládá z úložné a funkční části. Úložná část je typu Vector a obsahuje všechny volné pozice, na něž se mohou kostky umístit. Funkční část je sestavena z algoritmu, který na tyto volné pozice kostky pokládá. Při položení kostky na hrací plochu se její pozice z vektoru volných pozic vymaže. Algoritmus pro pokládání kostek na hrací plochu na vstupu přijme vstupní řetězec s informacemi o umístění kostek. Ten postupně prochází a každou jeho položku kontroluje pomocí metody jePlatnyZnak z datového typu enum PosunKostky. Jestliže položka popisuje posun kostky, tzn. znak je platný, uloží se pozice znaku z řetězce do vektoru s volnými pozicemi. Po projetí celého řetězce bude vektor s volnými pozicemi obsahovat dokonalou mapu, popisující na jaké pozice na hrací ploše má generátor kostky pokládat. Poté se provede náhodný výběr typu kostky, která by měla být umístěna na hrací plochu. Tento výběr se provádí v závislosti na velikosti proměnné vektorKostek, která obsahuje všechny kostky umístěné na hrací ploše. Je-li počet kostek ve vektoru kostek nulový nebo sudý, výběr kostky se provede. Pakliže je počet kostek lichý, výběr se neprovede a generátor pracuje se se stejným typem kostky jako v předchozím případě. To zaručí, že se kostky přidávají postupně ve stejných párech a každá bude mít svého „dvojníka“, se kterým se bude moci odebrat. Po určení typu kostky pro přidání se vybere jedna pozice z vektoru volných pozic, na kterou by se měla kostka přidat. Záměrně je uvedeno slovo „měla“, protože jak je v předchozí kapitole „Analýza a návrh řešení“ psáno, generátor zahrnuje sérii pravidel, která testují zda může být kostka na prvně vybranou pozici přidána nebo ne. 4.2.3 Implementace pravidel Po určení typu a pozice kostky se provede prozkoumání řádku, na nějž se má kostka přidat. Nejprve se procházejí buňky od původní pozice na řádku vpravo a pokud není nalezena žádná kostka, procházejí se buňky vlevo. Pro každý směr se testují všechny tři pravidla. Neprozkoumává se však jen původní řádek. Kostky mohou být posunuty o půl řádku od své původní pozice dolů a tak by mohly kostky z vyššího řádku zasahovat do prozkoumávaného řádku. Proto se musí testovat i vyšší řádek. Jestliže se na něm najde kostka s posunem dolů, položí se přidávaná kostka na sousední pozici vedle ní. Jestliže sousední kostka z vyššího řádku s posunem dolů bude stejná, provede se výměna podle výměnného pravidla. Taková výměna se provede i se všemi kostkami z vyšších řádků, které zasahují do prozkoumávaného řádku. Záměrně je psáno v množném čísle „vyšších KAPITOLA 4. REALIZACE 18 řádků“, protože číslo prozkoumávaného řádku se může změnit a tím pádem se změní i číslo vyššího řádku. Třeba v situaci, kdy se kostka položí na sousední pozici vedle párové kostky s posunem dolu, která leží na vyšším řádku. Ta má vedle sebe kostku ležící na stejném řádku, ale bez posunu. A ta má vedle sebe také sousední kostku posunutou směrem dolů, ležící od ní o řádek výše (obr. 4.2 a). Obrázek 4.2: Realizace posuvného pravidla pro kostky ležící na různých řádcích. Vyjme se stejná krajní kostka. Všechny její sousední kostky se posunou ve směru vyjmuté kostky na pozici své původní sousední kostky pozici. Vyjmutá kostka se přidá na pozici po naposled posunuté kostce (část b). V takovém případě se vyjme stejná krajní kostka. Všechny její sousední kostky se posunou o jednu pozici ve směru vyjmuté kostky. Dostanou se tedy na pozici své původní sousední kostky a získají její hodnotu posunu. Vyjmutá kostka, která měla být původně přidána jako první se po posunu všech kostek položí na uvolněnou pozici po naposled posunuté kostce a taktéž získá její hodnotu posunu (obr. 4.2 b). 4.3 Editor rozvržení kostek V prostředí editoru lze vytvářet sestavy, které se dají pomocí generátoru rozložit v hratelnou hru. Může být vytvořena jen sestava, která by po rozložení kostek měla alespoň jedno řešení. Výstupem editoru je řetězec s informacemi o umístění kostek. 4.3.1 Realizace editoru Editor rozvržení kostek se skládá z úložné a funkční části. Úložná část je typu Vector a obsahuje všechny uživatelem umístěné kostky na hrací ploše. Funkční část je sestavena z algoritmu pro tvorbu výstupního řetězce s informacemi o umístění kostek a z metod pro zachytávání uživatelských událostí. Při spuštění editoru se uživateli zobrazí mřížka o velikosti hrací plochy a červený obdélníček o velikosti hrací kostky. Pozice obdélníčku se mění v závislosti na pozici kurzoru myši. Při stisknutí levého tlačítka myši se na pozici obdélníčku položí kostka a při stisku pravého tlačítka se kostka odstraní. Vše je realizováno přidáním událostí myši na kreslící plochu, tedy na objekt typu třídy JApllet. První z událostí se nazývá MouseMoved ze skupiny událostí MouseEvent. Jednou z jejích vlastností je zachytávání x a y souřadnice kurzoru myši na komponentě, čímž je realizován pohyb červeného zaměřovacího obdélníčku. Pozice obdélníčku je změněna v závislosti na hodnotě těchto souřadnic a poté je kreslící plocha aktualizována. KAPITOLA 4. REALIZACE 19 Další z událostí se nazývá MousePressed. Její funkce je popsána v oddílu 4.1.1 „Reprezentace hrací plochy“, ale v prostředí editoru se částečně liší. Souřadnice se ukládají při stisknutí pravého i levého tlačítka myši a závislosti na tom, které bylo stisknuto se provedou různé akce. Při stisku levého tlačítka se souřadnice kurzoru porovnají se všemi kostkami v editorovém vektoru kostek. Jestliže se najde kostka, která dané souřadnice obsahuje, přidá se nová kostka na ní (tedy o vrstvu výše). Pakliže se žádná taková nenajde, přidá se nová kostka na pozici, kterou označuje červený zaměřovací obdélníček (tedy do první vrstvy). Při stisknutí pravého tlačítka myši se opět projede vektor kostek a jestliže se najde kostka obsahující dané souřadnice, vymaže se. Po stisknutí pravého nebo levého tlačítka se kreslící plocha aktualizuje. 4.3.2 Implementace pravidel Editor může vytvořit jen takovou sestavu kostek, která bude mít minimálně jedno řešení. Aby tomu tak bylo zahrnuje určitá pravidla, která tuto podmínku zaručí. Pravidla jsou definována takto: • Na hrací ploše musí být rozložen jen sudý počet kostek. • Počet kostek ležících mimo nejvyšší sloupec musí být minimálně roven počtu kostek ve sloupci. Úložná část editoru je typu Vector a obsahuje všechny uživatelem položené kostky na hrací ploše. Jestliže je počet kostek v tomto vektoru sudý, potom je i počet kostek na hrací ploše také sudý a první pravidlo je splněno. Pro určení druhého pravidla, se z editorového vektoru kostek vybere nejvýše položená kostka (tzn. kostka s nejvyšší hodnotou položky vrstva) a zaznamenají se její hodnoty řádku a sloupce. Poté se ze stejného vektoru vyberou všechny kostky, které se shodují s hodnotami řádku a sloupce nejvyšší kostky. Jejich počet je roven výšce nejvyššího sloupce v sestavě. Druhé pravidlo je splněno, jestliže je součet všech ostatních kostek větší nebo roven výšce nejvyššího sloupce. 4.3.3 Vytvoření řetězce s informacemi o rozmístění kostek Jestliže budou všechna editorová pravidla vyhodnocena kladně, vytvoří se řetězec s informacemi o rozmístění kostek. Jeho výsledná struktura je shodná s řetězcem popisovaným v oddílu 4.2.1 „Vstupní informace“. Může být tedy rovnou poslán na vstup generátoru rozložení kostek a vytvořena z něj nová hra. Řetězec pro zápis je objekt typu třídy StringBuffer, jehož záznam lze jednoduše a bez ztráty měnit. Jeho velikost je stejná jako velikost editorového vektoru kostek (podle počtu položek v něm). Postupně jsou procházeny všechny položky vektoru kostek a u každé je z hodnoty řádku, sloupce a vrstvy spočítána pozice v řetězci (viz tab. 4.2). Umístění na hrací ploše řádek 1, sloupec 1, vrstva 1 řádek 2, sloupec 1, vrstva 1 řádek 8, sloupec 15, vrstva 1 řádek 1, sloupec 1, vrstva 2 Pozice v mřížce hrací plochy 1 16 120 121 Pozice v řetězci 0 15 119 120 Tabulka 4.2: Pozice kostky v řetězci s informacemi o rozmístění kostek v závislosti na umístění na hrací ploše. Na tuto pozici je v řetězci zapsána číselná hodnota představují posun kostky, která je získána z metody posunNaZnak z datového typu enum PosunKostky. Po zapsaní všech kostek je KAPITOLA 4. REALIZACE 20 řetězec převeden na objekt typu třídy String, který je neměnný a poskytuje vyšší odolnost vůči chybám. 4.4 Uživatelské rozhraní V tomto oddílu je kladen důraz na vizuální stránku aplikace, na celkové rozvržení a grafický návrh. Jsou zde řešeny problémy načítání obrazových reprezentací kostek a blikání obrazu při překreslování obrazovky. 4.4.1 Základní rozvržení V kapitole 3.5 „Návrh uživatelského prostředí“ jsou popsány výhody a nevýhody jednotlivých grafických knihoven. Pro tvorbu přenositelného grafického rozhraní se jako nejlepší jeví použití knihovny Swing. Proto je celá vizuální část appletu sestavena z objektů této knihovny. Okno aplikace je rozděleno do třech hlavních částí: • výběrová - obsahuje hlavní a pomocnou lištu s tlačítky, • informační - informuje uživatele o průběhu hry, • aktivní - zobrazovací část, která mění obrazovku podle zvoleného prostředí (úvodní obrazovka, editor, spuštěná hra atd.). Výběrová část je tvořena komponentou typu třídy JPanel, která obsahuje tři lišty s tlačítky typu třídy JToolBar. Tlačítka první lišty jsou důležitá pro ovládání celé hry, proto je lišta stále zobrazená. Tlačítka druhé a třetí lišty jsou specifická pro prostředí editoru a spuštěné hry, proto jsou lišty viditelné jen v těchto prostředích. K zakrývání dochází pomocí metody setVisible(boolean) s parametrem false. Zobrazení lišty je provedeno pomocí stejné metody volané s parametrem true. Informační část je tvořena komponentou typu třídy JPanel, která obsahuje popisky typu třídy JLabel. První popisek zobrazuje aktuální počet rozložených kostek na hrací ploše získaný z řešitele. Druhý popisek zobrazuje informaci o počtu volných párů kostek, které lze odebrat - taktéž získanou z řešitele. A na třetím popisku je zobrazen čas od začátku nové hry. Aktivní část je vyhrazená část okna z komponenty JAppet, která v prostředí editoru a spuštěné hry plní funkci hrací plochy popsané v oddílu 4.1.1 „Reprezentace hrací plochy“. Mimo tato prostředí je překrývána komponentou typu třídy JScrollPane obsahující komponentu typu třídy JPanel, do níž mohou být vkládány další objekty (např. panel s výběrem obtížnosti pro spuštění hry). Zakrývání a zobrazování je opět realizováno pomocí metody setVisible(boolean). 4.4.2 Dvojitý buffering V prostředí editoru a spuštěné hry jsou zachytávány události vzniklé stisknutím tlačítka myši nebo jejím posunem. Součástí jejich obslužného kódu je volání metody repaint(), která spolupracuje s metodou paint(), pomocí níž dochází k překreslování obrazovky. To je provedeno vymazáním a následným vykresleným nového obsahu. K této změně dochází velmi rychle a obraz bliká. K potlačení tohoto nežádoucího jevu je použita metoda „dvojitého bufferu“, která místo přímého kreslení na obrazovku nejprve ukládá data do pamět’ové oblasti a odtud jsou všechna přenesena na obrazovku. Obrazovka je tak celá aktualizována najednou a uživateli se žádné blikání nezobrazuje. KAPITOLA 4. REALIZACE 21 Pamět’ová oblast je realizována objektem typu Image, který je vytvořen metodou createImage(int, int) ze třídy Component. Celočíselnými parametry metody jsou šířka a výška obrazu. Implementace dvojitého bufferu je realizována předefinováním metody update(), která při zachycení výše zmíněných událostí nahrazuje metodu repaint(). Její struktura vypadá následovně [1]: /* Obraz plnící funkci úložné pamět’ové oblasti */ private Image doubleBuffer; /* Překreslovací metoda využívající dvojitého bufferu */ public void update(Graphics g){ /* Načtení rozměrů zobrazované oblasti a vytvoření objektu typu Image */ Dimension size = getSize(); if (doubleBuffer == null || doubleBuffer.getWidth(this) != size.width || doubleBuffer.getHeight(this) != size.height){ doubleBuffer = createImage(size.width, size.height); } if(doubleBuffer != null){ /* Ukládání obrazových dat do pamět’ové oblasti */ Graphics g2 = doubleBuffer.getGraphics(); paint(g2); g2.dispose(); /* Vykreslení obrazových dat z pamět’ové oblasti */ g.drawImage(doubleBuffer, 0, 0, null); } else { /* Nebylo možné vytvořit dvojitý buffer */ paint(g); } } 4.4.3 Grafické zpracování kostek Každá kostka je na hrací ploše zobrazena jako samostatný objekt. Má svou vlastní polohu, identifikační číslo a vzhled. V úvodní části bylo zmíněno, že MahJong se skládá jen ze 42 druhů kostek, z nichž některé jsou ve hře čtyřikrát, dvakrát nebo jen jednou. Problémem tedy je, jak těchto 42 vizuálních zastoupení jednotlivých kostek do aplikace nahrát. Na internetu jsem objevil hru zvanou Shisen [5], která se svým vzhledem kostek velmi podobá MahJongovým kostkám. Její licenční smlouva je k uživateli benevolentní a dovoluje použití některých vizuálních prvků v jiných nekomerčně zaměřených aplikacích. Proto jsem si dovolil vizuální vzhled jejích kostek použít. Vzhled všech kostek je uložen v jediném souboru formátu PNG1 , který umožňuje uchovávat i průhledný nebo průsvitný obrázek. To je u aplikace, kde se mohou kostky částečně překrývat velmi důležité. Načítání souboru se provádí pomocí metody getImage() ze třídy Toolkit a vrací obrázkový objekt typu Image. 1 The Portable Network Graphics - grafický formát určený pro bezeztrátovou kompresi rastorové grafiky KAPITOLA 4. REALIZACE 22 Zde je příklad: Toolkit toolkit = Toolkit.getDefaultToolkit(); Image nactenyObrazek = toolkit.getImage(nazevObrazku); Obrázek je rozdělen do matice o velikosti 4 řádků a 11 sloupců (obr. 4.3), kde každá buňka představuje vzhled jedné z kostek. Pozice obrázku kostky se počítá pomocí jejího identifikačního čísla. Nejprve se spočítá pozice buňky v matici (řádek, sloupec) a ta se vynásobí celkovým rozměrem obrázku (výška, šířka). Struktura kódu vypadá následovně: /* Výpočet pozice buňky obrázku kostky podle id kostky */ int radekObrazku = (id / 11) + 1; int sloupecObrazku = (id % 11) + 1; /* Načtení výšky a šířky obrázku */ int vyska = image.getHeight(null); int sirka = image.getWidth(null); /* Výpočet souřadnic obrázku kostky */ int x = (sirka / 11) * (sloupecObrazku - 1); int y = (vyska / 4) * (radekObrazku - 1); Point poziceObrazkuKostky = new Point(x, y); Výsledná pozice je nakonec uložena do proměnné typu Point(int, int), která reprezentuje umístění vzhledu kostky v rovinné soustavě souřadnic (osy x, y) v obrázku. Obrázek 4.3: Struktura obrázku se vzhledem všech druhů kostek. Obrázek je rozdělen do matice o velikosti 4 řádků a 11 sloupců, kde každá buňka představuje vzhled jedné z kostek. Předposlední buňka v matici reprezentuje obrázek, který označuje vybranou kostku. Kostky jsou kresleny na hrací plochu, což je vyhrazená část z okna komponenty JApplet. Vykreslení každé kostky je provedeno metodou drawImage ze třídy Graphics. KAPITOLA 5. TESTOVÁNÍ 23 5 Testování Tato kapitola je zaměřena na popis testování během vývoje aplikace a po něm. Podstatou je sbírání informací o ovladatelnosti a ergonomii softwaru, který testují různé skupiny uživatelů. Kritériem pro hodnocení přitom může být např. čas potřebný k vykonání určitého úkolu, počet nutných kliknutí myší, přehlednost apod. Informace od uživatelů jsou postupně vyhodnocovány a na základě výsledků probíhá další vývoj. 5.1 Průběh testování Ještě před začátkem tvorby softwaru byl sestaven speciální tým uživatelů (testerů) lišících se věkem a počítačovou gramotností. Uživatelé byli rozděleni do skupin podle věku (nejmladšímu bylo 15 let a nejstaršímu 65 let) a podle toho jak často a na jaké úrovni pracují s počítačem. Každému členu týmu byly v určitých intervalech zasílány části aplikace, spolu s požadavky na co se má zaměřit. Největší důraz byl postupně kladen na: • rychlost generování rozložení kostek, • testování implementovaných pravidel pro generátor rozložení kostek, • tvorba sestav v editoru rozvržení kostek, • testování implementovaných pravidel pro editor rozvržení kostek, • rozdílnost složitosti sestav, • grafické rozhraní (vzhled, přehlednost, rychlost, atd.), • spustitelnost appletu v různých prohlížečích, • celková ovladatelnost a funkčnost aplikace. Po dokončení každého testovacího úseku uživatelé odeslali zprávu s popisem chyb a s návrhy na zlepšení aplikace. Jednotlivé výsledky byly zpracovány a podle jejich vyhodnocení se přizpůsoboval další vývoj. Díky rozdělení uživatelů do skupin podle věku a počítačové gramotnosti, mohl být vývoj softwaru nasměrován směrem k přiblížení všem skupinám obyvatelstva. 5.2 Srovnání s existujícími řešeními Dalším faktorem, který v začátcích ovlivnil vývoj hry, bylo srovnání s již existujícími řešeními. Hra MahJong je ve světě velmi oblíbená a jen na internetu je k nalezení nepřeberné množství jejích variant. Z těch méně známých tzv. „free online“ her například: • Mahjongg Solitaire (http://www.mah-jongg.ch), • The Ultimate Mahjongg (www.mahjonged.com), • Amazing Mahjongg (http://www.mahjongg4u.com). Některé z těchto her mají jednu velkou nevýhodu a sice to, že jejich generátor rozložení kostek může vytvořit i sestavu, která nemá řešení. Možná je to proto, že jsou zdarma a na jejich vývoj nebyly kladeny tak velké nároky. Nebo proto, že hry obsahují předdefinované sestavy, které se skládají z velkého počtu kostek, čímž se riziko neřešitelnosti snižuje. KAPITOLA 5. TESTOVÁNÍ 24 Dalším typem her jsou ty, které je třeba instalovat na pevný disk počítače. Mnohé z nich bývají placené, ale některé jsou stále „free“, například: • Aki Mahjong Solitaire (http://www.ambrosiasw.com/games/aki/), • Desktop Taipei (http://www.lenagames.com/dtaipei.htm), • Kyodai MahJongg (http://cynagames.com). Tyto hry mají o poznání lepší grafický vzhled než tzv. „free online“ hry. I jejich způsob rozvržení kostek na hrací plochu je mnohem lepší a zaručuje minimálně jedno správné řešení. Někteří z tvůrců, ale vyřešili generátor rozložení kostek šalamounským způsobem. Ke všem sestavám vytvořili tabulky, které přímo definují, kde jaká kostka bude. To je sice výhoda v jednoduchosti rozkládacího algoritmu, ale velká nevýhoda pro uživatele, protože existuje jen několik možných způsobů rozložení. KAPITOLA 6. ZÁVĚR A NÁMĚTY POKRAČOVÁNÍ PRÁCE 25 6 Závěr a náměty pokračování práce Tato práce byla zaměřena na tvorbu uživatelského prostředí pro hraní hry MahJong. Byla umožněna kontrola dodržování pravidel a vytvořena nápověda usnadňující uživateli hledat řešení. Součástí aplikace je generátor nových rozložení kostek s možností odhadu složitosti generovaných řešení. Další částí je editor rozvržení kostek zahrnující pravidla pro tvorbu řešitelných sestav. Uživateli je umožněna změna velikosti hracích kostek a jejich vzhledu. Hra byla úspěšně implementována v objektově orientovaném jazyce Java za pomoci vývojového prostředí NetBeans IDE 5.5 a Java Development Kit ve verzi 6.0 Update 1. V dnešní době existuje nepřeberné množství různých variant MahJong her. Některé jsou opravdu kvalitní a propracované do posledního detailu jak po funkční, tak i po vizuální stránce. Jiné jsou na tom o poznání hůře. Některé obsahují nedokonalé generátory rozložení kostek, které mohou vytvořit i neřešitelnou sestavu. Jiné nezahrnují žádnou formu pomocné nápovědy. A žádná z dnešních MahJong her neumožňuje uživateli vytvářet vlastní herní sestavy. Hlavním přínosem této práce je vytvoření prostředí, které se funkčně přibližuje výše zmíněným „propracovaným“ aplikacím a vyplňuje „mezeru“ v tvorbě vlastních herních sestav. Námětů na pokračování práce je mnoho. Vývoj by mohl být zaměřen na vizuální stránku aplikace. Například rozšíření o 3D grafiku. Kostky by mohly být potaženy texturami, označená kostka by se osvítila reflektorem a okolí by bylo zahaleno například mlhou. Další rozšíření by se mohlo týkat tvarů kostek a možnosti jejich umístění na hrací plochu. Představme si namísto standardní kostky třeba válec nebo jehlan - uživatel by mohl z MahJong kostek sestavit třeba dokonalý model zmenšené Svatovítské katedrály. KAPITOLA 7. LITERATURA 26 7 Literatura [1] Brackeen D., Barker B., Vanhelsuwé L.: Vývoj her v jazyku Java, Grada Publishing, a.s., Praha 2004, s. 61 - 62. [2] Sun Microsystem: API specification for the Java 2 Platform Standard Edition 5.0, http://java.sun.com/j2se/1.5.0/docs/api/ [3] Petersen V. K.: Solitaire MahJongg, http://home.halden.net/vkp/vkp/index.html [4] JJM: Mah Jong Museum, http://www.mahjongmuseum.com [5] UJ: Shisen for Java, http://www.admoore.de/javashisen/jshome.html [6] Wikipedia: MahJong, http://en.wikipedia.org/wiki/Mahjong [7] Wikipedia: MahJong Solitaire, http://en.wikipedia.org/wiki/Mahjong_solitaire DODATEK A. SEZNAM POUŽITÝCH ZKRATEK 27 A Seznam použitých zkratek AWT Abstract Window Toolkit - knihovna pro tvorbu grafického uživatelského rozhraní COM Component Object Model - komponentový objektový model umožňující komunikaci mezi všemi objekty v něm registrované GUI Graphical User Interface - druh komunikace s počítačem mající podobu interaktivních grafických prvků JAR Java Archive - platformě nezávislý formát pro archivaci souborů JFC Java Foundation Classes - sestava knihoven pro tvorbu přenositelných grafických uživatelských rozhraní JVM Java Virtual Machine - abstraktní počítač, který obsahuje runtime system (realizuje spojení s hardwarem) a interpreter (vykonává binární kód) MIME Multipurpose Internet Mail Extensions - standardizovaný způsob označování obsahu zpráv PNG The Portable Network Graphics - grafický formát určený pro bezeztrátovou kompresi rastorové grafiky W3C World Wide Web Consortium - mezinárodní konsorcium dohlížející na vývoj internetových standardů XHTML eXtensible HyperText Markup Language - značkovací jazyk určený pro tvorbu hypertextových dokumentů DODATEK B. UŽIVATELSKÁ PŘÍRUČKA 28 B Uživatelská příručka B.1 Komu je hra určena Hra MahJong je určena každému, kdo rád potrápí své mozkové závity. Pro její úspěšné hraní je třeba umění strategie, předvídavosti, dobrá pamět’, ale stejně tak i štěstí. O MahJong se říká, že je to hra čínských filozofů. Ti si jejím hraním zahřívaly mozkové buňky a napadaly je nové filozofické myšlenky o smyslu života. B.2 Adresa hry, spuštění hry Pro spuštění hry MahJong stačí ve Vašem oblíbeném internetovém prohlížeči napsat do adresního pole jeden z následujících odkazů: • http://mahjong.wz.cz • http://mahjong.tym.cz První z výše zmíněných odkazuje na hlavní a druhý na záložní server s aplikací. B.3 Systémové požadavky Pro spuštění je třeba mít v počítači nainstalovaný Java JRE, verze 1.5.0 a vyšší. Na této stránce: http://www.java.com/en/download/installed.jsp můžete zjistit, jakou verzi máte nainstalovanou, stačí kliknout na tlačítko "Verify Installation". Pokud nemáte Java JRE nainstalovanou, můžete si nejnovější verzi stáhnou na adrese: http://www.java.com/getjava/ Po instalaci můžete herní applet spustit ve všech prohlížečích podporujících Java JRE plug-in (Internet Explorer, Mozzila Firefox, Opera, Konqueror, atd.). DODATEK B. UŽIVATELSKÁ PŘÍRUČKA B.4 29 Pravidla hry B.4.1 Jak hrát Na hrací plochu jsou v různých řadách, sloupcích a vrstvách umístěny hrací kostky, s různými symboly na lícové straně. Kostek je sudý počet, protože každá má k sobě párovou kostku, a cílem hry je takové kostky najít a odebrat. Dvě kostky jsou párové, jestliže mají na lícové straně shodné znaky. Na počátku hry je spoustu kostek zakrytých jinými a nejsou vidět, takže je třeba se k nim postupně dostat. Aby se párové kostky mohly odebrat, musejí být obě volné. Kostka je volná, pokud: • žádná jiná kostka na ní neleží nebo není částečně krytá (obr. B.1) Obrázek B.1: V těchto sestavách je možné odebrat jen kostku uprostřed. Kostky po stranách jsou kryté. • žádná jiná kostka s ní nesousedí napravo a současně nalevo a ani ji v těchto směrech částečně nezakrývá (obr. B.2) Obrázek B.2: V těchto sestavách lze odebrat jen krajní kostky. Kostka uprostřed je blokována sousedními kost- kami. Zdá se to být snadné, ale přesto hra může skončit i neúspěchem. A to, když na stole zůstanou kostky, které už nemohou být odebrány. Proto musíte být před odstraněním páru obezřetní. Není to jen hra štěstí, ale hlavně strategie. DODATEK B. UŽIVATELSKÁ PŘÍRUČKA 30 B.4.2 Motivy kostek MahJong se hraje se 168 kostkami, z nichž 136 je hracích a 32 prémiových. Kostky jsou rozděleny do 7 skupin nazvaných sady. Hrací kostky se dělí na řadové, kterých je 108, a zvláštní, kterých je 28. Řadové kostky se dělí do tří řad po 36, zvaných puntíky, bambusy a znaky. Každá obsahuje kostky ohodnocené od 1 do 9, od každé hodnoty 4 kusy. Zvláštní kostky jsou tři draci (bílý, zelený a červený) a čtyři větry (východní, jižní, západní a severní). Od každého druhu jsou ve hře 4 identické zvláštní kostky. Drakům, větrům, jedničkám a devítkám se říká velké kostky. Řadovým kostkám od 2 do 8 včetně, se říká malé. Prémiové kostky obsahují sadu čtyř květin a sadu čtyř ročních období. První řada kostek (obr. B.3) obsahuje 9 „puntíkových“ kostek (také známé jako kruhové, znakové nebo tečkované). Jejich číselná hodnota (1 až 9) je reprezentována počtem puntíků. Od každého druhu 4 kostky (celkem 36 kostek s motivem puntíků). Obrázek B.3: Kostky s motivem puntíků Druhá řada (obr. B.4) obsahuje 9 „bambusových“ kostek (také známé jako tyčové nebo duté). Jejich číselná hodnota je reprezentována počtem tyček. Od každého druhu 4 kostky (celkem 36 kostek s motivem bambusů). Na kostce číslo jedna je podle typu kostek zobrazován páv, vrabec (MahJong pták) nebo bambusový výhonek, podobající se ananasu. Obrázek B.4: Kostky s motivem bambusů Třetí řada (obr. B.5) obsahuje 9 „znakových“ kostek (také známých jako číselné, bledé, desetitisícé nebo prasklé). Červený symbol je čínské znamení pro 10 000 (vyjadřuje také blahobyt). Černý symbol nad ním je popis pro čísla od 1 do 9. Kostky jsou tak popsány čísly od 10 000 do 90 000. Některé typy kostek mohou navíc obsahovat arabské číslice, které byly přidány pro přiblížení hry lidem ze západního světa. Od každého druhu 4 kostky (celkem 36 kostek s motivem znaků). Obrázek B.5: Kostky s motivem znaků DODATEK B. UŽIVATELSKÁ PŘÍRUČKA 31 Čtvrtá řada (obr. B.6) začíná čtyřmi kostkami „ročního období“. Zleva doprava: jaro, léto, podzim, zima. Jsou potištěny bud’ obrázkem nebo čínským symbolem, popisujícím dané období. O každého druhu 4 kostky (celkem tedy 16 kostek s motivem ročního období). Obrázek B.6: Kostky s motivem ročních období Čtvrtá řada (obr. B.7) končí čtyřmi „větrnými“ kostkami. Zleva doprava: východní, jižní, západní, severní. Každá kostka zobrazuje čínský symbol popisující daný vítr. Pro zjednodušení, mohou být kostky opět potištěny prvním písmenem z jejich latinského názvu. Od každého druhu 4 kostky (celkem 16 kostek s motivem větrů). Obrázek B.7: Kostky s motivem větrů Pátá řada (obr. B.8) začíná čtyřmi „květinovými“ kostkami. Zleva doprava: violka, lilie, pivoňka, sasanka. Mohou být potištěny odpovídajícími znaky květin. Od každého druhu 4 kostky (celkem 16 kostek s motivem květin). Obrázek B.8: Kostky s motivem květin Pátá řada (obr. B.9) končí „dračími“ kostkami. Zleva doprava: zelený, bílý, červený. Bílý může být zobrazován jako prázdná kostka nebo jako obraz obdélníku s rysy červené nebo modré barvy. Od každého druhu čtyři kostky (celkem tedy 12 kostek s motivem draků). Obrázek B.9: Kostky s motivem draků DODATEK B. UŽIVATELSKÁ PŘÍRUČKA 32 B.4.3 Strategie hry • Pamatujte, že většina kostek se ve hře vyskytuje čtyřikrát. Když odstraníte pár, nezapomeňte, že v rozvržení stále existuje stejný pár. Není uvězněn vaším odstraněním prvního páru? Vybírejte moudře. • Soustřed’te vaše úsilí na dlouhé řady a vysoké sloupce. • Plánujte dopředu tolik tahů kolik jen můžete. • Jestliže jsou dostupné všechny čtyři kostky daného typu, odstraňte je všechny, snížíte tím zmatek na hracím poli. • Nelze se spoléhat na to, že vám počítač při nápovědě zobrazí nejlepší radu; ukáže vám jakýkoli pár, jež lze odebrat, ten který mu právě „přijde pod ruku“. • Identifikujte tolik odpovídajících párů jak jen je to možné. Kontrolujete tím kostky, aby nebyly zablokované. • Dávejte pozor na trojnásobné koskty(tři odpovídající volné kostky) a vybírejte opatrně, který pár odstraníte. Vyberte spíš ten, který blokuje důležité kostky. • Soustřed’te se na odstranění párů, které uvolní většinu kostek. B.5 Popis uživatelského prostředí B.5.1 Spuštění appletu Po spuštění hry v internetovém prohlížeči, se uživateli zobrazí hláška s dotazem na důvěryhodnost aplikace (obr. B.10). Po souhlasu s důvěryhodností bude mít uživatel možnost ukládat sestavy vytvořené v editoru a možnost zapsat se po úspěšném dokončení hry do tabulky nejlepších hráčů. Pokud s důvěryhodností nesouhlasí, nebude moci tyto akce provádět. Aplikace se po souhlasu i nesouhlasu načte a před uživatelem se zobrazí úvodní obrazovka. Obrázek B.10: Ověřovací certifikát DODATEK B. UŽIVATELSKÁ PŘÍRUČKA 33 B.5.2 Úvodní obrazovka Na této obrazovce (obr. B.11) jsou nejdůležitějšími prvky tlačítka umístěná v horní liště. Jsou zobrazována ve všech obrazovkách hry a jejich význam je následující: • Nová hra - zobrazení okna se seznamem uložených sestav. • Editor - spuštění editoru pro tvorbu nových sestav. • Pravidla - otevření okna s pravidly hry. • Nastavení - otevření okna s možnostmi změny vzhledu a velikosti kostek. • Tabulka nejlepších - otevření okna s tabulkou nejlepších hráčů. Obrázek B.11: Úvodní obrazovka DODATEK B. UŽIVATELSKÁ PŘÍRUČKA 34 B.5.3 Výběr nové hry Po výběru tlačítka Nová hra se uživateli zobrazí panel se všemi možnostmi rozložení uložených her (obr. B.12). Každá hra se může spustit s různým stupněm obtížnosti. K tomu slouží tlačítka Lehká, Těžká a tlačítko s obrázkem hry (sestava uložená přímo ve hře) nebo počtem kostek v sestavě (uživatelem uložené sestava). Hra se tedy může spustit v lehkém a těžkém módu. Tlačítko s obrázkem hry slouží pro spuštění s jakýmkoli stupněm obtížnosti. U her vytvořených uživatelem se navíc zobrazuje tlačítko Odebrat hru, které slouží k odstranění ze seznamu her. Obrázek B.12: Panel s možnostmi rozložení uložených her DODATEK B. UŽIVATELSKÁ PŘÍRUČKA 35 B.5.4 Prostředí editoru Po výběru tlačítka Editor se uživateli zobrazí nová obrazovka (obr. B.13) s černou mřížkou, která definuje velikost hrací plochy a červený obdélníček sloužící k zaměření pozice pro umístění kostky. Kostka se na zaměřenou pozici položí při stisknutí levého tlačítka myši a při stisknutí pravého tlačítka se odstraní. V horní liště se zobrazí nová tlačítka, jejichž význam je následující: • Vymazat vše - vymazání všech kostek, které uživatel umístil na hrací plochu. • Vytvořit hru - vytvoření nové hry ze sestavy kostek na hrací ploše. • Uložit hru - uložení sestavy do seznamu uložených her. Obrázek B.13: Prostředí editoru rozvržení kostek DODATEK B. UŽIVATELSKÁ PŘÍRUČKA 36 B.5.5 Prostředí spuštěné hry Po spuštění hry, at’ už z panelu s možnostmi rozložení uložených her nebo z editoru, se zobrazí obrazovka s vygenerovaným rozložením kostek (obr. B.14). Ve spodní liště je uveden celkový počet kostek na hrací ploše, počet volných páru kostek, které je možné odebrat a počitadlo odpočítávající čas od začátku hry. V horní liště se zobrazí nová tlačítka, jejichž význam je následující: • Přerovnat - vytvoření nového rozložení kostek v aktuální sestavě. • Zpět - vrátí na hrací plochu naposled odebraný pár kostek. • Nápověda - označí některý z volných párů kostek, který je možné odebrat. K celkovému času od spuštění hry bude připočteno 30 vteřin. • Pauza - pozastavení hry a její opětovné spuštění. Obrázek B.14: Prostředí nové hry DODATEK C. OBSAH PŘILOŽENÉHO CD 37 C Obsah přiloženého CD • ./ - kořenový adresář – readme.html - hypertextový dokument s návodem na instalaci a spuštění aplikace – readme.txt - textový dokument s návodem na instalaci a spuštění aplikace • application/ - adresář obsahující spustitelnou aplikaci – mahjong.html - hypertextový dokument se spustitelným Java appletem – mahjong.jar - digitálně podepsaný JAR archiv s přeloženými třídami pro spuštění aplikace • archive/ - adresář obsahující archivy všech částí bakalářské práce – doc.zip - archiv s dokumentací zdrojového kódu (javadoc) – html.zip - archiv s hypertextovým dokumentem zahrnujícím spustitelný Java applet a s digitálně podepsaným JAR archivem s přeloženými třídami pro spuštění aplikace – mahjong.zip - archiv se zdrojovým kódem aplikace – thesis.zip - archiv s vlastními texty bakalářské práce ve formátu PDF a PS • doc/ - adresář obsahující dokumentaci zdrojového kódu – doc.zip - archiv s dokumentací zdrojového kódu (javadoc) • source/ - adresář obsahující zdrojový kód – mahjong.zip - archiv se zdrojovým kódem aplikace • thesis/ - adresář obsahující vlastní text bakalářské práce – mahjong.pdf - text bakalářské práce ve formátu PDF – mahjong.ps - text bakalářské práce ve formátu PS
Podobné dokumenty
ostravská univerzita aplikace grafických informa č ních systém ů
seznámit účastníky kurzu s možnostmi aplikace počítačové grafiky v oblasti informačních
systémů. Tento předmět předpokládá určité znalosti práce s grafickými prostředky počítače.
Taktéž se předpokl...
Herní etogram kočkodana Brazzova (Cercopithecus neglectus)
(Cercopithecus neglectus). Práce je součástí projektu, kterého se účastní i další studenti z BF JU
v Českých Budějovicích (Richard Štochl, Stanislav Lhota) a PřF UK v Praze (Milada Petrů,
Radek Trn...
Certifikace znalostí Linuxu
Komerční organizace nesmí z vlastních certifikátů profitovat, zároveň by
z nich neměly prodělávat. Proto jim bude příslušet určitá část z ceny certifikátů,
která bude určena na náklady sp...
Percepce krajiny
Ačkoli převažují názory na estetickou hodnotu jako výsledek interakce mezi vlastnostmi krajiny a
psychologickými procesy v lidské mysli (např. Dvořák, 1983; Ulrich, 1983; Míchal, 2000; Valenta,
200...
Koncepce prevence kriminality města Plzně na léta
orgán jsou povinni u init všechna pot ebná opat ení k odhalení trestných in a zjišt ní jejich
pachatel ; jsou povinni init též nezbytná opat ení k p edcházení trestné innosti“. Další
právní normou,...
Postřehová hra Zadání projektu 1 Moje cíle
Ilustrace 3: tento obrázek popisují body výše (viz Kapitola 3, Grafické zpracování)
Processing 3.0 a p5.js
Volné pokračování přednášky z OpenAltu 2014. Představení nových vlastností
Processingu 3.0, nejnovější verze tohoto multiplatformního otevřeného relativně
jednoduchého programovacího jazyka, který ...