Podˇekování Velmi rád bych podˇekoval a vyslovil uznání všem, kteˇrí se podíleli na vzniku této práce. Pˇredevším vedoucímu bakaláˇrské práce Ing. Miroslavu Balíkovi, Ph.D., za trpˇelivost a pevné nervy pˇri vedení a poskytování praktických rad. Dále bych rád podˇekoval mé rodinˇe a pˇrátelum, ˚ kteˇrí mˇe podporovali a neustále pˇricházeli s novými nápady na zlepšení. ii
Prohlášení Prohlašuji, že jsem svou bakaláˇrskou práci vypracoval samostatnˇe a použil jsem pouze podklady uvedené v pˇriloženém seznamu. Nemám závažný duvod ˚ proti užití tohoto školního díla ve smyslu §60 Zákona cˇ . 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o zmˇenˇe nˇekterých zákonu˚ (autorský zákon).
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áˇrská práce se zabývá tvorbou softwarového rozhraní pro hraní hry MahJong. Hlavní cˇ ást popisuje návrh a implementaci pravidel pro generátor nových rozložení kostek. Další cˇ ást je zamˇerˇena na tvorbu editoru rozvržení kostek. Implementace je provedena v objektovˇe orientovaném jazyce Java. iv
Obsah Seznam obrázku˚
vii
Seznam tabulek
viii
1 Úvod 1.1 Historie hry MahJong . . . . . . . . ˇ e . . . . . . . 1.1.1 Poˇcátky v Cínˇ 1.1.2 Rozvoj v západním svˇetˇe . 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 . . . . . . . .
Umístˇení kostky na hrací ploše v závislosti na pozici ve vstupním rˇetˇezci . . . . Pozice kostky v rˇetˇezci s informacemi o rozmístˇení kostek v závislosti na umístˇení na hrací ploše . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
viii
17 19
KAPITOLA 1. ÚVOD
1
1 Úvod Tato bakaláˇrská práce se zabývá tvorbou prostˇredí pro hraní hry MahJong. Souˇcástí je rˇešení problematiky generátoru rozložení kostek, spolu s odhadem složitosti vygenerovaného rˇešení. Práce se také zabývá tvorbou editoru rozvržení kostek a implementací pravidel pro vytváˇrení rˇešitelných sestav. Nemalá cˇ ást je vˇenována i celkovému zakomponování do Java appletu. Práce je rozdˇelena do šesti kapitol. První kapitolou je tento úvod zabývající se historickým vývojem a pravidly hry, ve druhé je struˇcný pˇrehled problému˚ týkajících se tvorby práce, tˇretí kapitola je zamˇerˇena na popis analýzy implementace a návrhu rˇešení, cˇ tvrtá kapitola obsahuje podrobnˇejší popis metod a funkcí použitých bˇehem realizace, v páté kapitole je souhrn výsledku˚ testování aplikace a šestá kapitola je shrnutím výsledku˚ bakaláˇrské práce. Tato úvodní kapitola je rozdˇelena na dvˇe hlavní cˇ ásti. První cˇ ást je zamˇerˇena na historii a vývoj hry MahJong. Druhá je vˇenována popisu hry, vysvˇetlení významu obrázku˚ jednotlivých kostek a pravidel. Popis pravidel je uveden pro úplnost a je výnatkem ˇ z dodatku B „Uživatelská pˇríruˇcka“. Pˇrevážná cˇ á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
ˇ e Poˇcátky v Cínˇ
ˇ Puvodní ˚ MahJong je hra pocházející z Cíny, urˇcená pro cˇ tyˇri hráˇce. Pro její úspˇešné hraní je tˇreba umˇení strategie, pˇredvídavosti, dobrá pamˇet’, ale stejnˇe tak i štˇestí. V závislosti na variantˇe hry, muže ˚ být štˇestí rozhodujícím faktorem k úspˇechu. V Asii je MahJong velmi populární, stejnˇe jako tamní hazardní a poˇcítaˇcové hry. ˇ Jedna z Cínských legend rˇíká, že slavný cˇ ínský filozof Confucius vymyslel tuto hru již kolem roku 500 pˇred naším letopoˇctem. Podle legendy se hra objevovala v ruzných ˚ cˇ ínských státech ve stejné dobˇe, kdy je Confucius navštívil, aby uˇcil své nové doktríny. Také se rˇíká, že Confucius mˇel rád ptáky, což by vysvˇetlovalo jméno hry MahJong, v pˇrekladu vrabec. Další dohady naznaˇcují, že hra byla vyvinuta nˇekdy kolem roku 1850 z již existující cˇ ínské karetní hry domina. O této hˇre mnoho dˇejepiscu˚ tvrdí, že byla založena na cˇ ínské karetní hˇre Ma Tiae (v západním svˇetˇe známé jako Hanging Horse) na zaˇcátku vlády dynastie Ming (13681644). Tato hra se hrála se 40 papírovými kartami, narovnanými do cˇ tyˇr rˇad ohodnocených od 1 do 9 se cˇ tyˇrmi extra kartami s motivem kvˇetin. Toto je svým oznaˇcením velmi podobné dnešnímu cˇ íslování MahJongových kostek. Existuje mnohem více teorií o vzniku hry MahJong. Jedna tvrdí, že si ji pro zkrácení cˇ asu vymysleli armádní dustojníci ˚ pˇri cˇ ínském Povstání velkého míru v letech 1851-1864. Jiné, že ji vytvoˇril šlechtic žijící v Shanghaiské oblasti mezi léty 1870 až 1875. A další rˇíkají, že má puvod ˚ ve mˇestˇe Nigpo, kde ji kolem roku 1850 mˇeli vymyslet dva bratˇri ze starší hry Madiro. Neexistují žádné pˇrímé dukazy ˚ o tom, jak to s jejím zrodem vlastnˇe bylo. Ale ví se, jak to bylo s jejím koncem. Roku 1949 byla tato tradiˇcní cˇ ínská hra ve své mateˇrˇ ské zemi, pˇri založení Cí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ˇet stala jednou z oblíbených kratochvílí ˇ nan Cí ˇ u. ˚
KAPITOLA 1. ÚVOD 1.1.2
2
Rozvoj v západním svˇetˇe
Roku 1895 americký antropolog Stewart Culin sepsal první známý popis hry MahJong v jiném než cˇ ínském jazyce. Z nˇeho o pár let pozdˇeji cˇ erpal Joseph Park Babcock1 ve své knize Rules of the Mah-Jongg (Pravidla MahJongu), ve které pˇredstavil zjednodušenou verzi hry, kterou chtˇel pˇriblížit Americe. Hra se stala velmi populární a bˇehem cˇ asu si získávala stále více pˇríznivcu. ˚ Vznikalo mnoho úprav a pravidel lišících se od puvodních ˚ Babcockových, až v roce 1937 vznikl Národní svaz pro hru MahJong spolu s první americkou smˇernicí: The American Version of the Ancient Chinese Game (Americká verze starovˇeké cˇ ínské hry). 1.1.3
Aktuální vývoj
Dnes se popularita a charakteristika hry v ruzných ˚ zemích znaˇcnˇe odlišuje, tˇreba v Japonsku je kladen velký duraz ˚ na hazard. Mnoho ctitelu˚ vˇerˇí, že hra ztrácí na popularitˇe a snaží se ji oživit. Napˇríklad tvorbou video her, kde se bˇehem hry zobrazují obrázky žen, které se pˇri úspˇešném hraní svlékají. Vznikají i ruzné ˚ variace s lišícími se pravidly a zpusobem ˚ hraní. 1.1.4
Historie MahJong Solitaire
MahJong Solitaire, známý jako Shanghai Solitaire nebo poˇcítaˇcový MahJong, dnes oznaˇcován samotným slovem MahJong, je srovnávací hra typu pexeso, která místo karet užívá MahJongových kostek. První poˇcítaˇcová verze hry byla vytvoˇrena Brodie Lockardem2 v roce 1981 na poˇcítaˇci 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ˇripojovat z celého svˇeta. Online hra byla tak populární, že v roce 1986 vypustila firma Activision novou verzi hry zvanou Shanghai, urˇcenou pro poˇcítaˇce typu Apple Macintosh. Na programování a grafice se opˇet podílel Brodie Lockard. Hra se stala velmi úspˇešnou a bylo prodáno kolem 10 milionu˚ kopií. V dalších letech byly vyvíjeny nové verze hry, s propracovanˇejším grafickým rozhraním a zvukem a na kostkách se objevovaly nové symboly, jež nahradily tradiˇcní cˇ ínské obrázky. Jedna z verzí, známá jako TaiPei, byla v roce 1990 zahrnuta ve speciálním zábavním balíˇcku Microsoft Entertainment Pack pro Microsoft Windows 3.x, což vedlo k jejímu masovému rozšíˇrení. A taktéž nová verze operaˇcního systému firmy Microsoft Windows Vista obsahuje variantu této hry, zvanou Mahjong Titans.
ˇ e Joseph Park Babcock - americký inženýr, který strávil cˇ ást života v Cínˇ Brodie Lockard - americký programátor a podnikatel 3 PLATO - otevˇrený informaˇcní vzdˇelávací systém 1
2
KAPITOLA 1. ÚVOD
3
1.2 Pravidla 1.2.1
Jak hrát
Na hrací plochu jsou v ruzných ˚ rˇadách, sloupcích a vrstvách umístˇeny hrací kostky, s ruznými ˚ symboly na lícové stranˇe. Kostek je sudý poˇcet, protože každá má k sobˇe párovou kostku, a cílem hry je takové kostky najít a odebrat. Dvˇe kostky jsou párové, jestliže mají na lícové stranˇe shodné znaky. Na poˇcátku hry je spoustu kostek zakrytých jinými a nejsou vidˇet, takže je tˇreba se k nim postupnˇe dostat. Aby se párové kostky mohly odebrat, musejí být obˇe volné. Kostka je volná, pokud: • žádná jiná kostka na ní neleží nebo není cˇ ásteˇcnˇe krytá (obr. 1.1)
Obrázek 1.1: V tˇechto sestavách je možné odebrat jen kostku uprostˇred. Kostky po stranách jsou kryté.
• žádná jiná kostka s ní nesousedí napravo a souˇcasnˇe nalevo a ani ji v tˇechto smˇerech cˇ ásteˇcnˇe nezakrývá (obr. 1.2)
Obrázek 1.2: V tˇechto sestavách lze odebrat jen krajní kostky. Kostka uprostˇred je blokována sousedními kostkami.
Zdá se to být snadné, ale pˇresto hra muže ˚ skonˇcit i neúspˇechem. A to, když na stole zu˚ stanou kostky, které už nemohou být odebrány. Proto musíte být pˇred odstranˇením páru obezˇretní. Není to jen hra štˇestí, ale hlavnˇe 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ˇeleny do 7 skupin nazvaných sady. ˇ Hrací kostky se dˇelí na rˇadové, kterých je 108, a zvláštní, kterých je 28. Radové kostky se dˇelí do tˇrí rˇ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ˇri draci (bílý, zelený a cˇ ervený) a cˇ tyˇri vˇetry (východní, jižní, západní a severní). Od každého druhu jsou ve hˇre 4 identické zvláštní ˇ kostky. Drakum, ˚ vˇetrum, ˚ jedniˇckám a devítkám se rˇíká velké kostky. Radovým kostkám od 2 do 8 vˇcetnˇe, se rˇíká malé. Prémiové kostky obsahují sadu cˇ tyˇr kvˇetin a sadu cˇ tyˇr roˇcních období. První rˇada kostek (obr. 1.3) obsahuje 9 „puntíkových“ kostek (také známé jako kruhové, znakové nebo teˇckované). Jejich cˇ íselná hodnota (1 až 9) je reprezentována poˇctem puntíku. ˚ Od každého druhu 4 kostky (celkem 36 kostek s motivem puntíku). ˚
Obrázek 1.3: Kostky s motivem puntíku˚ Druhá rˇada (obr. 1.4) obsahuje 9 „bambusových“ kostek (také známé jako tyˇcové nebo duté). Jejich cˇ íselná hodnota je reprezentována poˇctem tyˇcek. Od každého druhu 4 kostky (celkem 36 kostek s motivem bambusu). ˚ Na kostce cˇ í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 bambusu˚ Tˇretí rˇada (obr. 1.5) obsahuje 9 „znakových“ kostek (také známých jako cˇ íselné, bledé, deseˇ titisícé nebo prasklé). Cervený symbol je cˇ ínské znamení pro 10 000 (vyjadˇruje také blahobyt). ˇ Cerný symbol nad ním je popis pro cˇ ísla od 1 do 9. Kostky jsou tak popsány cˇ ísly od 10 000 do 90 000. Nˇekteré typy kostek mohou navíc obsahovat arabské cˇ íslice, které byly pˇridány pro pˇriblížení hry lidem ze západního svˇeta. Od každého druhu 4 kostky (celkem 36 kostek s motivem znaku). ˚
Obrázek 1.5: Kostky s motivem znaku˚
KAPITOLA 1. ÚVOD
5
ˇ Ctvrtá rˇada (obr. 1.6) zaˇcíná cˇ tyˇrmi kostkami „roˇcního období“. Zleva doprava: jaro, léto, podzim, zima. Jsou potištˇeny bud’ obrázkem nebo cˇ ínským symbolem, popisujícím dané období. O každého druhu 4 kostky (celkem tedy 16 kostek s motivem roˇcního období).
Obrázek 1.6: Kostky s motivem roˇcních období ˇ Ctvrtá rˇada (obr. 1.7) konˇcí cˇ tyˇrmi „vˇetrnými“ kostkami. Zleva doprava: východní, jižní, západní, severní. Každá kostka zobrazuje cˇ ínský symbol popisující daný vítr. Pro zjednodušení, mohou být kostky opˇet potištˇeny prvním písmenem z jejich latinského názvu. Od každého druhu 4 kostky (celkem 16 kostek s motivem vˇetru). ˚
Obrázek 1.7: Kostky s motivem vˇetru˚ Pátá rˇada (obr. 1.8) zaˇcíná cˇ tyˇrmi „kvˇetinovými“ kostkami. Zleva doprava: violka, lilie, pivonka, ˇ sasanka. Mohou být potištˇeny odpovídajícími znaky kvˇetin. Od každého druhu 4 kostky (celkem 16 kostek s motivem kvˇetin).
Obrázek 1.8: Kostky s motivem kvˇetin Pátá rˇada (obr. 1.9) konˇcí „draˇcími“ kostkami. Zleva doprava: zelený, bílý, cˇ ervený. Bílý muže ˚ být zobrazován jako prázdná kostka nebo jako obraz obdélníku s rysy cˇ ervené nebo modré barvy. Od každého druhu cˇ tyˇri kostky (celkem tedy 12 kostek s motivem draku). ˚
Obrázek 1.9: Kostky s motivem draku˚
KAPITOLA 2. POPIS PROBLÉMU, SPECIFIKACE CÍLE
6
2 Popis problému, specifikace cíle Cílem práce je vytvoˇrit Java applet, který bude umožnovat ˇ hraní hry MahJong, vytváˇret rozvržení kostek, generovat rozložení kostek a vyhodnocovat kroky uživatele pˇri hraní hry.
2.1 Popis rˇešeného problému Protože se jedná o applet, odpadají problémy s instalací aplikace. Ta je umístˇena v nˇejakém úložném prostoru, na lokálním poˇcítaˇci nebo serveru, a uživatel ji spustí naˇctením pˇríslušné webové stránky, jež bude na aplikaci odkazovat. V takovém pˇrípadˇe kontrolu nad aplikací pˇrebírá prohlížeˇc, který v sobˇe samozˇrejmˇe musí mít implementovaný JVM1 . Applet není jen duvodem ˚ k radosti. Vzhledem k tomu, že obecnˇe se k appletu stahovanému ze sítˇe pˇristupuje jako k neduvˇ ˚ eryhodnému objektu, platí pro nˇej nˇekterá omezení cˇ innosti, jejichž cílem je zamezit provedení urˇcitých operací. Aˇckoliv tato omezení závisí na prohlížeˇcích, a mohou se mírnˇe odlišovat, obecnˇe se pˇredpokládají následující restrikce: • ukonˇcení práce virtuálního stroje, • spouštˇení jiných aplikací na stranˇe klienta, • pˇrístup k souborum ˚ na stranˇe 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ˇenných a cˇ tení nˇekterých z nich (tzv. citlivé promˇenné). Pˇri pokusu o jejich pˇrekroˇcení je vyvolána výjimka java.security.AccessControlException a applet je ukonˇcen. Existují však zpusoby ˚ jak tato omezení zmírnit. Napˇríklad zmˇenou oprávnˇení pro daný server, podepsáním appletu digitálním certifikátem nebo spuštˇením appletu jako aplikace - v takovém pˇrípadˇe se mu dostávají stejná práva jako má uživatel. Podíváme-li se na hierarchii tˇríd v Javˇe [2], zjistíme, že tˇrída JApplet je potomkem tˇrídy Applet. Ta je potomkem tˇrídy Panel a tím pádem i tˇrídy Container. Z toho plyne, že applet je nejen komponentou GUI2 , ale že rovnˇež muže ˚ další GUI komponenty obsahovat.
2.2 Vymezení cílu˚ 1. Vytvoˇrit generátor rozložení kostek, který podle vloženého rˇetˇezce s informacemi o umístˇení kostek, vytvoˇrí takové herní zadání, které bude mít vždy alesponˇ jedno rˇešení. 2. Vytvoˇrit editor rozvržení kostek, jehož výstupem bude jen takový rˇetˇezec s informacemi o umístˇení kostek, z nˇehož vytvoˇrené herní zadání bude mít alesponˇ jedno rˇešení. 3. Vytvoˇrit uživatelské rozhraní, které implementuje generátor rozložení kostek a editor rozvržení kostek spoleˇcnˇe s jejich metodami kontroly správnosti funkce a rˇešitelnosti jejich výstupu. ˚
1
Java Virtual Machine (Virtuální stroj) - abstraktní poˇcítaˇc, 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ˇcítaˇcem mající podobu interaktivních grafických prvku˚
ˇ KAPITOLA 3. ANALÝZA A NÁVRH REŠENÍ
7
3 Analýza a návrh rˇ ešení Tato kapitola se zabývá analýzou abstraktních problému˚ a cílu˚ práce a jejich pˇreformulování na konkrétní návrhy rˇešení. Duraz ˚ je kladen na popis návrhu generátoru rozložení kostek a principu jeho správné funkce. Další cˇ ást kapitoly je zamˇerˇena na editor rozvržení kostek a jeho pravidla pro vytvoˇrení rˇešitelných sestav. Závˇer kapitoly je vˇenován rˇešiteli rozložených sestav a urˇcování složitosti rˇešení.
3.1 Výbˇer implementaˇcního prostˇredí Jak bylo zmínˇeno, applet není tˇreba nikterak instalovat. K jeho spuštˇení je tˇreba se pˇripojit k urcˇ ité webové stránce, která odkazuje na aplikaci umístˇenou na serveru nebo lokálním poˇcítaˇci. Do takové urˇcité webové stránky je tˇreba applet nˇejak vložit. 3.1.1
Znaˇckovací jazyk XHTML
EXtensible HyperText Markup Language (rozšiˇritelný znaˇckovací jazyk pro hypertext), je znaˇckovací jazyk urˇcený pro tvorbu hypertextových dokumentu, ˚ neboli webových stránek, 1 vyvinutý konsorciem W3C . Každá webová stránka se skládá ze znaˇcek (tagu), ˚ které popisují její strukturu a umožnují ˇ do ní zahrnout i ruzné ˚ 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ˇcka object, která muže ˚ obsahovat ruzné ˚ atributy, z nichž nejduležitˇ ˚ ejší pro applet jsou: • classid - identifikace programu, který bude data interpretovat • type - typ objektu, • archive - jméno archivu s appletem, • height - výška objektu, • width - šíˇrka objektu. Promˇenné se danému objektu pˇredávají pomocí znaˇcky param, jejíž jsou atributy jsou: • name - jméno promˇenné, • value - hodnota promˇenné.
1
World Wide Web Consortium - mezinárodní konsorcium dohlížející na vývoj internetových standardu˚
ˇ KAPITOLA 3. ANALÝZA A NÁVRH REŠENÍ
8
Samotný zdrojový XHTML kód pro vkládání appletu muže ˚ mít nˇekolik podob a to v závislosti na tom, v jaké formˇe se budou data prohlížeˇci pˇredávat. Zda jako soubory typu java class nebo jako komprimovaný JAR2 . Pro prvnˇe zminovaný ˇ vypadá zdrojový text následovnˇe: Znaˇcka zaruˇcí, že v ní umístˇená cˇ ást kódu nebude použita v internetovém prohlížeˇci s jádrem Trident, tedy v Internet Exploreru (dále jen IE). Ten užívá jiných standardu˚ a proto se kód liší. V atributu classid je pro ostatní prohlížeˇce umístˇen název souboru s hlavní spouštˇecí tˇrídou. U IE tento atribut udává jedineˇcný rˇetˇezec, který specifikuje objekt pro Microsoft COM3 model. Jméno hlavní spouštˇecí tˇrídy se objektu pˇredává pomocí atributu code v tagu param. Atribut type definuje MIME4 specifikaci, která popisuje co data pˇredstavují. Význam ostatních parametru˚ je z výše uvedeného popisu zˇrejmý. Pro JAR soubor se zdrojový kód nepatrnˇe liší. Je specifikován atribut archive, který urˇcuje jméno JAR archivu. Atribut code ve znaˇcce param a atribut classid urˇcují jméno a umístˇení spouštˇecí tˇrídy. <param name="archive" value="MahJong.jar" /> <param name="code" value="mahjong.MahJong.class" /> <param name="archive" value="MahJong.jar" /> 2
Java Archive - platformˇe nezávislý formát pro archivaci souboru˚ Component Object Model - komponentový objektový model umožnující ˇ komunikaci mezi všemi objekty v nˇem registrované 4 Multipurpose Internet Mail Extensions - standardizovaný zpusob ˚ oznaˇcování obsahu zpráv 3
ˇ KAPITOLA 3. ANALÝZA A NÁVRH REŠ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ˇcitého tvaru (rozvržení) takovým zpusobem, ˚ aby hra mˇela alesponˇ jedno rˇešení. Na vstupu pˇrijí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ˇeno, že jsou kostky párové a že se každá dá odebrat jen se stejnou kostkou. Aby generátor vytvoˇril rˇ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ˇcet kostek. Aby bylo vytvoˇreno takovéto správné rozložení, postupnˇe pˇridává generátor na hrací plochu kostky ve stejných párech. To zaruˇcí, že kostek je sudý poˇcet a že každý naposled pˇridaný pár je stejný. Žádná z kostek však nemuže ˚ být položena náhodnˇe. Tˇreba v situaci se cˇ tyˇrmi volnými pozicemi vedle sebe. První párová kostka se pˇridá na první pozici zleva a druhá na tˇretí na pozici zleva (obr. 3.1 a). Další pár kostek se pˇridá na zbylé dvˇe pozice a vznikne rozložení kostek, které nemá podle daných pravidel rˇešení (obr. 3.1 b). Aby k takovým anomáliím nedocházelo, zahrnuje generátor sérii pravidel, která zaruˇcí, že po rozložení všech kostek bude mít hra alesponˇ jedno rˇešení.
ˇ ri volné pozice vedle sebe. První Obrázek 3.1: Chybné rozložení kostek, bez použití posuvného pravidla. Ctyˇ párová kostka se pˇridá na první pozici zleva a druhá na tˇretí na pozici zleva (ˇcást a). Další pár kostek se pˇridá na zbylé dvˇe pozice a vznikne rozložení kostek, které nemá rˇ ešení (ˇcást b).
První ze série pravidel, tzv. „posuvné pravidlo“, se provede pˇred pˇridáním každé kostky. Jeho funkce spoˇcívá v prozkoumání rˇádku, na nˇejž se má kostka pˇridat. Jestliže už je na rˇádku nˇejaká kostka položena, posune se puvodní ˚ kostka na sousední pozici vedle nalezené kostky, a to ve smˇeru od své puvodní ˚ pozice (obr. 3.2). Pakliže se na rˇádku jiná kostka nenajde, pˇridá se kostka na svou puvodní ˚ pozici.
Obrázek 3.2: Správné rozložení kostek, s posuvným pravidlem. Pokud na rˇ ádku kam se má pˇridat kostka, již nˇejaká kostka leží, posune se pˇridávaná kostka na sousední pozici vedle ní.
Po nˇekolika vygenerovaných rozloženích, se muže ˚ vyskytnout další problém. Opˇet v situaci se cˇ tyˇrmi volnými pozicemi vedle sebe. První pár stejných kostek se pˇridá na první dvˇe
ˇ KAPITOLA 3. ANALÝZA A NÁVRH REŠENÍ
10
pozice zleva a druhý pár na zbylé dvˇe pozice (obr. 3.3). Opˇet vznikne rozložení, které podle daných pravidel nemá rˇešení.
ˇ ri volné pozice vedle sebe. První pár stejObrázek 3.3: Chybné rozložení kostek, bez výmˇenného pravidla. Ctyˇ
ných kostek se pˇridá na první dvˇe pozice zleva a druhý pár na zbylé dvˇe pozice. Vznikne rozložení kostek, které nemá rˇ ešení.
Generátor proto musí zahrnout další pravidlo, tzv. „výmˇenné“. Jak bylo zmínˇeno výše, posuvné pravidlo pˇridává kostku na sousední pozici jiné kostky na stejném rˇádku. Princip výmˇenného pravidla spoˇcívá v kontrole právˇe této „jiné“ kostky. Jestliže je stejná nebo podobná pˇrisunuté kostce, provede se postupná výmˇena její pozice s pozicemi všech kostek ve smˇeru sousední kostky. Zjednodušenˇe rˇeˇceno, posunutá kostka se vyjme (obr. 3.4 a), všechny kostky na rˇádku se posunou o jednu pozici ve smˇeru vyjmuté kostky (obr. 3.4 b) a ta se nakonec pˇridá na pozici naposled posunuté kostky (obr. 3.4 c).
Obrázek 3.4: Správné rozložení kostek, s výmˇenným pravidlem. Stejná volná kostka se vyjme (ˇcást a), všechny kostky na rˇ ádku se posunou o jednu pozici ve smˇeru vyjmuté kostky (ˇcást b) a ta se nakonec pˇridá na pozici naposled posunuté kostky (ˇcást c). Podobný problém jako v pˇredchozím pˇrípadˇe muže ˚ nastat pˇri pˇridání po sobˇe následujících stejných páru˚ kostek. Tˇreba v situaci se šesti volnými pozicemi vedle sebe. První a druhý pár kostek se pˇridá stejnˇe jako v pˇredchozím pˇrípadˇe (obr. 3.5 a). První kostka tˇretího páru se pˇridá na pátou pozici a protože sousední kostka je stejná, pˇresune se podle výmˇenného pravidla na první pozici (obr. 3.5 b). Druhá kostka tˇretího páru se pˇridá na šestou pozici a protože sousední kostka je stejná, pˇresune se opˇet podle výmˇenného pravidla na první pozici (obr. 3.5 c). Opˇet vznikne rozložení, které podle daných pravidel nemá rˇešení. Pravidlo, které zabrání takovému chybnému rozložení je rozšíˇrením výmˇenného pravidla a nazývá se „pravidlo extra kostky“. Výmˇenné pravidlo pˇri zjištˇení stejné nebo podobné sousední kostky vymˇení postupnˇe pozici pˇridávané kostky se všemi ostatními kostkami na rˇádku (obr. 3.6 a). Pravidlo extra kostky poté provede detekci souseda naposled pˇridané kostky. Jestliže je tato sousední kostka opˇet stejná, provede se kontrola existence sousední pozice nejkrajnˇejší kostky na druhém konci rˇady (obr. 3.6 a) šedˇe zvýraznˇená pozice). Pakliže tato pozice existuje, pˇridá se na ni kostka stejného typu, jako puvodní ˚ sousední (obr. 3.6 b). Pˇridání takové
ˇ KAPITOLA 3. ANALÝZA A NÁVRH REŠ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ˇridají s pomocí posuvného a výmˇenného pravidla(ˇcást a). První kostka tˇretího páru se pˇridá na pátou pozici a výmˇenným pravidlem je pˇresunuta na první pozici (ˇcást b). Druhá kostka tˇretího páru se pˇridá na šestou pozici a výmˇenným pravidlem je pˇresunuta na první pozici (ˇcást c). Vznikne rozvržení kostek, které nemá rˇ ešení.
extra kostky probˇehne uvnitˇr výmˇenného pravidla, takže tato pozice nebude vybrána generátorem a na kostku nebude aplikováno výmˇenné pravidlo.
Obrázek 3.6: Správné rozložení kostek, s pravidlem extra kostky. První a druhý pár se pˇridají s pomocí po-
suvného a výmˇenného pravidla. První kostka tˇretího páru se pˇridá na pátou pozici a výmˇenným pravidlem je pˇresunuta na první pozici (ˇcást a). Pravidlo extra kostky provede detekci šesté pozice zleva (šedˇe zvýraznˇená). Ta existuje a je volná, proto se druhá kostka tˇretího páru pˇridá na šestou pozici(ˇcást b).
Nepˇridá-li se kostka pomocí žádného pravidla, tzn. pˇri prohledávání rˇádky kam má být pˇridána nebyla v obou smˇerech nalezena žádná jiná kostka, pˇridá se na puvodní ˚ pozici, pro ni urˇcenou. Všechna tato pravidla jsou aplikována nejen na kostky ve stejném rˇádku, ale i na všechny kostky, které svým umístˇením do rˇádku zasahují (obr. 3.7).
Obrázek 3.7: Správné rozložení kostek z ruzných ˚ rˇ ádku. ˚ Všechna pravidla generátoru rozložení kostek musejí být aplikovatelná i na kostky ležící mimo puvodnˇ ˚ e urˇcený rˇ ádek.
ˇ KAPITOLA 3. ANALÝZA A NÁVRH REŠENÍ
12
3.3 Editor rozvržení kostek 3.3.1
Popis editoru
Editor rozvržení kostek je jedna z vizuálních cˇ ástí aplikace. V jeho prostˇredí muže ˚ uživatel vytváˇret sestavy prázdných kostek (kostky bez obrázku), které definují do jakého tvaru se po dokonˇcení oznaˇcené kostky rozloží. Po otevˇrení editoru se zobrazí mˇrížka identická s velikostí hrací plochy a cˇ ervený obdélníˇcek o velikosti hrací kostky. Obdélníˇcek mˇení svou pozici v závislosti na pozici kurzoru myši a „pˇrilepuje“ se na cˇ ásti bunek ˇ editorové mˇrížky. Muže ˚ být umístˇen bud’ celý na jedné bunce ˇ (obr. 3.8 a) nebo na dvou bunkách, ˇ na každé polovinou (obr. 3.8 b) a nebo na cˇ tyˇrech bunkách, ˇ na každé cˇ tvrtinou (obr. 3.8 c). Pˇri stisknutí levého tlaˇcítka myši se na pozici, kterou obdélníˇcek zamˇerˇuje umístí prázdná kostka. Pˇri najetí obdélníˇcku na kostku a stisknutí pravého tlaˇcítka myši se kostka odebere.
Obrázek 3.8: Umístˇení zamˇerˇ ovacího obdélníku v editoru rozvržení. Celý na jedné bunce ˇ (ˇcást a), na dvou bunkách ˇ (ˇcást b), na cˇ tyˇrech bunkách ˇ (ˇcást c).
Po vytvoˇrení sestavy a stisknutí tlaˇcítka pro tvorbu hry se provede série pravidel, které pˇrekontrolují zda muže ˚ být daná sestava kostek po rozložení na hrací plochu rˇešitelná. Pokud budou pravidla vyhodnocena pozitivnˇe, vygeneruje editor na svém výstupu rˇetˇezec s informacemi o umístˇení kostek. Po negativním vyhodnocení pravidel se na obrazovce zobrazí varovná hláška spolu s návrhem rˇešení. 3.3.2
Pravidla pro tvorbu sestav
Každá uživatelem vytvoˇrená sestava nemusí být rˇešitelná, proto editor zahrnuje urˇcitá pravidla, která její rˇešitelnost kontrolují. Po spuštˇení nové hry musí být na hrací ploše umístˇen sudý poˇcet kostek. První pravidlo proto kontroluje, zda se uživatelem vytvoˇrená sestava skládá taktéž ze sudého poˇctu kostek. Další neˇrešitelná sestava by mohla vzniknout skládáním kostek do jediného sloupce nebo do sloupce jehož výška z kostek je vˇetší než poˇcet kostek ležících mimo nˇej (obr. 3.9 a). Podle pravidel muže ˚ uživatel odebrat jen nejvyšší kostku ve sloupci. Mohla by tak nastat situace, kdy by mˇel možnost oznaˇcit jedinou kostku a k ní žádnou jinou párovou. Editor proto zahrnuje další pravidlo, které kontroluje, aby poˇcet všech kostek ležících mimo nejvyšší sloupec byl minimálnˇe roven poˇctu kostek ve sloupci (obr. 3.9 b). Díky tomu je po rozložení možné oznaˇcit alesponˇ dvˇe kostky a sestava má rˇešení.
ˇ KAPITOLA 3. ANALÝZA A NÁVRH REŠENÍ
13
Obrázek 3.9: Možnosti rozmístˇení kostek v editoru. Kostky jsou umístˇeny ve sloupci, jehož výška je vˇetší než
poˇcet kostek ležících mimo nˇej - sestava nemá rˇ ešení (ˇcást a). Poˇcet kostek ležících mimo nejvyšší sloupec je roven poˇctu kostek ve sloupci - sestava je rˇ ešitelná (ˇcást b).
ˇ 3.4 Rešitel rozložených sestav 3.4.1
Popis rˇešitele
ˇ Rešitel rozložených sestav je jedna z doplnkových ˇ cˇ ástí aplikace. Není potˇrebná pro její správný chod, ale je duležitá ˚ pro souˇcásti, o které ji rozšiˇruje. Mezi nˇe mimo jiné patˇrí: • informace o poˇctu zbývajících kostek na hrací ploše, • informace o poˇctu kostek, které lze aktuálnˇe odebrat, • zvýraznˇení páru˚ kostek, které lze aktuálnˇe odebrat, • vrácení naposledy odebraného páru kostek zpˇet do hry, • definování složitosti sestav a možnosti spuštˇení hry s ruznou ˚ obtížností. 3.4.2
Definování složitosti sestav
Každá hra se dá podle poˇctu kostek sestavit nˇekolika nebo mnoha ruznými ˚ zpusoby. ˚ V závislosti na zpusobu ˚ sestavení hry se muže ˚ odebrat urˇcitý poˇcet volných párových kostek. Po každém následujícím odebrání páru kostek se pˇrepoˇcítá poˇcet zbývajících volných párových kostek a pˇriˇcte se k poˇctu kostek odebraných v pˇredchozích tazích. Výsledný souˇcet po odebrání všech kostek spolu s celkovým poˇctem kostek v sestavˇe má pˇrímý vliv na urˇcování složitosti sestavy. Ta je definována celým cˇ íslem, podle nˇehož se urˇcí stupenˇ obtížnosti.
3.5 Návrh uživatelského prostˇredí V dnešní dobˇe operaˇcních systému˚ 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ˇekolik knihoven pro tvorbu a práci s vizuálními komponentami (okna, tlaˇcítka, dialogy, obrázky, atd.).
ˇ KAPITOLA 3. ANALÝZA A NÁVRH REŠENÍ 3.5.1
14
Grafické knihovny AWT a Swing
Knihovna AWT (Abstract Window Toolkit) je souˇcástí Java Core API5 a je první implementací grafického rozhraní v Javˇe. Programy psané pomocí této knihovny jsou v duchu jazyka Java plnˇe pˇrenositelné, ale zárovenˇ využívají nativních prvku˚ operaˇcního systému na nˇemž jsou spuštˇeny. To pˇrináší nejen vzhledové, ale i ovládací komplikace. Proto se tato knihovna pro tvorbu vizuálních komponent témˇerˇ nepoužívá. Na použitelnosti ale nestrádá, obsahuje nˇekolik dalších balíˇcku˚ (event, graphics, image, color, atd.), které fungují jako podpurná ˚ cˇ ást pro novˇejší grafické knihovny. Swing je další z grafických knihoven umožnujících ˇ tvorbu a práci s vizuálními komponentami. Je souˇcástí JFC6 , zárovenˇ je nadstavbou AWT (Abstract Window Toolkit) a taktéž je zahrnuta v Java Core API. Její hlavní výhody oproti knihovnˇe AWT jsou: • Nepoužívá nativní komponenty. Aplikace psané s knihovnou Swing jsou zcela platformˇe nezávislé. • Bohatší množství komponent. Mohou také intenzivnˇeji využívat dˇediˇcnost a kompozici a tak složitˇejší komponenty vznikají zdˇedˇením nebo složením z jednodušších. • Dusledné ˚ oddˇelení funkcionality od vzhledu. Rozšíˇrení o nastavení ruzného ˚ vzhledu GUI. • Oddˇelení dat od objektu˚ u složitˇejších komponent (napˇr. strom, tabulka). Zlepšení možností pˇrizpusobení ˚ a rozšíˇrení o opakovanou použitelnost dat. • Rychlejší a flexibilnˇejší.
5 Application Programming Interface (Aplikaˇcní programové rozhraní) - základní knihovny pro psaní programu˚ v Javˇe 6 Java Foundation Classes - sestava knihoven pro tvorbu pˇrenositelných grafických uživatelských rozhraní
KAPITOLA 4. REALIZACE
15
4 Realizace Souˇcástí této kapitoly je podrobnˇejší popis tˇríd, metod a algoritmu˚ použitých pro tvorbu uživatelského prostˇredí hry MahJong a realizaci generátoru a editoru kostek. Generátor a editor kostek jsou zámˇernˇe tvoˇreny jako dvˇe na sobˇe nezávislé aplikace. Jako spojení od editoru ke generátoru funguje rˇetˇezec s informacemi o rozmístˇení kostek, který muže ˚ být pˇri znalosti jeho struktury vytvoˇren i v jiném editoru.
4.1 Implementace základních objektu˚ Než budou popsány hlavní funkce jednotlivých cˇ ástí aplikace, je tˇreba definovat termíny, které jejich popis doplnují ˇ a zjednodušují. Tato cˇ ást je vˇenována tomuto popisu a jsou zde rozebrány funkce a vlastnosti nejzákladnˇejších objektu. ˚ 4.1.1
Reprezentace hrací plochy
Hrací plocha je vyhrazená cˇ ást okna z hlavní komponenty typu tˇrídy JApplet, urˇcená pro vykreslování kostek. Lze si ji pˇredstavit jako imaginární mˇrížku o velikosti 15 sloupcu˚ a 8 rˇádku. ˚ Všechny bunky ˇ v této mˇrížce mají stejnou velikost a pˇredstavují pozici pro umístˇení hrací kostky. V prostˇredí editoru rozvržení kostek je uživateli tato mˇrížka zobrazena, což umožnuje ˇ lepší orientaci pˇri umíst’ování kostek na hrací plochu. Struktura hrací plochy se mimo jiné skládá z: • vektorKostek - promˇenná typu Vector, obsahuje všechny kostky umístˇené na hrací ploše, • jmenoHry - promˇenná typu String, obsahuje název aktuálnˇe 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ˇredstavit napˇríklad oznaˇcení kostky. To se provede najetím kurzoru myši na její pozici a následným stiskem levého tlaˇcítka myši. Oznaˇcení kostky je realizováno pˇridáním události typu MousePressed ze skupiny událostí MouseEvent. Pˇri stisknutí levého tlaˇcítka myši se uloží x a y souˇradnice kurzoru myši. Ty se porovnají se všemi kostkami ve vektoru kostek a z nˇej se vyberou takové kostky, které na tˇechto souˇradnicích leží. Muž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ˇcí. 4.1.2
Reprezentace kostky
Každá kostka na hrací ploše je objekt popsaný tˇrídou Kostka. Její struktura se skládá z následujících položek: • radek, sloupec, vrstva - promˇenné typu int, které reprezentují umístˇení kostky na hrací ploše pro výpoˇcetní algoritmy, • pozice - promˇenná typu Point(int, int), reprezentuje pozici kostky v rovinné soustavˇe souˇradnic (osy x, y) na hrací ploše, do které bude kostka vykreslena, • posun - promˇenná datového typu enum PosunKostky, popisuje zpusob ˚ posunutí kostky vuˇ ˚ ci své puvodní ˚ pozici, • id - promˇenná typu int, která udává jednoznaˇcný identifikaˇcní kód identické skupiny kostek (celkem 42 skupin), • vybrana - promˇenná typu boolean, definuje zda je kostka uživatelem oznaˇcena.
KAPITOLA 4. REALIZACE 4.1.3
16
Reprezentace posunu kostky
Kostky se umíst’ují do rˇádku, ˚ sloupcu˚ a vrstev. Nˇekteré kostky mohou být umístˇeny ve dvou rˇádcích nebo i ve dvou sloupcích. Každá je však reprezentována jen jednou hodnotou rˇádku a sloupce, což neumožnuje ˇ takové umístˇení kostky popsat. Kostka má proto definovanou promˇennou posun, která urˇcuje jakým zpusobem ˚ bude vuˇ ˚ ci svému rˇádku nebo sloupci posunuta. Jinak rˇeˇceno, posun kostky rˇíká na kolika bunkách ˇ z mˇrížky hrací plochy bude kostka umístˇena. Posun je promˇenná datového typu enum PosunKostky, která definuje následující položky: • zadny(1) - žádný posun, kostka je položena na jedné bunce ˇ (obr. 4.1 a), • posunDolu(2) - posun o pul ˚ rˇádku dolu˚ od svého puvodního ˚ rˇádku, kostka je položena na dvou bunkách ˇ (obr. 4.1 b), • posunVpravoDolu(3) - posun o pul ˚ rˇádku od svého puvodního ˚ rˇádku a o pul ˚ sloupce od svého puvodního ˚ sloupce, kostka je položena na cˇ tyˇrech bunkách ˇ (obr. 4.1 c).
Obrázek 4.1: Posunutí kostky na hrací ploše. Žádný posun (ˇcást a), posun o pul ˚ rˇ ádku dolu˚ (ˇcást b), posun o pul ˚ rˇ ádku od svého puvodního ˚ rˇ ádku a o pul ˚ sloupce od svého puvodního ˚ sloupce (ˇcá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ˇekteré z položek datového typu, vrátí hodnotu true. V opaˇcném pˇrípadˇe vrátí false. • int posunNaZnak(PosunKostky) - pokud se vstupní hodnota shoduje s názvem nˇekteré položky z datového typu, vrátí hodnotu jejího atributu. V opaˇcném pˇrípadˇe vrátí nulu. • PosunKostky znakNaPosun(int) - pokud se vstupní hodnota shoduje s atributem nˇekteré z položek datového typu, vrátí název této položky. V opaˇcném pˇrípadˇe vrátí null.
4.2 Generátor rozložení kostek Úkolem generátoru je rozmístit kostky na hrací plochu do urˇcitého tvaru (rozvržení) takovým zpusobem, ˚ aby hra mˇela alesponˇ jedno rˇešení. Na vstupu pˇrijí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ˇeny jsou uloženy v rˇetˇezci typu tˇrídy String. Ten je sestaven z numerických hodnot a každý jeho byte pˇredstavuje jednu kostku.
KAPITOLA 4. REALIZACE
17
Atribut posunu kostky je roven cˇ íselné hodnotˇe daného bytu. Pozice bytu v rˇetˇezci udává umístˇení kostky do imaginární mˇrížky na hrací ploše (viz tab. 4.1). Pozice v rˇetˇezci 0 15 119 120
Pozice v mˇrížce hrací plochy 1 16 120 121
Umístˇení na hrací ploše rˇádek 1, sloupec 1, vrstva 1 rˇádek 2, sloupec 1, vrstva 1 rˇádek 8, sloupec 15, vrstva 1 rˇádek 1, sloupec 1, vrstva 2
Tabulka 4.1: Pozice kostky na hrací ploše v závislosti na pozici ve vstupním rˇ etˇezci pro generátor rozložení kostek.
Pˇri prozkoumání tabulky je patrné, že pozice bytu v rˇetˇezci s informacemi je o jednu menší než cˇ íselná hodnota pozice kostky v mˇrížce hrací plochy. Délka rˇetˇezce udává poˇcet 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ˇcní cˇ ásti. Úložná cˇ ást je typu Vector a obsahuje všechny volné pozice, na nˇež se mohou kostky umístit. Funkˇcní cˇ ást je sestavena z algoritmu, který na tyto volné pozice kostky pokládá. Pˇri 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ˇrijme vstupní rˇetˇezec s informacemi o umístˇení kostek. Ten postupnˇe 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 rˇetˇezce do vektoru s volnými pozicemi. Po projetí celého rˇetˇezce 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ˇer typu kostky, která by mˇela být umístˇena na hrací plochu. Tento výbˇer se provádí v závislosti na velikosti promˇenné vektorKostek, která obsahuje všechny kostky umístˇené na hrací ploše. Je-li poˇcet kostek ve vektoru kostek nulový nebo sudý, výbˇer kostky se provede. Pakliže je poˇcet kostek lichý, výbˇer se neprovede a generátor pracuje se se stejným typem kostky jako v pˇredchozím pˇrípadˇe. To zaruˇcí, že se kostky pˇridávají postupnˇe ve stejných párech a každá bude mít svého „dvojníka“, se kterým se bude moci odebrat. Po urˇcení typu kostky pro pˇridání se vybere jedna pozice z vektoru volných pozic, na kterou by se mˇela kostka pˇridat. Zámˇernˇe je uvedeno slovo „mˇela“, protože jak je v pˇredchozí kapitole „Analýza a návrh rˇešení“ psáno, generátor zahrnuje sérii pravidel, která testují zda muže ˚ být kostka na prvnˇe vybranou pozici pˇridána nebo ne. 4.2.3
Implementace pravidel
Po urˇcení typu a pozice kostky se provede prozkoumání rˇádku, na nˇejž se má kostka pˇridat. Nejprve se procházejí bunky ˇ od puvodní ˚ pozice na rˇádku vpravo a pokud není nalezena žádná kostka, procházejí se bunky ˇ vlevo. Pro každý smˇer se testují všechny tˇri pravidla. Neprozkoumává se však jen puvodní ˚ rˇádek. Kostky mohou být posunuty o pul ˚ rˇádku od své puvodní ˚ pozice dolu˚ a tak by mohly kostky z vyššího rˇádku zasahovat do prozkoumávaného rˇádku. Proto se musí testovat i vyšší rˇádek. Jestliže se na nˇem najde kostka s posunem dolu, ˚ položí se pˇridávaná kostka na sousední pozici vedle ní. Jestliže sousední kostka z vyššího rˇádku s posunem dolu˚ bude stejná, provede se výmˇena podle výmˇenného pravidla. Taková výmˇena se provede i se všemi kostkami z vyšších rˇádku, ˚ které zasahují do prozkoumávaného rˇádku. Zámˇernˇe je psáno v množném cˇ ísle „vyšších
KAPITOLA 4. REALIZACE
18
rˇádku“, ˚ protože cˇ íslo prozkoumávaného rˇádku se muže ˚ zmˇenit a tím pádem se zmˇení i cˇ íslo vyššího rˇádku. Tˇreba v situaci, kdy se kostka položí na sousední pozici vedle párové kostky s posunem dolu, která leží na vyšším rˇádku. Ta má vedle sebe kostku ležící na stejném rˇádku, ale bez posunu. A ta má vedle sebe také sousední kostku posunutou smˇerem dolu, ˚ ležící od ní o rˇádek výše (obr. 4.2 a).
Obrázek 4.2: Realizace posuvného pravidla pro kostky ležící na ruzných ˚ rˇ ádcích. Vyjme se stejná krajní kostka. Všechny její sousední kostky se posunou ve smˇeru vyjmuté kostky na pozici své puvodní ˚ sousední kostky pozici. Vyjmutá kostka se pˇridá na pozici po naposled posunuté kostce (ˇcást b).
V takovém pˇrípadˇe se vyjme stejná krajní kostka. Všechny její sousední kostky se posunou o jednu pozici ve smˇeru vyjmuté kostky. Dostanou se tedy na pozici své puvodní ˚ sousední kostky a získají její hodnotu posunu. Vyjmutá kostka, která mˇela být puvodnˇ ˚ e pˇridána jako první se po posunu všech kostek položí na uvolnˇenou pozici po naposled posunuté kostce a taktéž získá její hodnotu posunu (obr. 4.2 b).
4.3 Editor rozvržení kostek V prostˇredí editoru lze vytváˇret sestavy, které se dají pomocí generátoru rozložit v hratelnou hru. Muže ˚ být vytvoˇrena jen sestava, která by po rozložení kostek mˇela alesponˇ jedno rˇešení. Výstupem editoru je rˇetˇezec s informacemi o umístˇení kostek. 4.3.1
Realizace editoru
Editor rozvržení kostek se skládá z úložné a funkˇcní cˇ ásti. Úložná cˇ ást je typu Vector a obsahuje všechny uživatelem umístˇené kostky na hrací ploše. Funkˇcní cˇ ást je sestavena z algoritmu pro tvorbu výstupního rˇetˇezce s informacemi o umístˇení kostek a z metod pro zachytávání uživatelských událostí. Pˇri spuštˇení editoru se uživateli zobrazí mˇrížka o velikosti hrací plochy a cˇ ervený obdélníˇcek o velikosti hrací kostky. Pozice obdélníˇcku se mˇení v závislosti na pozici kurzoru myši. Pˇri stisknutí levého tlaˇcítka myši se na pozici obdélníˇcku položí kostka a pˇri stisku pravého tlaˇcítka se kostka odstraní. Vše je realizováno pˇridáním událostí myši na kreslící plochu, tedy na objekt typu tˇrí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ˇradnice kurzoru myši na komponentˇe, cˇ ímž je realizován pohyb cˇ erveného zamˇerˇovacího obdélníˇcku. Pozice obdélníˇcku je zmˇenˇena v závislosti na hodnotˇe tˇechto souˇradnic 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ˇredí editoru se cˇ ásteˇcnˇe liší. Souˇradnice se ukládají pˇri stisknutí pravého i levého tlaˇcítka myši a závislosti na tom, které bylo stisknuto se provedou ruzné ˚ akce. Pˇri stisku levého tlaˇcítka se souˇradnice kurzoru porovnají se všemi kostkami v editorovém vektoru kostek. Jestliže se najde kostka, která dané souˇradnice obsahuje, pˇridá se nová kostka na ní (tedy o vrstvu výše). Pakliže se žádná taková nenajde, pˇridá se nová kostka na pozici, kterou oznaˇcuje cˇ ervený zamˇerˇovací obdélníˇcek (tedy do první vrstvy). Pˇri stisknutí pravého tlaˇcítka myši se opˇet projede vektor kostek a jestliže se najde kostka obsahující dané souˇradnice, vymaže se. Po stisknutí pravého nebo levého tlaˇcítka se kreslící plocha aktualizuje. 4.3.2
Implementace pravidel
Editor muže ˚ vytvoˇrit jen takovou sestavu kostek, která bude mít minimálnˇe jedno rˇešení. Aby tomu tak bylo zahrnuje urˇcitá pravidla, která tuto podmínku zaruˇcí. Pravidla jsou definována takto: • Na hrací ploše musí být rozložen jen sudý poˇcet kostek. • Poˇcet kostek ležících mimo nejvyšší sloupec musí být minimálnˇe roven poˇctu kostek ve sloupci. Úložná cˇ ást editoru je typu Vector a obsahuje všechny uživatelem položené kostky na hrací ploše. Jestliže je poˇcet kostek v tomto vektoru sudý, potom je i poˇcet kostek na hrací ploše také sudý a první pravidlo je splnˇeno. Pro urˇcení 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 rˇádku a sloupce. Poté se ze stejného vektoru vyberou všechny kostky, které se shodují s hodnotami rˇádku a sloupce nejvyšší kostky. Jejich poˇcet je roven výšce nejvyššího sloupce v sestavˇe. Druhé pravidlo je splnˇeno, jestliže je souˇcet všech ostatních kostek vˇetší nebo roven výšce nejvyššího sloupce. 4.3.3
Vytvoˇrení rˇetˇezce s informacemi o rozmístˇení kostek
Jestliže budou všechna editorová pravidla vyhodnocena kladnˇe, vytvoˇrí se rˇetˇezec s informacemi o rozmístˇení kostek. Jeho výsledná struktura je shodná s rˇetˇezcem popisovaným v oddílu 4.2.1 „Vstupní informace“. Muže ˚ být tedy rovnou poslán na vstup generátoru rozložení kostek a vytvoˇrena z nˇej nová hra. ˇ ezec pro zápis je objekt typu tˇrídy StringBuffer, jehož záznam lze jednoduše a bez Retˇ ztráty mˇenit. Jeho velikost je stejná jako velikost editorového vektoru kostek (podle poˇctu položek v nˇem). Postupnˇe jsou procházeny všechny položky vektoru kostek a u každé je z hodnoty rˇádku, sloupce a vrstvy spoˇcítána pozice v rˇetˇezci (viz tab. 4.2). Umístˇení na hrací ploše rˇádek 1, sloupec 1, vrstva 1 rˇádek 2, sloupec 1, vrstva 1 rˇádek 8, sloupec 15, vrstva 1 rˇádek 1, sloupec 1, vrstva 2
Pozice v mˇrížce hrací plochy 1 16 120 121
Pozice v rˇetˇezci 0 15 119 120
Tabulka 4.2: Pozice kostky v rˇ etˇezci s informacemi o rozmístˇení kostek v závislosti na umístˇení na hrací ploše. Na tuto pozici je v rˇetˇezci zapsána cˇ íselná hodnota pˇredstavují 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
rˇetˇezec pˇreveden na objekt typu tˇrídy String, který je nemˇenný a poskytuje vyšší odolnost vuˇ ˚ ci chybám.
4.4 Uživatelské rozhraní V tomto oddílu je kladen duraz ˚ na vizuální stránku aplikace, na celkové rozvržení a grafický návrh. Jsou zde rˇešeny problémy naˇcítání obrazových reprezentací kostek a blikání obrazu pˇri pˇrekreslování obrazovky. 4.4.1
Základní rozvržení
V kapitole 3.5 „Návrh uživatelského prostˇredí“ jsou popsány výhody a nevýhody jednotlivých grafických knihoven. Pro tvorbu pˇrenositelného grafického rozhraní se jako nejlepší jeví použití knihovny Swing. Proto je celá vizuální cˇ ást appletu sestavena z objektu˚ této knihovny. Okno aplikace je rozdˇeleno do tˇrech hlavních cˇ ástí: • výbˇerová - obsahuje hlavní a pomocnou lištu s tlaˇcítky, • informaˇcní - informuje uživatele o prubˇ ˚ ehu hry, • aktivní - zobrazovací cˇ ást, která mˇení obrazovku podle zvoleného prostˇredí (úvodní obrazovka, editor, spuštˇená hra atd.). Výbˇerová cˇ ást je tvoˇrena komponentou typu tˇrídy JPanel, která obsahuje tˇri lišty s tlaˇcítky typu tˇrídy JToolBar. Tlaˇcítka první lišty jsou duležitá ˚ pro ovládání celé hry, proto je lišta stále zobrazená. Tlaˇcítka druhé a tˇretí lišty jsou specifická pro prostˇredí editoru a spuštˇené hry, proto jsou lišty viditelné jen v tˇechto prostˇredí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ˇcní cˇ ást je tvoˇrena komponentou typu tˇrídy JPanel, která obsahuje popisky typu tˇrídy JLabel. První popisek zobrazuje aktuální poˇcet rozložených kostek na hrací ploše získaný z rˇešitele. Druhý popisek zobrazuje informaci o poˇctu volných páru˚ kostek, které lze odebrat - taktéž získanou z rˇešitele. A na tˇretím popisku je zobrazen cˇ as od zaˇcátku nové hry. Aktivní cˇ ást je vyhrazená cˇ ást okna z komponenty JAppet, která v prostˇredí editoru a spuštˇené hry plní funkci hrací plochy popsané v oddílu 4.1.1 „Reprezentace hrací plochy“. Mimo tato prostˇredí je pˇrekrývána komponentou typu tˇrídy JScrollPane obsahující komponentu typu tˇrídy JPanel, do níž mohou být vkládány další objekty (napˇr. panel s výbˇerem obtížnosti pro spuštˇení hry). Zakrývání a zobrazování je opˇet realizováno pomocí metody setVisible(boolean). 4.4.2
Dvojitý buffering
V prostˇredí editoru a spuštˇené hry jsou zachytávány události vzniklé stisknutím tlaˇcítka myši nebo jejím posunem. Souˇcástí jejich obslužného kódu je volání metody repaint(), která spolupracuje s metodou paint(), pomocí níž dochází k pˇrekreslování obrazovky. To je provedeno vymazáním a následným vykresleným nového obsahu. K této zmˇenˇe dochází velmi rychle a obraz bliká. K potlaˇcení tohoto nežádoucího jevu je použita metoda „dvojitého bufferu“, která místo pˇrímého kreslení na obrazovku nejprve ukládá data do pamˇet’ové oblasti a odtud jsou všechna pˇrenesena na obrazovku. Obrazovka je tak celá aktualizována najednou a uživateli se žádné blikání nezobrazuje.
KAPITOLA 4. REALIZACE
21
Pamˇet’ová oblast je realizována objektem typu Image, který je vytvoˇren metodou createImage(int, int) ze tˇrídy Component. Celoˇcíselnými parametry metody jsou šíˇrka a výška obrazu. Implementace dvojitého bufferu je realizována pˇredefinováním metody update(), která pˇri zachycení výše zmínˇených událostí nahrazuje metodu repaint(). Její struktura vypadá následovnˇe [1]: et’ové oblasti */ /* Obraz plnící funkci úložné pamˇ private Image doubleBuffer; /* Pˇ rekreslovací metoda využívající dvojitého bufferu */ public void update(Graphics g){ /* Naˇ ctení rozmˇ er˚ u zobrazované oblasti a vytvoˇ rení 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ˇ et’ové oblasti */ Graphics g2 = doubleBuffer.getGraphics(); paint(g2); g2.dispose(); /* Vykreslení obrazových dat z pamˇ et’ové oblasti */ g.drawImage(doubleBuffer, 0, 0, null); } else { /* Nebylo možné vytvoˇ rit 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ˇcní cˇ íslo a vzhled. V úvodní cˇ ásti bylo zmínˇeno, že MahJong se skládá jen ze 42 druhu˚ kostek, z nichž nˇekteré jsou ve hˇre cˇ tyˇrikrát, dvakrát nebo jen jednou. Problémem tedy je, jak tˇechto 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ˇcní smlouva je k uživateli benevolentní a dovoluje použití nˇekterých vizuálních prvku˚ v jiných nekomerˇcnˇe zamˇerˇ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žnuje ˇ uchovávat i pruhledný ˚ nebo prusvitný ˚ obrázek. To je u aplikace, kde se mohou kostky cˇ ásteˇcnˇe pˇrekrývat velmi duležité. ˚ Naˇcítání souboru se provádí pomocí metody getImage() ze tˇrídy Toolkit a vrací obrázkový objekt typu Image.
1
The Portable Network Graphics - grafický formát urˇcený pro bezeztrátovou kompresi rastorové grafiky
KAPITOLA 4. REALIZACE
22
Zde je pˇríklad: Toolkit toolkit = Toolkit.getDefaultToolkit(); Image nactenyObrazek = toolkit.getImage(nazevObrazku); Obrázek je rozdˇelen do matice o velikosti 4 rˇádku˚ a 11 sloupcu˚ (obr. 4.3), kde každá bunka ˇ pˇredstavuje vzhled jedné z kostek. Pozice obrázku kostky se poˇcítá pomocí jejího identifikaˇcního cˇ ísla. Nejprve se spoˇcítá pozice bunky ˇ v matici (ˇrádek, sloupec) a ta se vynásobí celkovým rozmˇerem obrázku (výška, šíˇrka). Struktura kódu vypadá následovnˇe: nky obrázku kostky podle id kostky */ cet pozice buˇ /* Výpoˇ int radekObrazku = (id / 11) + 1; int sloupecObrazku = (id % 11) + 1; /* Naˇ ctení výšky a šíˇ rky obrázku */ int vyska = image.getHeight(null); int sirka = image.getWidth(null); /* Výpoˇ cet souˇ radnic 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ˇenné typu Point(int, int), která reprezentuje umístˇení vzhledu kostky v rovinné soustavˇe souˇradnic (osy x, y) v obrázku.
Obrázek 4.3: Struktura obrázku se vzhledem všech druhu˚ kostek. Obrázek je rozdˇelen do matice o velikosti
4 rˇ ádku˚ a 11 sloupcu, ˚ kde každá bunka ˇ pˇredstavuje vzhled jedné z kostek. Pˇredposlední bunka ˇ v matici reprezentuje obrázek, který oznaˇcuje vybranou kostku.
Kostky jsou kresleny na hrací plochu, což je vyhrazená cˇ ást z okna komponenty JApplet. Vykreslení každé kostky je provedeno metodou drawImage ze tˇrídy Graphics.
KAPITOLA 5. TESTOVÁNÍ
23
5 Testování Tato kapitola je zamˇerˇena na popis testování bˇehem vývoje aplikace a po nˇem. Podstatou je sbírání informací o ovladatelnosti a ergonomii softwaru, který testují ruzné ˚ skupiny uživatelu. ˚ Kritériem pro hodnocení pˇritom muže ˚ být napˇr. cˇ as potˇrebný k vykonání urˇcitého úkolu, poˇcet nutných kliknutí myší, pˇrehlednost apod. Informace od uživatelu˚ jsou postupnˇe vyhodnocovány a na základˇe výsledku˚ probíhá další vývoj.
5.1 Prubˇ ˚ eh testování Ještˇe pˇred zaˇcátkem tvorby softwaru byl sestaven speciální tým uživatelu˚ (testeru) ˚ lišících se vˇekem a poˇcítaˇcovou gramotností. Uživatelé byli rozdˇeleni do skupin podle vˇeku (nejmladšímu bylo 15 let a nejstaršímu 65 let) a podle toho jak cˇ asto a na jaké úrovni pracují s poˇcítaˇcem. Každému cˇ lenu týmu byly v urˇcitých intervalech zasílány cˇ ásti aplikace, spolu s požadavky na co se má zamˇerˇit. Nejvˇetší duraz ˚ byl postupnˇe 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ˇrehlednost, rychlost, atd.), • spustitelnost appletu v ruzných ˚ prohlížeˇcích, • celková ovladatelnost a funkˇcnost aplikace. Po dokonˇcení 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ˇrizpusoboval ˚ další vývoj. Díky rozdˇelení uživatelu˚ do skupin podle vˇeku a poˇcítaˇcové gramotnosti, mohl být vývoj softwaru nasmˇerován smˇerem k pˇriblížení všem skupinám obyvatelstva.
5.2 Srovnání s existujícími rˇešeními Dalším faktorem, který v zaˇcátcích ovlivnil vývoj hry, bylo srovnání s již existujícími rˇešeními. Hra MahJong je ve svˇetˇe velmi oblíbená a jen na internetu je k nalezení nepˇreberné množství jejích variant. Z tˇech ménˇe známých tzv. „free online“ her napˇríklad: • Mahjongg Solitaire (http://www.mah-jongg.ch), • The Ultimate Mahjongg (www.mahjonged.com), • Amazing Mahjongg (http://www.mahjongg4u.com). Nˇekteré z tˇechto her mají jednu velkou nevýhodu a sice to, že jejich generátor rozložení kostek muže ˚ vytvoˇrit i sestavu, která nemá rˇ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ˇreddefinované sestavy, které se skládají z velkého poˇctu kostek, cˇ ímž se riziko neˇrešitelnosti snižuje.
KAPITOLA 5. TESTOVÁNÍ
24
Dalším typem her jsou ty, které je tˇreba instalovat na pevný disk poˇcítaˇce. Mnohé z nich bývají placené, ale nˇekteré jsou stále „free“, napˇrí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 zpusob ˚ rozvržení kostek na hrací plochu je mnohem lepší a zaruˇcuje minimálnˇe jedno správné rˇešení. Nˇekteˇrí z tvurc ˚ u, ˚ ale vyˇrešili generátor rozložení kostek šalamounským zpusobem. ˚ Ke všem sestavám vytvoˇrili tabulky, které pˇrí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ˇekolik možných zpusob ˚ u˚ rozložení.
ˇ ˇ A NÁMETY ˇ KAPITOLA 6. ZÁVER POKRACOVÁNÍ PRÁCE
25
6 Závˇer a námˇety pokraˇcování práce Tato práce byla zamˇerˇena na tvorbu uživatelského prostˇredí pro hraní hry MahJong. Byla umožnˇena kontrola dodržování pravidel a vytvoˇrena nápovˇeda usnadnující ˇ uživateli hledat rˇešení. Souˇcástí aplikace je generátor nových rozložení kostek s možností odhadu složitosti generovaných rˇešení. Další cˇ ástí je editor rozvržení kostek zahrnující pravidla pro tvorbu rˇešitelných sestav. Uživateli je umožnˇena zmˇena velikosti hracích kostek a jejich vzhledu. Hra byla úspˇešnˇe implementována v objektovˇe orientovaném jazyce Java za pomoci vývojového prostˇredí NetBeans IDE 5.5 a Java Development Kit ve verzi 6.0 Update 1. V dnešní dobˇe existuje nepˇreberné množství ruzných ˚ variant MahJong her. Nˇekteré jsou opravdu kvalitní a propracované do posledního detailu jak po funkˇcní, tak i po vizuální stránce. Jiné jsou na tom o poznání huˇ ˚ re. Nˇekteré obsahují nedokonalé generátory rozložení kostek, které mohou vytvoˇrit i neˇrešitelnou sestavu. Jiné nezahrnují žádnou formu pomocné nápovˇedy. A žádná z dnešních MahJong her neumožnuje ˇ uživateli vytváˇret vlastní herní sestavy. Hlavním pˇrínosem této práce je vytvoˇrení prostˇredí, které se funkˇcnˇe pˇribližuje výše zmínˇeným „propracovaným“ aplikacím a vyplnuje ˇ „mezeru“ v tvorbˇe vlastních herních sestav. Námˇetu˚ na pokraˇcování práce je mnoho. Vývoj by mohl být zamˇerˇen na vizuální stránku aplikace. Napˇríklad rozšíˇrení o 3D grafiku. Kostky by mohly být potaženy texturami, oznacˇ ená kostka by se osvítila reflektorem a okolí by bylo zahaleno napˇríklad mlhou. Další rozšírˇení by se mohlo týkat tvaru˚ kostek a možnosti jejich umístˇení na hrací plochu. Pˇredstavme si namísto standardní kostky tˇreba válec nebo jehlan - uživatel by mohl z MahJong kostek sestavit tˇreba 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žnující ˇ komunikaci mezi všemi objekty v nˇem registrované GUI Graphical User Interface - druh komunikace s poˇcítaˇcem mající podobu interaktivních grafických prvku˚ JAR Java Archive - platformˇe nezávislý formát pro archivaci souboru˚ JFC Java Foundation Classes - sestava knihoven pro tvorbu pˇrenositelných grafických uživatelských rozhraní JVM Java Virtual Machine - abstraktní poˇcítaˇc, který obsahuje runtime system (realizuje spojení s hardwarem) a interpreter (vykonává binární kód) MIME Multipurpose Internet Mail Extensions - standardizovaný zpusob ˚ oznaˇcování obsahu zpráv PNG The Portable Network Graphics - grafický formát urˇcený pro bezeztrátovou kompresi rastorové grafiky W3C World Wide Web Consortium - mezinárodní konsorcium dohlížející na vývoj internetových standardu˚ XHTML eXtensible HyperText Markup Language - znaˇckovací jazyk urˇcený pro tvorbu hypertextových dokumentu˚
ˇ ˇ DODATEK B. UŽIVATELSKÁ PRÍRU CKA
28
B Uživatelská pˇríruˇcka B.1
Komu je hra urˇcena
Hra MahJong je urˇcena každému, kdo rád potrápí své mozkové závity. Pro její úspˇešné hraní je tˇreba umˇení strategie, pˇredvídavosti, dobrá pamˇet’, ale stejnˇe tak i štˇestí. O MahJong se rˇíká, že je to hra cˇ ínských filozofu. ˚ Ti si jejím hraním zahˇrívaly mozkové bunky ˇ a napadaly je nové filozofické myšlenky o smyslu života.
B.2
Adresa hry, spuštˇení hry
Pro spuštˇení hry MahJong staˇcí ve Vašem oblíbeném internetovém prohlížeˇci napsat do adresního pole jeden z následujících odkazu: ˚ • http://mahjong.wz.cz • http://mahjong.tym.cz První z výše zmínˇených odkazuje na hlavní a druhý na záložní server s aplikací.
B.3
Systémové požadavky
Pro spuštˇení je tˇreba mít v poˇcítaˇci nainstalovaný Java JRE, verze 1.5.0 a vyšší. Na této stránce: http://www.java.com/en/download/installed.jsp mužete ˚ zjistit, jakou verzi máte nainstalovanou, staˇcí kliknout na tlaˇcítko „Verify Installation“. Pokud nemáte Java JRE nainstalovanou, mužete ˚ si nejnovˇejší verzi stáhnou na adrese: http://www.java.com/getjava/ Po instalaci mužete ˚ herní applet spustit ve všech prohlížeˇcích podporujících Java JRE plug-in (Internet Explorer, Mozzila Firefox, Opera, Konqueror, atd.).
ˇ ˇ DODATEK B. UŽIVATELSKÁ PRÍRU CKA
B.4
29
Pravidla hry
B.4.1 Jak hrát Na hrací plochu jsou v ruzných ˚ rˇadách, sloupcích a vrstvách umístˇeny hrací kostky, s ruznými ˚ symboly na lícové stranˇe. Kostek je sudý poˇcet, protože každá má k sobˇe párovou kostku, a cílem hry je takové kostky najít a odebrat. Dvˇe kostky jsou párové, jestliže mají na lícové stranˇe shodné znaky. Na poˇcátku hry je spoustu kostek zakrytých jinými a nejsou vidˇet, takže je tˇreba se k nim postupnˇe dostat. Aby se párové kostky mohly odebrat, musejí být obˇe volné. Kostka je volná, pokud: • žádná jiná kostka na ní neleží nebo není cˇ ásteˇcnˇe krytá (obr. B.1)
Obrázek B.1: V tˇechto sestavách je možné odebrat jen kostku uprostˇred. Kostky po stranách jsou kryté.
• žádná jiná kostka s ní nesousedí napravo a souˇcasnˇe nalevo a ani ji v tˇechto smˇerech cˇ ásteˇcnˇe nezakrývá (obr. B.2)
Obrázek B.2: V tˇechto sestavách lze odebrat jen krajní kostky. Kostka uprostˇred je blokována sousedními kost-
kami.
Zdá se to být snadné, ale pˇresto hra muže ˚ skonˇcit i neúspˇechem. A to, když na stole zu˚ stanou kostky, které už nemohou být odebrány. Proto musíte být pˇred odstranˇením páru obezˇretní. Není to jen hra štˇestí, ale hlavnˇe strategie.
ˇ ˇ DODATEK B. UŽIVATELSKÁ PRÍRU CKA
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ˇeleny do 7 skupin nazvaných sady. ˇ Hrací kostky se dˇelí na rˇadové, kterých je 108, a zvláštní, kterých je 28. Radové kostky se dˇelí do tˇrí rˇ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ˇri draci (bílý, zelený a cˇ ervený) a cˇ tyˇri vˇetry (východní, jižní, západní a severní). Od každého druhu jsou ve hˇre 4 identické zvláštní ˇ kostky. Drakum, ˚ vˇetrum, ˚ jedniˇckám a devítkám se rˇíká velké kostky. Radovým kostkám od 2 do 8 vˇcetnˇe, se rˇíká malé. Prémiové kostky obsahují sadu cˇ tyˇr kvˇetin a sadu cˇ tyˇr roˇcních období. První rˇada kostek (obr. B.3) obsahuje 9 „puntíkových“ kostek (také známé jako kruhové, znakové nebo teˇckované). Jejich cˇ íselná hodnota (1 až 9) je reprezentována poˇctem puntíku. ˚ Od každého druhu 4 kostky (celkem 36 kostek s motivem puntíku). ˚
Obrázek B.3: Kostky s motivem puntíku˚ Druhá rˇada (obr. B.4) obsahuje 9 „bambusových“ kostek (také známé jako tyˇcové nebo duté). Jejich cˇ íselná hodnota je reprezentována poˇctem tyˇcek. Od každého druhu 4 kostky (celkem 36 kostek s motivem bambusu). ˚ Na kostce cˇ í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 bambusu˚ Tˇretí rˇada (obr. B.5) obsahuje 9 „znakových“ kostek (také známých jako cˇ íselné, bledé, deseˇ titisícé nebo prasklé). Cervený symbol je cˇ ínské znamení pro 10 000 (vyjadˇruje také blahobyt). ˇ Cerný symbol nad ním je popis pro cˇ ísla od 1 do 9. Kostky jsou tak popsány cˇ ísly od 10 000 do 90 000. Nˇekteré typy kostek mohou navíc obsahovat arabské cˇ íslice, které byly pˇridány pro pˇriblížení hry lidem ze západního svˇeta. Od každého druhu 4 kostky (celkem 36 kostek s motivem znaku). ˚
Obrázek B.5: Kostky s motivem znaku˚
ˇ ˇ DODATEK B. UŽIVATELSKÁ PRÍRU CKA
31
ˇ Ctvrtá rˇada (obr. B.6) zaˇcíná cˇ tyˇrmi kostkami „roˇcního období“. Zleva doprava: jaro, léto, podzim, zima. Jsou potištˇeny bud’ obrázkem nebo cˇ ínským symbolem, popisujícím dané období. O každého druhu 4 kostky (celkem tedy 16 kostek s motivem roˇcního období).
Obrázek B.6: Kostky s motivem roˇcních období ˇ Ctvrtá rˇada (obr. B.7) konˇcí cˇ tyˇrmi „vˇetrnými“ kostkami. Zleva doprava: východní, jižní, západní, severní. Každá kostka zobrazuje cˇ ínský symbol popisující daný vítr. Pro zjednodušení, mohou být kostky opˇet potištˇeny prvním písmenem z jejich latinského názvu. Od každého druhu 4 kostky (celkem 16 kostek s motivem vˇetru). ˚
Obrázek B.7: Kostky s motivem vˇetru˚ Pátá rˇada (obr. B.8) zaˇcíná cˇ tyˇrmi „kvˇetinovými“ kostkami. Zleva doprava: violka, lilie, pivonka, ˇ sasanka. Mohou být potištˇeny odpovídajícími znaky kvˇetin. Od každého druhu 4 kostky (celkem 16 kostek s motivem kvˇetin).
Obrázek B.8: Kostky s motivem kvˇetin Pátá rˇada (obr. B.9) konˇcí „draˇcími“ kostkami. Zleva doprava: zelený, bílý, cˇ ervený. Bílý muže ˚ být zobrazován jako prázdná kostka nebo jako obraz obdélníku s rysy cˇ ervené nebo modré barvy. Od každého druhu cˇ tyˇri kostky (celkem tedy 12 kostek s motivem draku). ˚
Obrázek B.9: Kostky s motivem draku˚
ˇ ˇ DODATEK B. UŽIVATELSKÁ PRÍRU CKA
32
B.4.3 Strategie hry • Pamatujte, že vˇetšina kostek se ve hˇre vyskytuje cˇ tyˇrikrát. Když odstraníte pár, nezapomente, ˇ že v rozvržení stále existuje stejný pár. Není uvˇeznˇen vaším odstranˇením prvního páru? Vybírejte moudˇre. • Soustˇred’te vaše úsilí na dlouhé rˇady a vysoké sloupce. • Plánujte dopˇredu tolik tahu˚ kolik jen mužete. ˚ • Jestliže jsou dostupné všechny cˇ tyˇri kostky daného typu, odstrante ˇ je všechny, snížíte tím zmatek na hracím poli. • Nelze se spoléhat na to, že vám poˇcítaˇc pˇri nápovˇedˇe zobrazí nejlepší radu; ukáže vám jakýkoli pár, jež lze odebrat, ten který mu právˇe „pˇrijde pod ruku“. • Identifikujte tolik odpovídajících páru˚ jak jen je to možné. Kontrolujete tím kostky, aby nebyly zablokované. • Dávejte pozor na trojnásobné koskty(tˇri odpovídající volné kostky) a vybírejte opatrnˇe, který pár odstraníte. Vyberte spíš ten, který blokuje duležité ˚ kostky. • Soustˇred’te se na odstranˇení páru, ˚ které uvolní vˇetšinu kostek.
B.5
Popis uživatelského prostˇredí
B.5.1 Spuštˇení appletu Po spuštˇení hry v internetovém prohlížeˇci, se uživateli zobrazí hláška s dotazem na duvˇ ˚ eryhodnost aplikace (obr. B.10). Po souhlasu s duvˇ ˚ eryhodností bude mít uživatel možnost ukládat sestavy vytvoˇrené v editoru a možnost zapsat se po úspˇešném dokonˇcení hry do tabulky nejlepších hráˇcu. ˚ Pokud s duvˇ ˚ eryhodností nesouhlasí, nebude moci tyto akce provádˇet. Aplikace se po souhlasu i nesouhlasu naˇcte a pˇred uživatelem se zobrazí úvodní obrazovka.
Obrázek B.10: Ovˇerˇ ovací certifikát
ˇ ˇ DODATEK B. UŽIVATELSKÁ PRÍRU CKA
33
B.5.2 Úvodní obrazovka Na této obrazovce (obr. B.11) jsou nejduležitˇ ˚ ejšími prvky tlaˇcítka umístˇená v horní lištˇe. 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ˇení editoru pro tvorbu nových sestav. • Pravidla - otevˇrení okna s pravidly hry. • Nastavení - otevˇrení okna s možnostmi zmˇeny vzhledu a velikosti kostek. • Tabulka nejlepších - otevˇrení okna s tabulkou nejlepších hráˇcu. ˚
Obrázek B.11: Úvodní obrazovka
ˇ ˇ DODATEK B. UŽIVATELSKÁ PRÍRU CKA
34
B.5.3 Výbˇer nové hry Po výbˇeru tlaˇcí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 muže ˚ spustit s ruzným ˚ stupnˇem obtížnosti. K tomu slouží tlaˇcítka Lehká, Tˇežká a tlaˇcítko s obrázkem hry (sestava uložená pˇrímo ve hˇre) nebo poˇctem kostek v sestavˇe (uživatelem uložené sestava). Hra se tedy muže ˚ spustit v lehkém a tˇežkém módu. Tlaˇcítko s obrázkem hry slouží pro spuštˇení s jakýmkoli stupnˇem obtížnosti. U her vytvoˇrených uživatelem se navíc zobrazuje tlaˇcítko Odebrat hru, které slouží k odstranˇení ze seznamu her.
Obrázek B.12: Panel s možnostmi rozložení uložených her
ˇ ˇ DODATEK B. UŽIVATELSKÁ PRÍRU CKA
35
B.5.4 Prostˇredí editoru Po výbˇeru tlaˇcítka Editor se uživateli zobrazí nová obrazovka (obr. B.13) s cˇ ernou mˇrížkou, která definuje velikost hrací plochy a cˇ ervený obdélníˇcek sloužící k zamˇerˇení pozice pro umístˇení kostky. Kostka se na zamˇerˇenou pozici položí pˇri stisknutí levého tlaˇcítka myši a pˇri stisknutí pravého tlaˇcítka se odstraní. V horní lištˇe se zobrazí nová tlaˇcí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ˇrit hru - vytvoˇrení 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ˇredí editoru rozvržení kostek
ˇ ˇ DODATEK B. UŽIVATELSKÁ PRÍRU CKA
36
B.5.5 Prostˇredí spuštˇené hry Po spuštˇení 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ˇe je uveden celkový poˇcet kostek na hrací ploše, poˇcet volných páru kostek, které je možné odebrat a poˇcitadlo odpoˇcítávající cˇ as od zaˇcátku hry. V horní lištˇe se zobrazí nová tlaˇcítka, jejichž význam je následující: • Pˇrerovnat - vytvoˇrení nového rozložení kostek v aktuální sestavˇe. • Zpˇet - vrátí na hrací plochu naposled odebraný pár kostek. • Nápovˇeda - oznaˇcí nˇekterý z volných páru˚ kostek, který je možné odebrat. K celkovému cˇ asu od spuštˇení hry bude pˇripoˇcteno 30 vteˇrin. • Pauza - pozastavení hry a její opˇetovné spuštˇení.
Obrázek B.14: Prostˇredí nové hry
ˇ DODATEK C. OBSAH PRILOŽENÉHO CD
37
C Obsah pˇriloženého CD • ./ - koˇrenový adresáˇr – readme.html - hypertextový dokument s návodem na instalaci a spuštˇení aplikace – readme.txt - textový dokument s návodem na instalaci a spuštˇení aplikace • application/ - adresáˇr obsahující spustitelnou aplikaci – mahjong.html - hypertextový dokument se spustitelným Java appletem – mahjong.jar - digitálnˇe podepsaný JAR archiv s pˇreloženými tˇrídami pro spuštˇení aplikace • archive/ - adresáˇr obsahující archivy všech cˇ ástí bakaláˇrské 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ˇe podepsaným JAR archivem s pˇreloženými tˇrídami pro spuštˇení aplikace – mahjong.zip - archiv se zdrojovým kódem aplikace – thesis.zip - archiv s vlastními texty bakaláˇrské práce ve formátu PDF a PS • doc/ - adresáˇr obsahující dokumentaci zdrojového kódu – doc.zip - archiv s dokumentací zdrojového kódu (javadoc) • source/ - adresáˇr obsahující zdrojový kód – mahjong.zip - archiv se zdrojovým kódem aplikace • thesis/ - adresáˇr obsahující vlastní text bakaláˇrské práce – mahjong.pdf - text bakaláˇrské práce ve formátu PDF – mahjong.ps - text bakaláˇrské práce ve formátu PS