Dokumentace bakalářské práce

Transkript

Dokumentace bakalářské práce
Č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 ů

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...

Více

Herní etogram kočkodana Brazzova (Cercopithecus neglectus)

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...

Více

Certifikace znalostí Linuxu

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...

Více

Percepce krajiny

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...

Více

Koncepce prevence kriminality města Plzně na léta

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,...

Více

Postřehová hra Zadání projektu 1 Moje cíle

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í)

Více

Processing 3.0 a p5.js

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ý ...

Více