České vysoké učení technické v Praze Fakulta elektrotechnická
Bakalářská práce
Pokročilá implementace deskové hry Dáma
Ladislav Vitásek
Vedoucí práce: RNDr. Marko Genyk-Berezovskyj Studijní program: Elektrotechnika a informatika, strukturovaný bakalářský Obor: Informatika a výpočetní technika červen 2006
ii
Poděkování Rád bych poděkoval vedoucímu mé bakalářské práce RNDr. Marko GenykBerezovskému za podnětné rady, čas strávený konzultacemi a jeho trpělivost. Také bych chtěl poděkovat Pavlu Ulčovi a Zdeňku Adámkovi za pomoc při grafickém návrhu implementované aplikace. V neposlední řadě bych rád poděkoval všem svým a kamarádům, kteří neustále přicházeli s novými nápady na vylepšení.
iii
přátelům
iv
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 28.6. 2006
...............................................
v
vi
Abstrakt Bakalářská práce teoreticky rozebírá a implementuje deskovou hru Dáma pomocí strategie prořezávání stromu za použití heuristiky pro ocenění herní pozice. Úvodní část popisuje historii a současnost hry Dáma spolu s historií vývoje algoritmů umělé inteligence pro řešení deskových her. Ve druhé části s názvem Hledání strategií jsou popsány teoretické základy herních stromů a základních algoritmů, které jsou dále použity při implementaci hry Dáma. Návrh a realizace je popsána ve stejnojmenné části, která se zabývá použitými technologiemi (jazyk Java, knihovny Java Swing) a popisem částí aplikace (umělá inteligence, základní objektový model, formát PDN – Portable Draughts Notation). Čtvrtá část testuje úroveň umělé inteligence programu na základě zkušeností uživatelů ze hry programu a porovnávání algoritmů prohledávání herního stromu. V závěrečné části jsou shrnuty dosažené výsledky a navrhnutá další možná vylepšení.
vii
viii
Abstract The Bachelor's thesis does a theoretical analysis and implementation of the draughts board game using a game-tree pruning strategy with a heuristic for evaluating the value of a position. The first part describes the history and present of the draughts game along with the development of artificial intelligence algorithms for solving board games. The second part describes the theoretical fundamentals for game trees and basic algorithms used for the implementation of the draughts game. The design and realization are described in the next part, which handles technologies used (the Java programming language, the Java Swing libraries) and describes all parts of the application (artificial intelligence used, the basic object model, the PDN format - Portable Draughts Notation). The fourth part handles evaluating the strength of the program's artificial intelligence based on players' interactions with the program and a comparison of game-tree search algorithms. The final part summarizes the achieved results and proposes further possibilities of improvement.
ix
x
Obsah Seznam obrázků .................................................................................................................................... xv Seznam tabulek..................................................................................................................................... xvi Část I – Úvod ........................................................................................................................................... 1 1.
Hra Dáma ....................................................................................................................................... 1
2.
Deskové hry a stručná historie umělé inteligence ....................................................................... 2
Část II – Hledání strategií....................................................................................................................... 4 3.
Herní stromy .................................................................................................................................. 4
4.
Základní algoritmy ........................................................................................................................ 5 4.1. 4.1.1.
Ohodnocovací funkce........................................................................................................ 5
4.1.2.
Použití ............................................................................................................................... 5
4.1.3.
Pseudokód algoritmu......................................................................................................... 7
4.1.4.
Počty strategií.................................................................................................................... 8
4.1.5.
Složitost algoritmu ............................................................................................................ 8
4.2. 4.2.1. 4.3.
5.
Minimaxová metoda............................................................................................................... 5
Algoritmus Negamax.............................................................................................................. 8 Pseudokód algoritmu......................................................................................................... 9 Alfa-Beta ořezávání................................................................................................................ 9
4.3.1.
Použití ............................................................................................................................. 10
4.3.2.
Pseudokód algoritmu....................................................................................................... 11
4.3.3.
Složitost algoritmu .......................................................................................................... 12
Techniky zlepšující Alfa-Beta ořezávání ................................................................................... 13 5.1.
Třídění tahů.......................................................................................................................... 13
5.1.1.
Statické třídění................................................................................................................. 13
5.1.2.
Killer moves heuristika ................................................................................................... 14
5.1.3.
Historická heuristika ....................................................................................................... 14
5.1.4.
Iterativní prohlubování .................................................................................................... 16
5.1.5.
Transpoziční tabulka ....................................................................................................... 16
xi
5.2.
Hledání klidu ........................................................................................................................18
5.3.
Hledání minimálního okna ...................................................................................................18
Část III – Návrh a realizace..................................................................................................................19 6.
Použité technologie ......................................................................................................................19 6.1.
Jazyk Java ............................................................................................................................19
6.2.
Java Swing ...........................................................................................................................20
7.
Části aplikace ...............................................................................................................................20 7.1.
Umělá inteligence.................................................................................................................20
7.1.1.
Generátor tahů .................................................................................................................21
7.1.2.
Ohodnocovací funkce ......................................................................................................24
7.1.3.
Rozhodovací algoritmus ..................................................................................................26
7.2.
Základní objektový model.....................................................................................................29
7.3.
Formát PDN.........................................................................................................................32
7.3.1.
Datová struktura formátu PDN........................................................................................33
7.3.2.
Příklady zápisu partie ......................................................................................................38
7.3.3.
Analýza PDN pro čtení ze souboru .................................................................................40
7.3.4.
Programová realizace PDN .............................................................................................44
Část IV – Testování umělé inteligence .................................................................................................47 8.
Úroveň umělé inteligence ............................................................................................................47 8.1.
Obtížnost hry ........................................................................................................................47
8.2.
Porovnání algoritmů prohledávání herního stromu.............................................................47
8.3.
Zkušenosti hráčů ze hry........................................................................................................49
Část V – Závěr .......................................................................................................................................51 9.
Zhodnocení ...................................................................................................................................51
10.
Náměty pro budoucí práci...........................................................................................................52
Literatura ...............................................................................................................................................53 A
Seznam použitých zkratek ..........................................................................................................55
B
Stručná pravidla Mezinárodní dámy .........................................................................................56
xii
C
D
Instalační příručka ...................................................................................................................... 57 C.1
Systémové požadavky ........................................................................................................... 57
C.2
Instalace prostředí Java....................................................................................................... 57
C.3
Spuštění aplikace.................................................................................................................. 58
Uživatelská příručka ................................................................................................................... 59 D.1 D.1.1 D.2
Obecné ................................................................................................................................. 59 Hlavní obrazovka ............................................................................................................ 59 Funkce hlavního menu ......................................................................................................... 60
D.2.1
Menu Hra ........................................................................................................................ 60
D.2.2
Menu Tah ........................................................................................................................ 61
D.2.3
Menu Obtížnost ............................................................................................................... 61
D.2.4
Menu Herní deska ........................................................................................................... 62
D.2.5
Menu Nástroje ................................................................................................................. 63
D.2.6
Menu Zobrazit ................................................................................................................. 63
D.2.7
Menu Damaq ................................................................................................................... 63
D.3
Nástroje................................................................................................................................ 64
D.3.1
Nástroj Možné tahy ......................................................................................................... 64
D.3.2
Nástroj Hra ...................................................................................................................... 65
D.3.3
Nástroj Editor .................................................................................................................. 66
D.3.4
Nástroj Hodiny ................................................................................................................ 66
D.4
Herní deska a zadávání tahu................................................................................................ 67
D.5
Stavový řádek ....................................................................................................................... 68
D.6
Uložení a načtení rozehrané partie...................................................................................... 68
D.6.1
Uložení partie do formátu PDN....................................................................................... 69
D.6.2
Uložení partie jako odkaz na Java applet ........................................................................ 70
D.6.3
Načtení partie ze souboru formátu PDN.......................................................................... 70
D.7
Uživatelská nastavení........................................................................................................... 71
D.7.1
Obecná nastavení............................................................................................................. 72
D.7.2
Nastavení vzhledu ........................................................................................................... 73
D.7.3
Nastavení exportu do schránky ....................................................................................... 73
D.7.4
Různá nastavení............................................................................................................... 73
xiii
D.8 E
Ověření nové verze ...............................................................................................................74
Obsah přiloženého CD.................................................................................................................75
xiv
Seznam obrázků Obr. 1 – Příklad herního stromu .....................................................................................4 Obr. 2 – Minimaxový vyhledávací strom .......................................................................6 Obr. 3 – Minimaxový herní strom s aplikovanou metodou Alfa-Beta ořezávání ........10 Obr. 4 – Komponenty nutné k vytvoření umělé inteligence pro hru dvou hráčů .........20 Obr. 5 – Herní deska pro Mezinárodní dámu ...............................................................21 Obr. 6 – Příklad obsahu datové struktury tahu .............................................................22 Obr. 7 – UML diagram s návrhem základních tříd a rozhraní......................................31 Obr. 8 – Hlavní obrazovka aplikace .............................................................................60 Obr. 9 – Nástroj Možné tahy ........................................................................................64 Obr. 10 – Nástroj Hra ...................................................................................................65 Obr. 11 – Nástroj Editor ...............................................................................................66 Obr. 12 – Nástroj Hodiny .............................................................................................67 Obr. 13 – Zadávání tahu ...............................................................................................68 Obr. 14 – Stavový řádek ...............................................................................................68 Obr. 15 – Dialog uložení partie do PDN souboru ........................................................69 Obr. 16 – Přehrávání partie v Java appletu..................................................................70 Obr. 17 – Dialog načtených partií z PDN souboru.......................................................71 Obr. 18 – Dialog uživatelských nastavení ....................................................................72 Obr. 19 – Adresářová struktura přiloženého CD ..........................................................75
xv
Seznam tabulek Tab. 1 – Reprezentace terminálních symbolů gramatiky ve formátu PDN ................. 42 Tab. 2 – Výpočet množin FIRST a FOLLOW pro PDN gramatiku ............................ 43 Tab. 3 – Tabulka rozkladu pro PDN gramatiku........................................................... 44 Tab. 4 – Počet prohledávaných pozic herního stromu s danou hloubkou a metodou .. 48 Tab. 5 – Čas potřebný k prohledání herního stromu s danou hloubkou a metodou..... 48 Tab. 6 – Odehrané partie hráčů testujících aplikaci ..................................................... 49
xvi
Hra Dáma
Část I – Úvod Úkolem bakalářské práce je vytvořit pokročilou implementaci deskové hry Dáma s umělou inteligencí pomocí strategie prořezávání stromu hry a vhodné heuristiky k ohodnocení pozice. Za cílovou skupinu uživatelů lze považovat jak naprosté začátečníky, hrající hru Dáma jen rekreačně, tak i pokročilé a zkušené hráče – profesionály bývající účastníky turnajů, pro které aplikace obsahuje užitečné nástroje. Práce si neklade za cíl přímo konkurovat v množství funkcí a úrovni umělé inteligence aplikacím vyvíjeným několik let v týmu mnoha lidí, ale snaží se nabídnout moderně zpracovanou alternativu a výhody použití jazyka Java s technologií Java Swing.
1. Hra Dáma Není přesně známo, kdo hru Dáma vymyslel. Podle legend to byl egyptský bůh Thovt, který byl také označován za autora hieroglyfického písma. Předchůdce hry Dáma – senet – se hrál ve starověkém Egyptě už 3000 let př. n. l, což dokazují fresky v hrobce Merknera, dvořana faraona Tauta. Senet se hrál na desce 3×10 polí. Od současné Dámy se lišil hlavně tím, že počet tahů se určoval vrhacími dřívky. V Lýdii, za vlády krále Atise, se již hrálo na desce 8×8 šachových polí. Kameny byly dvou barev a posouvaly se pouze vpřed. Hra symbolizovala boj dvou armád a kámen, který se dostal na poslední řadu (do týla soupeře), se obrátil a s větší silou útočil z týla. Nepřátelský kámen se bral zprvu tak, že se musel obklíčit dvěma kameny. Později se bral přeskočením. Symbolizovalo to, že voják, který srazil nepřítele k zemi, ho překročil a pokračoval v boji. Dalším způsobem výhry bylo zablokování kamenů, což symbolizovalo jejich zajetí. Do Čech se Dáma dostala spolu s Habsburky v šestnáctém století ze Španělska a Německa. I samotný název hry Dáma je z německého der Damm – hráz, přehrazení, což ukazuje na způsob, jak se v této hře vyhrává. V současné době existuje mnoho variant hry Dáma. Téměř se dá říci, že každý národ má vytvořenu svou variantu pravidel (je známa například Italská či Španělská dáma a mnohé další). Nejinak je tomu i v českých zemích. V obecném povědomí nejrozšířenější varianta Česká dáma se hraje na desce 8×8 polí. Pro svou implementaci jsem se však rozhodl zvolit poněkud netradičně variantu známou jako Mezinárodní dáma. Mezinárodní dáma se hraje na desce 10×10 polí a pravděpodobně největším rozdílem oproti české variantě je možnost
1
Deskové hry a stručná historie umělé inteligence skákání obyčejných kamenů i zpět, což dělá tuto hru dle mého mínění mnohem zajímavější a výslednou aplikaci v naší zemi originální. Tato verze pravidel je oblíbená především v Holandsku nebo Rusku, ale i v jiných státech Evropy. Přestože mezinárodní varianta není v českých zemích mezi laiky tak hojně oblíbena, každý rok se pod záštitou České federace dámy [3] konají národní turnaje. Dámu vůbec nelze považovat za jistou „nižší formu“ šachů. Ačkoli není tak složité se ji naučit, množství logického uvažování a notná dávka strategie potřebná k vítězství nad zkušeným protivníkem není o nic menší.
2. Deskové hry a stručná historie umělé inteligence Tato práce není zdaleka první, která se nějakým způsobem pokouší navrhnout a vytvořit virtuálního protihráče – „stroj“ pro hru Dáma či šachy (teorie a práce nad řešením umělé inteligence šachů a hry Dáma byly vždy spjaty). Mnohé ze skutečností uvedené v tomto textu jsou právě založeny na historických základech a metodách vymyšlených dávno před vznikem prvního osobního počítače. Jako prvního vědeckého badatele v této oblasti lze označit anglického matematika žijícího v devatenáctém století Charlese Babbage, který první navrhl jistou souslednost kroků – algoritmus (podobný dnešním) – kdy šachový stroj si měl klást otázky a z odpovědí vyvodit svoji reakci. První pravý šachový stroj však sestrojil až Španěl Leonardo Torres y Quevedo roku 1912. Zvolil si jednoduchou koncovku a jeho stroj složený z nejjednodušších magnetických relé si dokázal s touto koncovkou poradit, i když ne vždy optimálně. Hernímu teoretikovi a spoluzakladateli současných počítačových věd Johnu Von Neumannovi je připisováno autorství formulace tzv. Minimaxové metody (rok 1944), která de facto znamenala nalezení jistého „vzorce“ pro umělou inteligenci deskových her, se kterým by se dal vždy (alespoň teoreticky) nalézt nejlepší tah. Minimaxové metodě je v této práci věnována samostatná kapitola (viz kap. 4.1). Nelze nezmínit významného matematika Alana Turinga, který navrhl dodnes používaný základní způsob ohodnocení materiálu pozic, dále pak prověřování tahů jak bílého, černého a některé další techniky hledání strategie. Roku 1951 Turing sestavil svůj program pouze na papíře, ale jeho přínos nebyl jistě malý. Podobně jako v Anglii Turing, tak v Americe se umělou inteligencí zabýval Claude Shannon. Shannon již využíval Minimaxovou metodu. Byl si vědom velkého množství
2
Deskové hry a stručná historie umělé inteligence kombinací, které se v šachu a podobných hrách vyskytují a jako první pak popsal tzv. „strategii A” [4], která spočívala v tom, že se zkoumala všechna možná pokračování až do pevně stanovené hloubky vyhledávání. Navrhl „strategii B“, která zahrnovala hledání klidové pozice a zkoumání jen smysluplných tahů. V souvislosti s hledáním tahů zavedl termín hrubá síla (brute force, viz kap. 4.1.4). Následovaly pokusy o návrhy nejlepších programů na specializovaných počítačích. Za všechny lze zmínit – Maniac I, MacHack či pozdější Chess, Cray Blitz, Deep Thought I/II a další. K tomuto výčtu lze přidat i šachový program CP-1, na kterém pracovali pánové Newell, Shaw, Simon při univerzitě Carnegie-Mellon v Pittsburghu a kteří jako první roku 1958 uvedli do praxe použití úpravy Minimaxové metody – Alfa-Beta ořezávání, které se poměrně významně vztahuje k této práci (viz kap. 4.3). Médii velmi oblíbený Deep Blue, který hrál v roce 1997 proti velmistru šachu Garry Kasparovovi a vyhrál, byl označen za první stroj definitivně porážející šachové velmistry. Ekvivalentní varianta podobného stroje pro dámu – Chinook – byla vytvořena o 3 roky dříve. Výzkum počítačového myšlení deskových her však neskončil. Vytvoření umělé inteligence k čínské hře Go je stále považováno za velice obtížné. Velmistři v Go odmítají hrát s počítači, protože jsou stroje příliš slabé.
3
Herní stromy
Část II – Hledání strategií Tato část se zabývá popisem možností řešení a technikami k tvorbě umělé inteligence ve hře dvou hráčů.
3. Herní stromy Herní stromy představují často používaný a jednoduchý způsob, jakým lze zobrazit pozice a tahy ve většině deskových her. Popis hry herním stromem (Obr. 1) pomáhá při představě řešení problémů spojených s umělou inteligencí. Reprezentace hry pomocí herního stromu však není jen vizuální pomůckou, ale tvoří i zvláštní matematickou disciplínu v oblasti teorie her (viz např. [5]).
Obr. 1 – Příklad herního stromu
Formální reprezentace se vztahuje k deskovým hrám dvou hráčů. V teorii her je tento popis znám jako rozšířená forma (extensive form, viz [7]). Obecně platí, že herní strom je orientovaný graf, jehož uzly (vrcholy) představují pozice a orientované hrany jednotlivé tahy. Při tahové hře dvou hráčů je jeden tah složen z tahu obou hráčů, přičemž tah jenom jednoho z nich se označuje jako půltah. Uvedený strom na Obr. 1 má hloubku tří půltahů a tvoří jej čtyři úrovně pozic. Jednotlivé úrovně pak představují střídání hráčů při hře. Provedením konkrétního tahu hráče na určité pozici se lze dostat do stavu jiného (jiné pozice), od které začíná hrát protihráč. Jestliže by herní strom na obrázku vyobrazoval všechny možné pozice hry se všemi možnými tahy (takové, které se mohou od pozic podle pravidel odvíjet), pak se takový strom nazývá úplný. Kořen stromu (nejvyšší zobrazená úroveň) určuje výchozí pozici, od které hra pokračuje, a listy (uzly nemající žádného následovníka, resp. nejnižší zobrazená úroveň) reprezentují koncové pozice. 4
Základní algoritmy V případě úplného herního stromu koncové pozice označují buď výhru, prohru (resp. výhru protihráče) nebo remízu. S pomocí úplných herních stromů lze dokázat, že vždy právě jeden z hráčů má výherní strategii nebo jsou oba schopni dosáhnout remízy. Důkaz tohoto tvrzení je možné nalézt na [6]. Lze tedy najít určitou strategii, která povede k vítězství hráče ve hře. Základní způsob umožňující nalezení nejlepšího tahu pro danou pozici demonstruje Minimaxová metoda.
4. Základní algoritmy 4.1. Minimaxová metoda Princip Minimaxové metody (také zvané jako „algoritmus Minimax“ nebo jen zkráceně „Minimax“) reprezentuje relativně jednoduchý způsob při hledání optimálního tahu. Pro názornost je zde uveden jednoduchý příklad procházení a zkoumání herního stromu spolu s ohodnocením pozic. K ohodnocení pozic slouží ohodnocovací funkce, kterou je nutné si nejprve pro případ použití Minimaxovou metodou definovat.
4.1.1. Ohodnocovací funkce Pokud známe herní strom celý, je možné pomocí ohodnocovací funkce přiřadit pozici na herní desce odpovídající číselnou hodnotu. Pokud celý herní strom neznáme (většina případů), pak pomocí ohodnocovací funkce přiřazujeme pozici na herní desce odhadovanou heuristickou hodnotu. Čím je hodnota větší (větší než nula), tím výhodnější je pozice pro prvního hráče, který maximalizuje (žádá maximum), čím je hodnota menší (menší než nula), tím je pozice výhodnější pro druhého hráče, který minimalizuje (žádá minimum). Toto platí také obráceně, v případě, kdy se hráči vymění (tj. první minimalizuje, druhý maximalizuje). Hodnota nula znamená, že je pozice vyrovnaná (remíza). Podrobněji
bude
způsob
oceňování
v
ohodnocovací
funkci
diskutován
v implementačním popisu (viz kap. 7.1.2).
4.1.2. Použití Strom na Obr. 2 zobrazuje situaci, kdy hráč, který hru začíná, má možnost provést tři legální (půl)tahy a jeho protivník z každé pozice také tři legální (půl)tahy (dále bude jednoduše označován půltah jako tah). Úkolem je propočítat právě dva tahy, tedy zkoumat
5
Základní algoritmy všechny možnosti tahů prvního hráče a všechny možné odvetné tahy druhého hráče (protihráče). Ohodnocení tahu je shodné s ohodnocením pozice, do které se lze provedením tahu dostat. V ukázkovém případě bylo zvoleno, že první hráč bude hráčem, který maximalizuje ohodnocení tahu (pro všechny možné varianty) a jeho protihráč naopak minimalizuje ohodnocení tahu (pro všechny možné varianty). Při procházení se neustále předpokládá, že protihráč provede svůj nejlepší tah. Tento předpoklad platí pro oba hráče. Od protihráče během hry přirozeně nelze čekat, že se bude snažit hrát jinak.
Obr. 2 – Minimaxový vyhledávací strom
Čísla v uzlech udávají pořadí pozic, jakým způsobem je herní strom procházen. Procházení začíná od pozice (0). Provede se první možný tah prvního z hráčů (tah na obrázku označený jako a). Tímto se přejde do nové pozice (1), ve které je na tahu druhý hráč. Zahraje se první protihráčův tah a přejde se do koncové pozice (2). V této koncové pozici se zavolá ohodnocovací funkce, která ji přiřadí hodnotu. Pozici je přiřazena hodnota +6, maximalizující první hráč je v této pozici ve výhodě. Nyní dojde k návratu do pozice (1), tj. vrátí se první provedený tah protivníka. Provede se druhý z protihráčových tahů. Nová koncová pozice (3) se ohodnotí hodnotou +1 a opět se vrátí provedený tah. Z pozice (1) se provede poslední z protivníkových tahů. Pozici (4) je přiřazena hodnota +5. Procházení pokračuje návratem do pozice (1). Pozici (1) je po návratu z pozice (4) přiřazena hodnota +1, tj. ta nejméně výhodná hodnota pro prvního hráče (volí se minimum), která byla na pozicích (2), (3) a (4) nalezena (hodnota pozice (3)). Dojde k návratu do výchozí pozice (0). Podobně se provedou i další dva zbylé tahy prvního hráče (tahy označené jako b a c) z výchozí pozice. Pozice (5) získá hodnotu –2 a pozice (9) hodnotu –1. Procházení končí na výchozí pozici (0), které se přiřadí nejméně výhodná hodnota pro druhého hráče (volí se
6
Základní algoritmy maximum). Nejvyšší přiřazenou hodnotu má pozice (1) (hodnota +1), proto se tah a, který vede do této pozice, označí za nejlepší (nejvhodnější) a použije se pro hraní. Poněvadž dochází při procházení herního stromu ke střídavému zjišťování minima a maxima, vžil se název pro tuto metodu jako Minimaxová.
4.1.3. Pseudokód algoritmu Algoritmus Minimax zapsaný v pseudokódu vypadá takto: /* vstupním parametrem funkce je výchozí pozice, funkce vrátí její ohodnocení při hledání do hloubky dané druhým parametrem */ p : aktuální pozice na šachovnici h : hloubka prohledávání */ int Minimax(Pozice p, int h) { if (HracNaTahu() == KDO_MAX) /* na řadě je maximalizující hráč*/ return Maximalizuj(p, h); else /* na řadě je minimalizující hráč */ return Minimalizuj(p, h); } /* funkce vybírá maximum nad ohodnocenými pozicemi provedených tahů */ int Maximalizuj(Pozice p, int h) { int nejlepsi = -NEKONECNO; /* hodnota dosud nejlépe ohodnocené pozice */ if (h <= 0 || KoncovaPozice(p)) /* pokud je to poslední nebo koncová pozice,*/ return OhodnotitPozici(p); /* tak ji ohodnoť */ tahy = GenerujTahy(p); /* generuj tahy pro aktuální pozici */ for i = 1 to size(tahy) do { /* cyklus pres všechny tahy */ ProvedTah(tah[i], p); /* zahraj tah */ int hodnota = Minimalizuj(p, h - 1); /* propočtem do hloubky zjisti ohodnocení z hlediska soupeře */ ProvedTahZpet(tah[i], p); /* zahraj tah zpět */ if (hodnota > nejlepsi) /* pokud je vrácená hodnota lepší, než dosud nalezená, tak si ji ulož */ nejlepsi = hodnota; } return nejlepsi; } /* funkce vybírá minimum nad ohodnocenými pozicemi provedených tahů */ int Minimalizuj(Pozice p, int h) { int nejlepsi = NEKONECNO; /* rozdílné oproti maximalizaci */ if (h <= 0 || KoncovaPozice(p)) return OhodnotitPozici(p); tahy = GenerujTahy(p); for i = 1 to size(tahy) do { ProvedTah(tah[i], p); int hodnota = Maximalizuj(p, h - 1); ProvedTahZpet(tah[i], p); if (hodnota < nejlepsi) /* rozdílné oproti maximalizaci */ nejlepsi = hodnota; /* nalezené minimum se uloží */ } return nejlepsi; }
7
Základní algoritmy V uvedeném příkladu implementace Minimax algoritmu je použitý rekurzivní algoritmus, ve kterém je herní strom procházen variantou prohledáváním do hloubky (DepthFirst Search).
4.1.4. Počty strategií Algoritmus Minimax vypadá dokonale. S patřičně zadanou dostatečnou hodnotou hloubky pro prohledávání, by měl algoritmus najít vždy pozici s nejlepším ohodnocením a tedy i tah, který do této pozice vede. Řešení problému spočívá v extrémně velkém množství pozic, které by program pomocí tohoto algoritmu musel projít při použití hrubé síly, tedy procházení všech možných pozic. Vyhledávací strom, který byl použit při popisu Minimaxové metody na Obr. 2, byl s třinácti uzly spíše jen velmi zkrácenou ukázkou. V praxi je pro hru Dáma takový strom mnohonásobně větší. Pro představu: Podle [8] je pro Mezinárodní dámu možný počet všech pozic roven hodnotě přibližně 1,7·1033. Reálně bude počet pozic pro herní stromy menší z důvodu omezení pravidel remízy (omezení počtu tahů na hru), přesto však toto číslo zůstává velmi vysoké. Z uvedeného čísla lze spočítat, že pro hru Dáma, při průměrném počtu dvaceti možných tahů na pozici, je přibližná hloubka úplného stromu „jen“ 25, z časového hlediska je však doba potřebná k projití takového stromu astronomická. Jednoduchým výpočtem je možné zjistit, že při zpracování na počítači umožňujícím zpracovat milion pozic za sekundu, bude doba potřebná k prohledání a výpočtu celého minimaxového stromu trvat 3·1019 let.
4.1.5. Složitost algoritmu Časovou asymptotickou složitost algoritmu je možné snadno odhadnout z vlastností procházení stromu na Ο(W H ) , kde W je průměrná hodnota počtu všech možných tahů z každé pozice (uzlu) stromu a H je hloubka procházeného stromu.
4.2. Algoritmus Negamax Z pseudokódu Minimaxové metody (viz kap. 4.1) je vidět, že metody Minimalizuj a Maximalizuj si jsou velmi podobné. Jejich rozdíly závisí jen na úhlu pohledu hráče, který právě táhne. Uvedený pseudokód lze zjednodušit, pokud nejvyšší kladná hodnota při ohodnocování bude znamenat výhodu pozice pro minimalizujícího hráče. Ohodnocovací funkci je nutné upravit tak, že bude vždy vracet kladné hodnoty pro hráče, který je aktuálně 8
Základní algoritmy na tahu (bude ohodnocovat vždy z hlediska táhnoucího). Změny úhlu pohledu jednotlivých hráčů se projeví střídáním znaménka při volání další úrovně. Kvůli neustálému střídání znaménka ohodnocení, „negování“ hodnoty, se vžil název pro tuto úpravu Minimaxu jako algoritmus Negamax. S algoritmem Negamax pak stále dochází k maximalizaci u obou hráčů.
4.2.1. Pseudokód algoritmu Zápis pseudokódu Minimaxové metody lze podle popsaného návodu upravit a zjednodušit takto: /* vstupním parametrem funkce je výchozí pozice, funkce vrátí její ohodnocení při hledání do hloubky dané druhým parametrem p : aktuální pozice na šachovnici h : prohledávaná hloubka */ int Negamax(Pozice p, int h) { int nejlepsi = -NEKONECNO; /* hodnota dosud nejlépe ohodnocené pozice */ if (h <= 0 || KoncovaPozice(p)) /* pokud je to poslední nebo koncová pozice,*/ return OhodnotitPozici(p); tak ji ohodnoť */ tahy = GenerujTahy(p); /* generuj tahy pro aktuální pozici */ for i = 1 to size(tahy) do { /* cyklus pres všechny tahy */ ProvedTah(tah[i], p); /* zahraj tah */ int hodnota = -Negamax(p, h - 1); /* propočtem do hloubky zjisti ohodnocení z hlediska soupeře */ ProvedTahZpet(tah[i], p); /* zahraj tah zpět */ if (hodnota > nejlepsi) /* pokud je vrácená hodnota lepší, než dosud nalezená, tak si ji ulož */ nejlepsi = hodnota; } return nejlepsi; }
Algoritmus Negamax není žádnou optimalizací algoritmu Minimax. Tyto algoritmy, resp. jejich popisy v pseudokódu, jsou identické. Jedná se pouze o technické zlepšení zápisu Minimaxové metody prohledávání. Výhody kratšího zápisu pomocí Negamax algoritmu bude využito i v další kapitole Alfa-Beta ořezávání.
4.3. Alfa-Beta ořezávání Jak již bylo předvedeno, procházení reálných herních stromů do hloubky při velkém větvení může trvat velmi dlouho (viz kap. 4.1). Otázkou tedy je, jakým způsobem by se dalo procházení stromu více zrychlit. Hloubku omezit nelze, protože prohledaná hloubka přímo určuje kvalitu myšlení, resp. rozhodnutí, který z aktuálních tahů lze považovat za dobrý (vedoucí k vítězství) i po provedení dalších tahů ve hře. Jedinou možností zmenšení počtu prohledávaných pozic je omezit větvení stromu a tím se vyhnout propočítávání pozic 9
Základní algoritmy odvozených na těchto větvích. Tomuto se obecně říká ořezávání (někdy též odsekávání). Je samozřejmé, že nelze zahazovat a odstraňovat větve (tahy) nahodile. Hrozilo by provedení špatných tahů, které by výsledek prohledávání znehodnotily. Základní myšlenkou Alfa-Beta ořezávání je nepočítat takovou pozici, která ve výsledku stejně neovlivní výběr nejlepšího tahu. Jinak řečeno, je-li nějaký tah špatný (horší než dosud zjištěný), nemá význam se jím dále zabývat při testování protivníkových odpovědí. Provedením takového tahu by se dalo již jen zjistit, že je tento tah ještě horší.
4.3.1. Použití Ukažme příklad aplikování výše zmíněné myšlenky Alfa-Beta algoritmu na stromu podobném jako u popisu Minimaxové metody (Obr. 3).
Obr. 3 – Minimaxový herní strom s aplikovanou metodou Alfa-Beta ořezávání
Při procházení stromu se nejprve prozkoumávají koncové pozice (2), (3) a (4) a tím se pro první tah (tah a) na výchozí pozici zjistí hodnota +1. Dále se prozkoumává druhý tah (tah b) a pro koncovou pozici (6) se získá hodnota –2. Nalezená hodnota –2 dává jistotu, že ohodnocení na pozici (5) nebude již větší než zmíněná –2. Z toho ovšem vyplývá, že tah b bude při porovnání na výchozí pozici (0) vždy horší než tah a. O kolik horší bude tah b než tah a, není nutné vědět. Logicky lze vyvodit, že pozice (7) a (8) není potřeba uvažovat, lze tedy po prozkoumání pozice (6) testování dalších větví odvozené od pozice (5) okamžitě přerušit. Tahy vedoucí do pozice (7) a (8) jsou tímto odstraněny z prohledávání. Podobnou úvahu lze aplikovat i v případě třetího tahu (tah c) vedoucího z kořene. Hodnota +4 získaná na pozici (10) ještě neumožňuje možnost přerušení hledání (může stále existovat lépe ohodnocený tah než tah a, resp. třetí tah skončí s lepším výsledkem) a je proto nutné prozkoumat druhý tah vedený od pozice (9). Pozice (11) však vrací hodnotu –1 a je tak
10
Základní algoritmy zřejmé, že nejlepším tahem bude celkově zvolený tah a. V tuto chvíli je prohledávání dalších tahů od pozice (9) přerušeno a pozice (12) tak prozkoumána nebude. Provedené zkrácení, při kterém se neuvažují odvetné tahy protivníka, se nazývá alfa
ořezávání. Stejně tak existuje i zkrácení tahů začínajícího hráče. Tento typ zkrácení se ovšem vyskytuje až od druhého půltahu a nazývá se beta ořezávání. Technika využívající oba způsoby ořezávání větví se pak nazývá Alfa-Beta ořezávání (Alfa-Beta metoda).
4.3.2. Pseudokód algoritmu Z předchozího textu plyne, že Alfa-Beta metoda je jen úpravou původní Minimaxové metody. Níže uvedený pseudokód vychází z kratší formy zápisu, tak jak ji používá Negamax. Samozřejmě by bylo možné rozepsat pseudokód i jako delší variantu pomocí metod pro minimalizaci a maximalizaci. /* vstupním parametrem funkce je výchozí pozice, funkce vrátí její ohodnocení při hledání do hloubky dané druhým parametrem a omezeními dané hodnotami alfa a beta p : aktuální pozice na šachovnici h : prohledávaná hloubka alfa : dolní mez očekávané hodnoty beta : horní mez očekávané hodnoty */ int AlfaBeta(Pozice p, int h, int alfa, int beta) { if (h <= 0 || KoncovaPozice(p)) /* pokud je to poslední nebo koncová pozice, */ return OhodnotitPozici(p); /* tak ji ohodnoť */ tahy = GenerujTahy(p); /* generuj tahy pro aktuální pozici */ for i = 1 to size(tahy) do { /* cyklus pres všechny tahy */ ProvedTah(p); /* zahraj tah */ /* propočtem do hloubky zjisti ohodnocení z hlediska soupeře */ int hodnota = -AlfaBeta(p, h – 1, -beta, -alfa); ProvedTahZpet(tah[i], p); /* zahraj tah zpět */ if (hodnota >= beta) return beta; /* při tomto návratu dojde k úspoře */ if (hodnota > alfa) /* pokud je vrácená hodnota lepší, než dosud nalezená, tak si ji ulož */ alfa = hodnota; } return alfa; }
Oproti zápisu Negamax, úprava kódu zápisu nepřináší příliš mnoho změn. Přesto, v parametru metody přibyly proměnné alfa a beta, které jsou využity při aplikaci metody ořezávání. Proměnná alfa určuje hodnotu dosud nejlepšího nalezeného tahu, beta pak stanovuje hodnotu nejhoršího případu soupeře. Volání nižší úrovně není tak jednoduché jako v případě Negamaxu. Při zahrání půltahu se změní hráč, který je na tahu. Je proto třeba výsledek volání podúrovně vynásobit -1 11
Základní algoritmy a současně musí dojít k prohození proměnných alfa i beta, které jsou taktéž vynásobeny -1. Hodnoty alfa a beta si tak vymění úlohy. Tímto je zajištěno, že se při rekurzivním volání změní perspektiva k vyjádření skutečnosti, že se každý hráč snaží porazit toho druhého. Hodnotu alfa lze také popsat jako dolní a betu jako horní mez intervalu, ve kterém se bude výsledná hodnota kořenové pozice vyskytovat. Tento interval se postupně při zpětném ohodnocováním pozic metodou upravuje a zmenšuje. Častěji se také pro interval (alfa, beta) používá výraz vyhledávací okno (search window). Všechny hodnoty mimo vyhledávací okno jsou během prohledávání označeny jako nezajímavé a pozice vně vyhledávacího okna jsou tímto ořezány (nejsou zkoumány). K zaručení, že dojde k nalezení správné hodnoty, je první volání Alfa-Beta metody iniciováno hodnotami (1) a (2).
alfa = −∞ (1) beta = ∞ (2)
Důležitou vlastností Alfa-Beta ořezávání je, že hodnota nejlepšího tahu (výsledek algoritmu), je vždy shodná s hodnotou, která by byla získána při prohledávání Minimaxovou metodou. Díky technice ořezávání větví však přesto dojde k značné úspoře času.
4.3.3. Složitost algoritmu V příkladu ukázky použití Alfa-Beta algoritmu (Obr. 3) je u třetího možného tahu počítače na pozici (9) patrné, že pokud by bylo pořadí zkoumaných pozic (10) a (11) přehozeno, došlo by k ořezávání a nemuselo by tak dojít ani k prohledávání pozice (10). Efektivita Alfa-Beta metody je silně dána pořadím prohledávaných pozic. V případě, kdy místo Minimaxové metody bude použita Alfa-Beta metoda a uspořádání procházených pozic bude ideální (tedy nejvýhodnější tah hráče, který je aktuálně na tahu, je zkoumán jako první), pak je možné za stejný čas hloubku prohledávání stromu zdvojnásobit (viz [9]). Pro ideální případ je časová asymptotická složitost algoritmu Ο( Z H ) , kde Z je rovno druhé odmocnině průměrné hodnoty počtu všech možných tahů z každé pozice (uzlu) stromu a H je hloubka prohledávaného stromu. V nejhorším případě (tahy pro aktuálně hrajícího hráče budou zkoumané od nejméně výhodného) se prohledávání Alfa-Beta metodou degraduje na hledání Minimaxovou metodou. Idea Alfa-Beta ořezávání je velmi jednoduchá, dá se říci téměř triviální. Je proto zajímavé, že k objevení této úpravy prohledávání herních stromů došlo až 14 let po von Neumannově zveřejnění Minimaxové metody (viz kap. 2).
12
Techniky zlepšující Alfa-Beta ořezávání
5. Techniky zlepšující Alfa-Beta ořezávání Během práce na programech založených na metodě Alfa-Beta ořezávání byla vyvinuta řada technik, z nichž některé ve výsledku vylepšují celkové chování (lepší forma prohledávání) a některé algoritmus zrychlují. Mezi hlavní skupiny technik patří: •
třídění tahů,
•
hledání klidu,
•
hledání minimálního okna.
Uvedené techniky bývají dále jednotlivými autory modifikovány pro konkrétní hry a aplikace. Zmíněné techniky jsou detailně rozebrány např. v [1] popř. [9].
5.1. Třídění tahů Účinnost Alfa-Beta ořezávání závisí na konkrétním pořadí procházených tahů. Pracuje efektivně, pokud jsou tahy procházeny od nejlepších k nejhorším. Mez alfa se pro tento případ posune tak vysoko, že výpočet končí prvním protivníkovým tahem. Je proto nutné snažit se dosáhnout tohoto pořadí. Uvedené posloupnosti není možno vždy přesně dosáhnout (využívá se heuristika), přesto lze získat zajímavé výsledky zejména v oblasti eliminace procházených pozic a tím zrychlit procházení stromu (procházet do větší hloubky za stejný čas).
5.1.1. Statické třídění Intuitivní způsob řešení, který se nabízí, je setřídit tahy pro danou pozici již během generování tahů (generátor tahů bude detailněji diskutován v kap. 7.1), popř. tahy seřadit následně po generování tahů. Třídění probíhá tak, že se každý z tahů na dané úrovni provede a ohodnotí (tedy dojde k prohledání do jednoho půltahu). Následně se všechny tahy setřídí podle výhodnosti z pohledu hráče, který je na tahu. Ve hře Dáma se běžně stává, že hráč má na výběr několik braní různě pro něj výhodných (např. ztráta dámy, ztráta různého počtu kamenů). Tímto lze s určitou pravděpodobností nevýhodné tahy při prozkoumávání odsunout pro pozdější zpracování a zvýšit tak šanci na aplikaci metody ořezávání. Časové ztráty způsobené provedením tahu a následným tříděním bývají ve většině případů zanedbatelné.
13
Techniky zlepšující Alfa-Beta ořezávání
5.1.2. Killer moves heuristika Myšlenka této heuristiky je jednoduchá. Vychází z toho, že pozice (resp. rozložení kamenů na hracích polích) si jsou velmi podobné. Způsobil-li nějaký tah ořezávání, je pravděpodobné, že na jiné pozici, která je na stejné úrovni stromu, způsobí toto ořezávání také. V programech bývá tento způsob realizován tak, že jsou během prohledávání uloženy (typicky) 2 tahy pro danou úroveň, které způsobují ořez (pod pojmem „killer moves“ si lze představit množinu tahů, které jsou příčinou ořezávání větví). Při procházení se na dané hloubce ověří, zda některý z vygenerovaných tahů není z již uložených „killer moves“. V případě, že ano, jsou tyto tahy provedené mezi prvními (je větší pravděpodobnost, že opět způsobí ořezávání). Způsobil-li nějaký nový tah ořezávání a zároveň není ještě součástí seznamu tahů způsobujících ořezávání, tak se dotyčný tah jednoduše vymění za jeden ze dvou tahů uložených v seznamu.
5.1.3. Historická heuristika Historická heuristika, která byla prvně představena Jonathanem Schaefferem [2], zobecňuje základní myšlenku killer moves heuristiky. Stejně jako killer moves heuristika využívá k řazení tahů jejich předešlou efektivnost při ořezávání, neomezuje se však pouze na určitou hloubku, ale využívá získané informace pro třídění tahů v celém procházeném stromě.
5.1.3.1. Pseudokód algoritmu Funkci historické heuristiky v Alfa-Beta algoritmu ukazuje následující pseudokód:
14
Techniky zlepšující Alfa-Beta ořezávání /* vstupním parametrem funkce je výchozí pozice, funkce vrátí její ohodnocení při hledání do hloubky dané druhým parametrem a omezeními dané hodnotami alfa a beta p : aktuální pozice na šachovnici h : prohledávaná hloubka alfa : dolní mez očekávané hodnoty beta : horní mez očekávané hodnoty */ int AlfaBeta(Pozice p, int h, int alfa, int beta) { if (h <= 0 || KoncovaPozice(p)) /* pokud je to poslední nebo koncová pozice, */ return OhodnotitPozici(p); /* tak ji ohodnoť */ tahy = GenerujTahy(p); /* generuj tahy pro aktuální pozici */ for i = 1 to size(tahy) do /* ohodnoť každý tah podle tabulky */ ohodnoceni[i] = TabHistorie[tah[i]]; /* historie */ Setrid(tahy, ohodnoceni); /* setřídit tahy podle ohodnocení */ for i = 1 to size(tahy) do { /* cyklus pres všechny tahy */ ProvedTah(p); /* zahraj tah */ /* propočtem do hloubky zjisti ohodnocení z hlediska soupeře */ int hodnota = -AlfaBeta(p, h – 1, -beta, -alfa); ProvedTahZpet(tah[i], p); /* zahraj tah zpět */ if (hodnota >= beta) { /* úprava tabulky historie */ TabHistorie[tah[i]] = TabHistorie[tah[i]] + Vaha(h); return beta; /* při tomto návratu dojde k úspoře */ } if (hodnota > alfa) /* pokud je vrácená hodnota lepší, než dosud nalezená, tak si ji ulož */ alfa = hodnota; } return alfa; }
Zvýrazněné řádky kódu označují přidané části k Alfa-Beta algoritmu. Jak je vidět, historická heuristika zvyšuje ohodnocení každému tahu, který způsobil ořezávání. Tabulka historie (v kódu označena jako TabHistorie) tak vyjadřuje míru úspěchu konkrétního tahu při ořezávání. Je nutné vysvětlit použití váhy při hodnocení tahu na různých hloubkách pro tabulku historie (funkce Vaha). Schaeffer ve své práci navrhuje zvolit takovou váhu, aby při třídění došlo k preferenci tahů, které jsou blízko kořene, před tahy, které jsou od kořene nejdále (nejhlubší pozice). Jako funkci pro váhu tahu je doporučováno použít 2 h , kde h je aktuálně prohledávaná hloubka. Navrhovaný vzorec je podložený empiricky. Hodnoty pro tahy v tabulce historie se s výhodou uchovávají i do dalšího hledání (procházený strom má nový kořen). Přímé znovupoužití hodnot z tabulky by však mohlo způsobit, že by byly preferovány starší zjištěné tahy před tahy nově objevenými (provedené na větších hloubkách). Z tohoto důvodu se před novým hledáním hodnoty tabulky historie krátí konstantou (v [9] je doporučována hodnota 2).
15
Techniky zlepšující Alfa-Beta ořezávání
5.1.4. Iterativní prohlubování Metoda iterativního prohlubování není přímo třídící heuristikou. Jedná se o úpravu Alfa-Beta metody. Místo provádění volání Alfa-Beta metody s pevnou hloubkou h , se provede volání postupně s hodnotou 1, 2, 3, … h . Tato úprava způsobí zpomalení, které ale nebude výrazné. Důvodem je zapojení ostatních třídících heuristik, které při opětovném volání průchod již prozkoumanou úrovní urychlí. Využívá se skutečnosti, že výsledkem zkoumání do určité hloubky je tah obvykle stejný, jako v případě zkoumání do hloubky o půltah větší. Jednou z pohnutek pro použití iterativního prohlubování je možnost lepší kontroly času při hře, pokud existuje časové omezení na nalezení tahu. Dobu běhu Alfa-Beta metody s pevně zadanou hloubkou je velmi těžké odhadnout. Omezení časem lze implementovat pomocí prohlubování jednoduše tak, že pokud vyprší stanovený čas, aktuální prohledávání se přeruší a použije se výsledek z posledního zkoumání. K urychlení iterativního prohlubování napomáhá do značné míry i transpoziční tabulka.
5.1.5. Transpoziční tabulka Problematika transpoziční tabulky a její implementace je poměrně obsáhlá, proto zde budou uvedeny jen základní principy použití spolu s odkazy na literaturu. To, co se obvykle nazývá herní strom, ve skutečnosti stromem není. Jedná se o obecný orientovaný graf. Z kořene (výchozí pozice) lze leckdy nalézt takové dvě různé cesty, které povedou do stejného uzlu. Příkladem může být jednoduchá posloupnost tahů: první hráč táhne kamenem z pozice na herní desce A do pozice B, protihráč táhne z pozice C do pozice D. První hráč je opět na řadě a táhne zpět (objevila se například nová hrozba) z pozice B do C. Druhý hráč zareaguje podobně, přesune svůj kámen z D do C. Tímto opět vznikne stav, ze kterého se původně vycházelo. K omezení procházení a využití informací z již jednou ohodnocených pozic slouží transpoziční tabulka. Transpoziční tabulka si před ukončením průchodu pozicí (před návratem hodnoty ohodnocované pozice) uchová několik údajů: aktuální hloubku pozice, nejlepší tah pro pozici a ohodnocení na pozici s příznakem (viz dále). Význam ohodnocení a nejlepšího tahu pozice je zřejmý, jedná se o hodnotu propočtu pozice. Důvod pro uložení informace o hloubce pozice je ten, že v případě, kdy se jedná o výsledek prohledávání do menší hloubky než nově 16
Techniky zlepšující Alfa-Beta ořezávání počítané, nelze přímo vrátit uloženou hodnotu ohodnocení jako hodnotu pozice. Nutnost použití příznaku pro typ ohodnocení je komplikovanější a pochází z podstaty Alfa-Beta metody. Příznak definuje, zda uložená hodnota ohodnocení vznikla přímo ohodnocením dané pozice (skutečná hodnota), nebo při alfa či beta ořezávání a jedná se tedy o horní resp. dolní odhad tohoto ohodnocení (viz [10]). Při zkoumání každé nové pozice se nejprve ověří, zda již obsahuje o této pozici záznam v transpoziční tabulce. Pokud dojde k nalezení záznamu o pozici v tabulce, mohou nastat 2 způsoby využití: 1) Hloubka aktuální pozice je menší nebo rovna hloubce uložené při předchozím prohledávání pozice. Pro tento případ se použije hodnota ohodnocení uložené v tabulce. V případě, že příznak označuje jednu z mezí skutečné hodnoty, použije se ohodnocení k nastavení vyhledávacího okna, resp. zmenšení intervalu. Je-li příznak nastaven na skutečnou hodnotu, ohodnocení, resp. tah, který záznam v tabulce definuje, je výsledkem procházené pozice. 2) Hloubka aktuální pozice je větší než při posledním průchodu. Jak již bylo zmíněno výše, informaci o ohodnocení v tomto případě nelze použít. Načte se údaj o nejlepším tahu pro potřeby třídění tahů – tah se provede jako první. Opět se využívá předpokladu, že tah dříve označený za nejlepší, bude nejlepší i při prohledávání do větší hloubky. Tato situace se často vyskytuje při iterativním prohlubování (viz kap. 5.1.4), kde dochází k opakovanému procházení pozic.
Přirozeně, není-li v tabulce o zkoumané pozici žádný záznam, hledání pokračuje standardním způsobem použitého algoritmu. Základními operacemi nad transpoziční tabulkou jsou vložení pozice a vyhledání informace o pozici. Aby bylo možné dosáhnout co nejmenších časových ztrát při volání této funkčnosti, používá se k implementaci hash tabulka [@HASHTABLE], která provádí tyto operace s konstantní asymptotickou složitostí. Pro případ hry dvou hráčů se ke generování klíče pozice (hash funkce) využívá Zobristovy metody [12]. Konkrétní úpravy Alfa-Beta ořezávání a popis aplikace Zobristovy metody k využití transpoziční tabulky lze najít na [13], popř. [2].
17
Techniky zlepšující Alfa-Beta ořezávání
5.2. Hledání klidu Algoritmus Minimax využívá jako vstupní parametr propočtu pevně stanovenou hloubku z důvodu časové náročnosti prohledávání (viz kap. 4.1). Je možné si představit situaci, kdy provedením posledního půltahu do stanovené hloubky hráč získá povýšením svého obyčejného kamene dámu. Takový stav ohodnocovací funkce ohodnotí velmi štědře – vysokou hodnotou, protože kámen dámy obvykle znamená významnou převahu ve hře a pravděpodobně dojde ke zvolení tahu vedoucího k této pozici. Získání dámy však může být pouze pastí protihráče, poněvadž jeho prvním protitahem může dojít pomocí přeskoku k zisku jiných kamenů, který výhodu dámy převýší. Dochází zde ke skokové změně převahy jednotlivých hráčů. Ohrožení prvního hráče by bylo při prohledávání detekováno, pokud by došlo k prohledávání do větší hloubky, ta je však omezená. Jedná se o tzv. efekt horizontu. V případech, jako je výše uvedený, najde uplatnění technika hledání klidu (quiescence search). Technika hledání klidu spočívá v procházení tahů i za maximální nastavenou hloubku. Probírány jsou už ovšem jen takové tahy, které mohou způsobit na herní desce zvrat v převaze jednoho z hráčů. Prohledávání se snaží najít takový stav, kde nehrozí okamžitý obrat situace na herní desce pro jednoho z hráčů – stav klidu. Techniku hledání klidu nelze použít ve všech hrách dvou hráčů. Ne vždy je totiž možné určit, které tahy, resp. pozice, by se měly použít k hlubšímu prohledávání (např. méně známá hra Amazons [14]). Ve hře Dáma je výběr tahů jednoduchý – jedná se o přeskoky. Implementování techniky hledání klidu má poměrně výrazný pozitivní efekt na umělou inteligenci počítače, protože dojde k prozkoumávání pozic do větších hloubek, ale zároveň se neuplatní vážné časové ztráty způsobené hlubším prohledáváním, protože jsou zkoumány jen taktické pozice.
5.3. Hledání minimálního okna Algoritmy hledání minimálního okna představují další skupinu zlepšení a rozšíření Alfa-Beta algoritmu, které se snaží zrychlit procházení herního stromu. Podobně jako u technik třídění tahů je snahou dosáhnout minimálního nutného počtu procházených pozic pomocí ořezávání. Ořezávání však není způsobeno úsilím o ideální posloupnost tahů, ale zmenšováním vyhledávacího okna, resp. intervalu (alfa, beta), na minimum. Mezi nejznámější zástupce patří algoritmus Negascout [15] a MTD(f) [16].
18
Použité technologie
Část III – Návrh a realizace Samotný program je poměrně rozsáhlý, proto jsou v této části popsány pouze základní komponenty a myšlenky návrhu. Hlavní popis návrhu je zaměřen na použité techniky tvorby umělé inteligence. Nemalá část textu se věnuje problematice formátu PDN a jeho využití.
6. Použité technologie 6.1. Jazyk Java Programovací objektově orientovaný jazyk Java vyvinutý firmou Sun [17] patří v současnosti mezi nejoblíbenější. Své uplatnění našel především v komerční sféře k programování serverových aplikací. Známé jsou ale i programy menšího rozsahu určené pro webové prohlížeče – applety a programy pro mobilní telefony – midlety. Poslední roky ovšem vzrůstá oblíbenost použití jazyka Java při vytváření desktopových aplikací. Důvody jsou především tyto: •
jednoduchost a robustnost – jazyk Java nepoužívá obtížné konstrukce jiných jazyků (např. C++) a je snadné se ho naučit,
•
multiplatformost – snadná přenositelnost výsledného programu na libovolný operační systém,
•
rychlost vývoje – podpůrné knihovny jsou velmi rozsáhlé a významně šetří čas při vývoji.
Mezi nevýhody lze zařadit pomalejší start aplikací a větší spotřebu paměti, což je dáno základem technologie jazyka Java – použití virtuálního stroje a univerzálního bytekódu (viz [19]). Otázka absolutního výkonu rychlosti běhu aplikací je sporná. V současnosti jsou aplikace naprogramované v Javě ještě pomalejší než nativně kompilované aplikace, ale díky lepší správě používané paměti mohou v některých oblastech dosáhnout i vyššího výkonu (viz např. [18]). Je pravděpodobné, že s dalším vývojem budou tyto nevýhody odstraněny. K implementaci byla využita poslední verze jazyka Java (5.0, dříve také značeno jako 1.5).
19
Části aplikace
6.2. Java Swing Java Swing (známé též jako JFC – Java Foundation Classes) je knihovna funkcí naprogramovaná v Javě určená k tvorbě uživatelského rozhraní. Tyto knihovny obsahují vše potřebné k tvorbě profesionálního uživatelského rozhraní – komponenty pro práci s daty, dialogy, grafikou či obrázky. Za konkrétní zmínku stojí podpora tzv. systémových Look&Feels, což je sada funkcí, které velmi věrně emulují vzhled a chování grafického rozhraní operačního systému na kterém aplikace běží a tím zvyšují intuitivnost ovládání programu pro uživatele. Podstatnou výhodou oproti konkurenčním technologiím (např. SWT – Standard Widget Toolkit [20]) je to, že knihovny jsou standardní součástí nejrozšířenější standardní distribuce J2SE (Java 2 Standard Edition, více viz [18]). Není proto nutné distribuovat knihovny Swing spolu s aplikací.
7. Části aplikace 7.1. Umělá inteligence K vytvoření umělé inteligence pro hru Dáma jsou nutné celkem tři komponenty: •
generátor tahů,
•
ohodnocovací funkce,
•
rozhodovací algoritmus.
Použití komponent vyplývá z principu Minimaxové metody (viz kap. 4.1). Komponenty generátor tahů a ohodnocovací funkce jsou vždy závislé na konkrétní hře a pravidlech. Rozhodovací algoritmus, pracující na základě Minimaxové metody, tyto 2 části vždy využívá (Obr. 4).
Obr. 4 – Komponenty nutné k vytvoření umělé inteligence pro hru dvou hráčů
20
Části aplikace Nyní budou rozebrány jednotlivé komponenty podrobně.
7.1.1. Generátor tahů Generátor tahů má za úkol vytvoření seznamu všech legálních tahů na pozici pro hráče, který je na tahu. V generátoru tahů stráví počítač při hledání nejlepšího tahu pozice poměrně významné množství strojového času, proto je nutné, aby bylo generování a provádění tahů co možná nejrychlejší. Implementovat generátor tahů pro hru Dáma není obtížné, navrhnout implementaci tak, aby byla zároveň rychlá, již tak jednoduché není. Základním kamenem generátoru jsou použité datové struktury pro vnitřní reprezentaci – herní deska (reprezentuje postavení kamenů) a tah hráče. Programovou implementaci generování tahů lze najít ve třídě MoveGenerator50 (více viz kap. 7.2).
7.1.1.1.
Datová struktura herní desky
Herní deska podle pravidel Mezinárodní dámy má 10×10 polí (Obr. 5).
Obr. 5 – Herní deska pro Mezinárodní dámu
Jako datová struktura se nabízí k použití dvourozměrné statické pole 10×10 prvků. Takto velké pole je však zbytečně velké, protože se (na rozdíl od šachů) hraje pouze na padesáti polích (na obrázku jsou číslována) a příliš mnoho prvků by tak zůstalo nevyužitých. K uložení stavu rozestavení kamenů tedy stačí padesát prvků a statické pole lze použít jednorozměrné. Často během hry a ke generování tahů je k informaci o rozestavění kamenů potřeba vědět, který hráč je aktuálně na tahu, proto je tento údaj uložen přímo v datové struktuře herní desky na indexu 0. Jednotlivé indexy prvků pole 1 až 50 odpovídají pozicím na herní 21
Části aplikace desce. Strana s hracími poli s nejmenšími indexy je přiřazena hráči černému, opačná strana je přiřazena hráči bílému (viz Obr. 5). Na herní desce se vyskytují celkem čtyři typy kamenů: bílý kámen, bílá dáma, černý kámen a černá dáma. Navíc může být pole prázdné. K rozlišení typu kamene v prvku statického pole slouží konstanty, které jsou součástí třídy Board50Consts. Bílým kamenům jsou přiřazeny kladné hodnoty a černým záporné. Tohoto nastavení se s výhodou využívá při testování přítomnosti hráčova (vlastního) kamene nebo kamene protihráče na poli herní desky (jednoduchý test na zápornost či kladnost hodnoty). Deklarace herní desky pro potřeby generátoru tahů vypadá následovně: byte board[] = new byte[Board50Consts.BOARD_SIZE];
Odborná literatura ([2]) popisuje i další možnost reprezentace herní desky – zápis pozic desky na úrovni bitů. Tuto variantu jsem nezvolil. Použití by bylo nepřehledné.
7.1.1.2. Datová struktura tahu Struktura tahu pro hru Dáma není komplikovaná. Podobně jako pro pozici na herní desce se využije jednorozměrného pole. Pohyb kamene je vyjádřen posloupností zápisu čísel polí. Pro případ přeskoku se zaznamenávají i meziskokové pozice (potřebné pro provádění tahů).
Obr. 6 – Příklad obsahu datové struktury tahu
Příklad na Obr. 6 demonstruje uložení přeskoku kamene. Kámen začíná na pozici 36, pokračuje skokem přes pozici 31 na 27 a dále přes pozici 32 na 38, kde tah končí. Nultý index pole popisuje délku tahu (počet zaznamenaných pozic). V tomto případě má hodnotu 3. Jednoduché tahy a jednoduché přeskoky obsahují pouze počáteční a koncovou pozici. Nultý index mají nastaven na hodnotu 2.
22
Části aplikace
7.1.1.3. Generování tahů Generování tahů pro dané postavení na herní desce se provádí tak, že jsou procházeny postupně všechna hrací pole herní desky. Je-li nalezen kámen hráče, který je na tahu, hledají se pro něj legální tahy. Hledání je rozděleno podle typu kamene a typu tahu. Tahy se dělí na jednoduché (pouze posuny s kamenem) a přeskoky (dochází k braní protivníkových kamenů).
Obyčejné kameny Nalézt jednoduché tahy obyčejného kamene je snadné. Pozice sousedních polí jsou uloženy v předem připraveném poli (MoveGenConsts.LINEAR_MOVE) a pouze se otestuje, zda pozice v testovaném směru není obsazena již jiným kamenem. Pokud je pozice prázdná, je nalezen tah. Hledání přeskoku obyčejných kamenů je komplikovanější. Postupně jsou procházeny všechny čtyři možné směry z výchozí pozice. Nejprve se ověří, že lze provést ve zkoumaném směru skok (sousední pozice obsahuje protivníkův kámen a pozice za ním je prázdná). Tím však prohledávání nekončí. Skok může podle pravidel pokračovat dále. Funkce rekurzivně zavolá sama sebe a hledání pokračuje stejným způsobem znovu od pozice meziskoku. K zabránění zacyklení se využívá jednoduchého triku – přeskočené kameny se před rekurzivním zavoláním označí za vlastní. Rekurze končí a tah je nalezen, pokud již nelze pokračovat v přeskoku v žádném směru. Po návratu z rekurzivního volání se přeskočené pozici vrátí původní hodnota a testuje se případně další směr skoku. Pravidla stanovují, že jsou na dané pozici povoleny pouze nejdelší možné tahy. Tah přeskoku se přidá do seznamu nalezených, je-li jeho délka větší nebo rovna délce jiného tahu nalezeného před ním. Pokud je nově objevený tah nejdelší, je seznam nalezených tahů předem vyprázdněn. Aby se omezilo mazání a ukládání nad seznamem nalezených tahů, jsou předem zkoumány přeskoky dámy (je zde předpoklad, že délka přeskoku bude větší).
Kameny dámy Řešení hledání tahů pro kameny dámy je stejné jako u obyčejných kamenů, s tím rozdílem, že je nutné testovat všechny pozice ve směru – až k okraji desky.
23
Části aplikace
7.1.1.4. Provádění tahů Součástí třídy, která implementuje generátor tahů (MoveGenerator50), je i provedení tahu nad pozicí, poněvadž se jedná o podobnou funkčnost, která používá stejné datové struktury. Provedení jednoduchého tahu je triviální. Hodnota kamene z první pozice se přesune na koncovou pozici a první pozice se označí jako prázdná. V případě obyčejných kamenů se vždy testuje, zda koncová pozice není na poslední řadě, kde dochází k povýšení obyčejného kamene na dámu. Pokud ano, dojde k povýšení. U přeskoků je přesun obdobný. Navíc je nutné odebrat přeskočené kameny. K nalezení pozic přeskočených kamenů se využívá předem vypočítané pole s konstantami sousedních pozic, podobně jako při generování tahů.
7.1.2. Ohodnocovací funkce Lze říci, že funkcionalita ohodnocovací funkce je „centrálním mozkem“ umělé inteligence hry. Přímo určuje to, jakou úroveň bude mít počítač jako protivník proti lidskému hráči během hry. Různé implementace hry Dáma mohou mít podobný generátor tahů nebo mohou používat stejný algoritmus k procházení herních stromů. Vždy se ovšem budou lišit v ohodnocovací funkci. Popis ohodnocovací funkce je největším „know-how“ autorů jednotlivých programů a získané skutečnosti při tvorbě ohodnocovací funkce si pečlivě chrání. Ohodnocovací funkce přiřazuje pozici hodnotu podle výhodnosti pro hráče, který je na tahu. Funkce je vždy volána v koncové pozici minimaxového herního stromu (viz kap. 4.1). Výsledek může mít vliv na další procházení stromem. Jaká by ohodnocovací funkce měla být? Především by měla být dostatečné rychlá a přesná. Přesnost odhadu udává, jak dobře předpoví případný vývoj provádění tahů z oceňované pozice – zda se pro hráče jedná o cestu k vítězství nebo prohře. Výpočet ohodnocovací funkce musí být rychlý, protože je funkce často volána z procesu procházení stromu, a proto je výsledný kód počítání ohodnocení vždy kompromisem mezi rychlostí výpočtu hodnoty funkcí a prováděnou detailní analýzou odhadu pozice. V mé implementaci je hráč hrající za bílé zvolen jako maximalizující, tj. snaží se dosáhnout co největší kladné hodnoty při průchodu stromem. Přirozeně hráč hrající za černé
24
Části aplikace se snaží dosáhnout opaku. Tomu odpovídají i hodnoty vrácené implementovanou ohodnocovací funkcí. Hledání konkrétních hodnot pro ohodnocení je časově náročné, protože se při hledání vychází z empirického zkoumání chování počítače při hře. Poměrně špatně se posuzuje kvalita zahraného tahu z pohledu laika, který hru Dáma profesionálně nehraje. Toto byl bezesporu jistý handicap při sestavování ohodnocovací funkce. Je známo a popsáno několik způsobů, jak určit odhad hodnoty pozice (viz např. [2]). V mé implementaci byly použity dvě složky ohodnocení – materiální a poziční. Celkové hodnocení tvoří suma obou složek.
7.1.2.1. Materiální ohodnocení Materiální ohodnocení je obecný termín pro hodnotu pozice z hlediska počtu konkrétních kamenů na pozici. Cílem hry Dáma je odstranit všechny protivníkovy kameny. Rozdíl v počtu kamenů obou hráčů udává, jak si na tom konkrétní hráč stojí. Např. bude-li na pozici 5 bílých a 10 černých kamenů, bude rozdíl počtu činit –5. Záporná hodnota značí výhodu pro černého. Každý kámen má však ve hře jinou strategickou hodnotu. Kámen dámy má jistě větší hodnotu než obyčejný kámen, proto se při součtu kamenů hledí také na jejich typ. K vyjádření této skutečnosti je nastavena hodnota bílého kamene na +2 a dámy na +9 (černému ekvivalentně –2 a –9). Kámen dámy se tak vyrovná více než čtyřem obyčejným kamenům. Při celkovém výpočtu materiálního ohodnocení bude na pozici s kameny dámy hodnota součtu výraznější (nabývat většího rozsahu hodnot) a tím pozice při průchodu stromem preferovanější (popř. spíše odmítaná, závisí na úhlu pohledu).
7.1.2.2. Poziční ohodnocení Druhou složku, neméně významnou, tvoří poziční ohodnocení. Poziční ohodnocení se snaží preferovat takové pozice, na kterých se vyskytuje určité rozestavení kamenů. Kámen dámy má poměrně význačnou hodnotu během hry, proto se do celkového hodnocení započítává bonus, pokud má hráč obsazenu některou z pozic v zadní řadě (na své straně) vlastním kamenem (nerozlišuje se jakým). Tím má protihráč omezenou možnost povýšení svého obyčejného kamene na dámu. Další bonus získá, pokud jsou krajní pozice herní desky obsazeny hráčovým kamenem. Kameny na krajních pozicích jsou lépe ochráněny před braním. 25
Části aplikace Za každou ze zmíněných pozic získává výsledné ohodnocení navíc hodnotu +1 pro bílé, resp. –1 pro černé.
7.1.2.3. Realizace ohodnocovací funkce Aby nebylo nutné po každém provedeném tahu do koncové pozice (viz kap. 4.1), kde se provádí ohodnocení, procházet celou datovou strukturu herní desky a opětovně rozlišovat typy kamenů, je prováděno inkrementální počítání. Při každém provádění tahu, který je skokem, se upravuje celkový součet strategických hodnot kamenů obou hráčů podle odebíraných kamenů z herní desky. Popsaná implementace ohodnocovací funkce je součástí třídy Board (viz kap. 7.2) a vypadá následovně: public final int evaluation() { int sum = staticEvaluation; //materiální ohodnocení int i = 1; do { //zadní řady if (isBlack(board[i])) --sum; if (isWhite(board[45 + i])) ++sum; } while (++i < 6); i = 0; byte temp; do { //postranní pole temp = board[6 + i]; if (isWhite(temp)) ++sum; else if (temp != Board50Consts.NOTHING) --sum; temp = board[15 + i]; if (isWhite(temp)) ++sum; else if (temp != Board50Consts.NOTHING) --sum; i += 10; } while (i <= 20); }
return sum;
7.1.3. Rozhodovací algoritmus Ohodnocovací funkce byla přirovnána k „mozku“ v umělé inteligenci hry Dáma. Podobně lze rozhodovací algoritmus (pracující na základě Minimaxové metody) přirovnat k „rukám“, které musí „probrat“ mnoho tahů a určit ten nejvhodnější za přispění svého „mozku“. 26
Části aplikace K implementaci rozhodovacího algoritmu za účelem procházení herního stromu byla zvolena metoda Alfa-Beta ořezávání, jejíž princip byl detailně popsán a vysvětlen v kapitole 4.3. Finální implementace algoritmu je součástí třídy Thinking. Třída Thinking obsahuje veřejnou metodu findBestMove(), jejímž úkolem je vrátit co nejlepší tah pro aktuálně hrajícího hráče na dané pozici pro nastavenou úroveň hloubky prohledávání. Pro Alfa-Beta ořezávání byla použita delší varianta zápisu (viz kap. 4.1.3), která obsahuje
samostatné
privátní
metody
pro
maximalizaci
(bestMoveWhite())
a minimalizaci (bestMoveBlack()). Metoda findBestMove vždy podle aktuálního hráče na tahu jednu z těchto privátních metod volá. Použití delší varianty zápisu nemá na rychlost prohledávání žádný vliv, přesto oproti kratšímu zápisu má Alfa-Beta prořezávání v takové formě bezesporu nevýhodu v redundanci některých částí kódu (viz srovnání Negamax algoritmu a Minimaxové metody v kapitole 4.2). Zvolená delší varianta se přesto vyplatila, protože byla snazší na odladění. Metody bestMoveWhite() a bestMoveBlack() slouží k prohledávání pouze na úrovni kořene. Vybírají nejlepší tah podle ohodnocení získaného rekurzivním voláním metod pro prohledávání nižších úrovní stromu (whitesBranch() a blacksBranch()). Jedná se o rychlostní optimalizaci. Pro pozice nižší úrovně není potřeba sledovat jejich nejlepší tah, stačí pouze udržovat informace o ohodnocení pozice. Specializací metod dojde k ušetření další podmínky včetně několikerého čtení a zápisu do paměti. Obě metody jsou na nižších úrovních volány mnohokrát (řádově statisíce), proto taková optimalizace jistě své opodstatnění má. Metoda Alfa-Beta ořezávání je dobrým základem pro další vylepšování a zrychlování hledání nejlepšího tahu pro danou pozici. K dalšímu urychlení implementovaného Alfa-Beta ořezávání byly použity metody historické heuristiky a metody hledání klidu.
7.1.3.1. Historická heuristika V kapitole 5.1.3 byla probrána základní myšlenka a návrh realizace historické heuristiky. Zbývá vysvětlit, jakým způsobem je v mé implementaci navržena struktura tabulky historie a prováděné operace nad ní.
27
Části aplikace
Datová struktura tabulky historie Jak vkládání tahů způsobující ořezávání do tabulky, tak i řazení tahů, které se uskutečňuje před prováděním jednotlivých tahů v rozhodovacím algoritmu, by mělo být co možná nejrychlejší. Tomuto účelu je přizpůsobena i základní datová struktura, kterou historická heuristika používá. Jedná se o dvourozměrné pole mapující tah a váhu, která je tahu přiřazena. První index pole definuje počáteční pozici popisu tahu (posun kamene „od“), druhý pak koncovou pozici tahu (posun kamene „do“). Operace vyhledání nebo úprava (hodnoty) váhy tahu jsou při použití obou indexů triviální a rychlé. Nevýhodou tohoto řešení je, že samotné hodnoty počáteční a koncové pozice tahu neudávají celý průběh tahu a tedy ani nemohou definovat přesně celý tah. Může potenciálně nastat situace, kdy kratší tah bude začínat a končit na stejných pozicích jako delší tah s meziskoky (např. 31–42 a 31–22–33–42) a tedy bude získávat kratší tah větší váhu neoprávněně (pokud bereme v úvahu, že kratší tah ořezávání nezpůsobil). Kdybychom tabulku tahů chtěli více zpřesnit a rozšířili bychom ji do další dimenze (další pole pro identifikaci tahu – meziskok), mělo by to za následek významné zvětšení paměťové náročnosti celé tabulky a zároveň by došlo ke zpomalení operací nad tabulkou historie (viz dále). Podobně jako u případu s délkou tahu, implementovaná tabulka historie nerozlišuje, kterým kamenem se táhlo (např. existují dva tahy s pozicemi 31–27, ovšem každý se provádí jiným kamenem). V nejhorším případě nastane možnost, že se pořadí prováděných tahů přehodí, resp. dojde k posunu od ideálního pořadí tahů, které by způsobilo více ořezávání během procházení herního stromu v rozhodovacím algoritmu. Naštěstí je pravděpodobnost výskytu popsané situace velice malá, ať jde o případ s omezenou délkou popisu tahu nebo tahu se shodným popisem provedeného různými kameny. Obecně se stále jedná pouze o pomocnou heuristiku a jako taková není přesná nikdy. Nemůže nastat horší situace, než kdyby historická heuristika nebyla použita vůbec. Její výhoda, zrychlení procházení dané hloubky při omezení počtu prohledávaných pozic, ovšem převládá. Vzhledem k popsaným důvodům, se chyba překrytí tahů zanedbává.
Operace nad tabulkou historie Pro
potřeby
HistoryTable,
rozhodovacího které
je
algoritmu
následně
je
nadefinováno
implementováno
variantou
obecné hry
rozhraní ve
HistoryTable50 a ve třídě GameStyle50 (viz kap. 7.2) je udržována její instance.
28
třídě
Části aplikace Třída HistoryTable50 implementuje čtyři metody, resp. operace nad tabulkou. •
newSearch() – je volána pokaždé, když začíná nové hledání, nad novým kořenem
v rozhodovacím
algoritmu
(metoda
findBestMove()
třídy
Thinking). Provádí se krácení hodnot vah tahů konstantou (hodnotou 2, viz kap. 5.1.3). •
cleanUp() – dojde k vyprázdnění tabulky historie. Váhy jednotlivých tahů jsou nastaveny na 0. Využívá se při začátku nové partie.
•
sortMoves() – provede se třídění seznamu vygenerovaných tahů podle hodnoty váhy jednotlivého tahu. Třídí se vždy od největších hodnot k nejmenším. Výsledek je použit v rozhodovacím algoritmu při postupném provádění tahů. K třídění je interně použita metoda sort() z třídy java.util.Collections, která využívá optimalizovaný algoritmus MergeSort.
•
addCutOffMove() – zvýší tahu, který způsobil ořezávání, váhu podle aktuální hloubky, v které se prohledávání v rozhodovacím algoritmu nachází. Využívá se doporučeného vzorce 2 h , kde h je aktuálně prohledávaná hloubka (viz kap. 5.1.3).
7.1.3.2. Hledání klidu Pro zlepšení kvality výběru tahů byla implementována technika hledání klidu (viz kap. 5.2). S použitím metody hledání klidu dochází, jak již bylo popsáno, k prohlubování taktických variant. Pro případ hry Dáma se jedná o pozice s přeskoky. Použití je jednoduché. Na pozici, pro které jsou vygenerovány pouze přeskoky, se neubírá hloubka, resp. dojde k prohledávání o další půltah. Další rekurzivní volání odvozené pozice v rozhodovacím algoritmu je tedy voláno se stejným parametrem hloubky.
7.2. Základní objektový model Snahou implementace bylo neomezit se na přesně definovaná pravidla jedné z variant hry Dáma, v tomto případě Mezinárodní dáma, ale ideálně umožnit přidání podpory i pro jiné varianty hry (viz kap. 2). Nezávislost použitého rozhodovacího algoritmu na generátoru tahů a ohodnocovací funkci (viz kap. 7.1) se pro to přímo vybízí. Konečné řešení návrhu objektového modelu v jazyce Java potenciálně umožňuje využít jeden rozhodovací algoritmus pro libovolné množství her Dáma hrajících podle různých, principiálně podobných, pravidel. Sada vytvořených rozhraní neslouží pouze pro 29
Části aplikace účely rozhodovacího algoritmu, ale jsou zároveň využívány v rámci celé aplikace – např. vykreslování herní desky, práci s daty během ukládání či otevírání partie atp. Základním cílem při návrhu bylo oddělit generátor tahů a ohodnocovací funkci
od
jejich
používání
v
aplikaci,
neboť
jsou
tyto
části
závislé
na konkrétních pravidlech varianty hry. Výhody zapouzdření jsou zřejmé. Každá z variant hry si může definovat datové struktury, konstanty a metody takové, které jsou pro ni optimální, přesto se vůči vnějším třídám jeví jako uniformní varianta Dámy. K tomuto účelu je naprogramována skupina rozhraní, které předepisují základní společné metody pro všechny varianty hry Dáma. Rozhraní pro popis varianty hry jsou součástí balíku net.damaq.gamestyle.interfaces. K zapouzdření základních datových struktur herní desky a tahu slouží rozhraní Board a Move. Definované rozhraní Board zahrnuje přístup k informacím o rozložení kamenů na herní desce. Součástí je i metoda ohodnocovací funkce (evaluation()), poněvadž se přímo váže k pozici, kterou Board představuje. Mezi další metody patří i generování a provádění tahů nad pozicí. Objekty odvozené od Board interně využívají vlastní generátor tahů, což je třída implementující rozhraní MoveGenerator. Podobně jako Board, Move umožňuje přístup k zapouzdřené datové struktuře tahu. Rozhraní GameStyle popisuje detaily týkající se varianty hry (informace nutné k uložení či načtení partie, test remízy apod.), obsahuje také metody, které vrací nové instance objektů implementujících rozhraní Board a Move dle specifických hodnot parametrů. Varianta Mezinárodní dámy využívá výše zmíněných rozhraní. Třídy implementující rozhraní jsou umístěny v balíku net.damaq.gamestyle.international. Názvy tříd jsou odvozeny od rozhraní, které implementují – tedy Board50, Move50 atd. Hodnota „50“ je jen čistě jmennou konvencí a symbolizuje počet hracích polí desky pro Mezinárodní dámu. V balíku jsou i další pomocné třídy, ke kterým nelze přistupovat mimo balík a slouží především k interním potřebám rozložení kódu (třídy Board50Consts, MoveGenConsts a další). Ke
správě
jednotlivých
variant
her
byla
naprogramována
třída
GameStyleFactory, která má za úkol vytvářet a udržovat optimálně instance tříd implementujících základní rozhraní GameStyle.
30
Části aplikace
Obr. 7 – UML diagram s návrhem základních tříd a rozhraní
Na Obr. 7 lze s využitím UML diagramu pozorovat celkové vzájemné propojení a závislost mezi některými rozhraními a třídami, které je implementují. Z obrázku je patrné, že třídy GameStyle50 ani Board50 neimplementují svá rozhraní přímo, ale jsou potomky abstraktních
tříd
AbstractGameStyle 31
a
AbstractBoard.
Abstraktní
třídy
Části aplikace AbstractGameStyle a AbstractBoard implementují některé ze základních metod např. hashcode() či equals() ale i dalších, které mohou být společné pro potomky implementující rozhraní varianty hry. Použitý objektový model se velice osvědčil. Nejenže umožňuje v budoucnu přidat podporu i pro další varianty hry Dáma, ale výrazně zpřehlednil výsledný programový kód a tím urychlil vývoj celé aplikace.
7.3. Formát PDN Pro možnost ukládání a pozdějšího opětovného načtení rozehrané partie bylo třeba zvolit vhodný formát uložení dat. Nejvhodnější volbou se ukázal být univerzální textový formát k výměně a archivaci her mezi různými programy realizující hru Dáma – formát PDN (Portable Draughts Notation). Tento datový formát navrhl Adrian Millett pro svůj program Sage 4000. PDN je odvozeno od známějšího PGN (Portable Game Notation) formátu pro šachové partie. PGN formát byl upraven pro možné použití hry Dáma s podporou různých pravidel této hry. PDN má několik výhod. Předně je to jistá rozšířenost tohoto formátu mezi ostatními pokročilými programy. Dále pak textový zápis umožňuje uživateli, aby si mohl sám snadno soubor přenášet, vytvářet, editovat či zobrazovat v textovém prohlížeči, když nemá možnost použít speciální, k tomu určenou, aplikaci. Struktura souboru PDN navíc dovoluje přenášet i více partií najednou. Nevýhodou se ukázal být velmi volně navržený popis tohoto formátu. Ačkoli je formát PGN definován relativně velmi formálně a přesně (viz [24]), specifikace, tak jak ji popsal Millett, definuje PDN jen ve velmi hrubých obrysech a není formální vůbec. Zejména nedefinuje, které sekce (viz dále) jsou povinné a které nikoliv, popř. jaké výchozí hodnoty mají být použity. PGN pro šachy definuje 7 základních povinných sekcí. Uvedené příklady v návrhu PDN však některé ani neobsahovaly. Toto vedlo k tomu, že různí autoři různých dámových programů si vyložili některé nepřesně definované části zápisu PDN dle svého uvážení nebo si přidávali své vlastní sekce a tím zhoršili možnou přenositelnost. Problém přenositelnosti a problematičnosti vytváření podpory PDN si již někteří lidé uvědomovali a tak byla navržena v roce 2003 oficiální formální specifikace formátu PDN verze 2.0 [22] (v současné době je dokument specifikace označen jako draft 0.1), která se snaží odstranit zmíněné nedostatky a přidává popis i některých nových vlastností. Bohužel tato specifikace se příliš neujala. Na Internetu prakticky nelze najít aplikaci, která by ji plně 32
Části aplikace přijala. Důvody mohly být rozličné. Některé z význačných aplikací přestaly být vyvíjeny před tímto návrhem (např. Dam 2.2) nebo se lze domnívat, že autoři již nejspíše nepovažovali za potřebné tento upravený nový zápis podporovat. Nedokonalostí tohoto popisu je taktéž nulová podpora jiných pravidel zápisů Dámy (bere v úvahu jen číselné zápisy tahů a pozic). Nepříjemné může být také vyžadování znakového kódování ISO-8859-1 (známý též jako Latin1), které by omezovalo například češtinu v dokumentu. Za další pokus o formální specifikaci lze považovat článek na Wikipedii [23], který se snaží doplnit původní Milletův popis podrobněji. Oproti PDN v2.0 nepřidává žádné nové sekce či značky označující sílu tahu. Tato verze je, dle mého zjištění, určitým průřezem mezi tím, co by formát měl obsahovat a zároveň se snaží o zpětnou kompatibilitu. Přesto však ani tento popis nelze považovat za dokonalý. Obsahuje i některé odlišnosti, při jejichž použití by formát nebyl čitelný ve starších, přesto velmi rozšířených a používaných programech. Právě z podstaty současného psaní článků na Wikipedii vyplývá, že kdokoli notaci může změnit a tak se pravděpodobně stalo, že popis obsahuje například i definici jednořádkového komentáře „;”. Takovýto komentář není nikde jinde zmíněn (v žádných jiných výše zmíněných popisech) a prakticky všechny dosavadní existující programy by skončily při čtení souboru s chybovou hláškou. Z těchto důvodů jsem si musel uvedený popis na Wikipedii upravit. Cílem těchto drobných změn (zejména popis obsahu některých sekcí) bylo zavedení podpory pro konkurenční programy pro hru dáma Dragon, Turbo Dambase či Dam. Níže uvedený popis, který ve většině případů vychází ze zmíněného článku na Wikipedii a z části formální specifikace PDN v2.0, popisuje zvolenou variantu, která je potřebná pro sestavení gramatiky umožňující načtení a zpracování souboru.
7.3.1. Datová struktura formátu PDN Jak již bylo řečeno v předchozím odstavci, PDN je textový formát. Stavba formátu byla zvolena jako velice benevolentní z důvodu zachování zpětné kompatibility s jinými programy. Toto je například důvod pro bližší nespecifikování pevné volby kódovací stránky pro znaky. Za výchozí kódování se tak bere v úvahu lokální uživatelské nastavení operačního systému. V úvahu může přijít i programová implementace, která by mohla uživateli dovolit volbu kódové stránky načítaného souboru. Záznam partie se skládá ze 3 hlavních částí: 1) Hlavička – obsahuje sekce popisující deklaraci nové partie a nesoucí základní informaci o startovní pozici, místu a datu konání hry. 33
Části aplikace 2) Provedené tahy – seznam provedených tahů v rámci partie. 3) Ukončovací příznak – oddělovač indikující konec zápisu partie a možnost pokračování zápisu partie další. Podrobnější popis struktury těchto jednotlivých částí následuje v dalších odstavcích.
7.3.1.1. Hlavička – popis sekcí Definice sekce začíná znakem „[”, následuje název sekce, mezera a poté hodnota sekce, definovaná v uvozovkách. Definice je zakončena znakem „]”. Sekce jsou vzájemně odděleny některým alespoň jedním z tzv. bílých znaků (znak konce řádky, mezera, tabulátor a některé další). Názvy sekcí nerozlišují malá a velká písmena a nezáleží na jejich pořadí. Má implementace vyžaduje akceptaci osmi základních sekcí. Pro použití je aplikace schopná akceptovat i jiné názvy a obsahy sekcí než níže uvedené.
Základní sekce Event – název mistrovství nebo turnaje, kde se partie odehrála Site – místo konání události – obsah sekce není přesně dán. Doporučený formát pro
hodnotu této sekce je zápis „Město, region/stát, ZEMĚ“, kde ZEMĚ je 3znakový kód definovaný Mezinárodní olympijskou komisí IOC (International Olympic Committee), tedy například „Los Angeles, CA, USA“. Date – datum započetí hry. Formát data by měl odpovídat tvaru „RRRR.MM.DD“.
Doplnění otazníky „??“ je možné použít v případě neznámé hodnoty např. konkrétního dne konání. Neznámé datum hry pak bude vypadat jako „????.??.??“. Round – číslo kola White – popisuje hráče hrajícího za bílé. Doporučený formát je „Příjmení, Jméno“,
popř. pouze s iniciály křestního jména „Příjmení, J.“ Black – popisuje hráče hrajícího za černé. Hodnota je definována stejně jako
v předchozí sekci Gametype – definuje hrací variantu (pravidla) dámy – toto je nutné z důvodu např.
různě velkých herních desek pro hru Dámu. Struktura obsahu sekce vypadá takto: [GameType "Type-number [,Start-color (W/B),Board-width, Board-height, Notation [,Invert-flag]]"]
34
Části aplikace Type-number – číselná hodnota označující pravidla hry. Např. pro označení varianty Mezinárodní dáma platí hodnota 20. Konkrétní číslo pro daná pravidla lze najít v návrhu PDN [21]. Tato hodnota je v sekci GameType povinná Start-color – určuje, která ze stran je při počáteční hře na tahu. Možné hodnoty jsou W (White – bílá) nebo B (Black – černá) Board-width – šířka herní desky, resp. šachovnice (počet sloupců) na které se hraje Board-height – výška herní desky, resp. šachovnice (počet řádek) na které se hraje Notation – rozlišení notace zápisu polohy polí resp. tahů na herní desce. Hodnota se skládá ze 2 částí. Způsob zápisu: •
A – alfanumerický zápis,
•
N – numerický zápis,
•
S – krátký šachový zápis SAN (Standard Algebraic Notation).
Hodnota pozice určující polohu čtverce A1 nebo 1 na herní desce pro stranu začínající hru: •
0 – vlevo dole,
•
1 – vpravo dole,
•
2 – vlevo nahoře,
•
3 – vpravo nahoře.
Invert-flag – vyjadřuje „odstín barvy“ čtverců na kterých se hraje. Možné hodnoty jsou: •
0 – hraje se na tmavých polích,
•
1 – hraje se na bílých polích.
Například použití GameType pro Mezinárodní dámu může vypadat takto:
35
Části aplikace [GameType "20"]
{krátký způsob zápisu}
[GameType "20,W,10,10,N2,0"]
{dlouhý způsob zápisu}
Result – sekce označuje výsledek partie. Možné hodnoty jsou:
•
1-0 – vyhrávají bílé,
•
0-1 – vyhrávají černé,
•
1/2-1/2 – remíza,
•
* – hra nebyla ukončena.
Další volitelné sekce FEN – Tato sekce by se měla vyskytovat v hlavičce v případě, že hra nezačala
z počátečního postavení kamenů pro daná pravidla dámy. Hodnota určuje rozestavení kamenů, od kterého se začíná. Struktura zápisu sekce FEN vypadá takto: [FEN "[Turn]:[Color1][[K][Square-number][,]...]:[Color2][[K][Squarenumber][,]... [.]] "]
Turn – určuje, která ze stran je aktuálně na tahu – možné hodnoty jsou W (White – bílá) nebo B (Black – černá) Color1, Color2 – nastavuje, pro kterou stranu jsou následně generovány popisy pozic kamenů. Možné hodnoty jsou W (White – bílá) nebo B (Black – černá). K – nepovinná část před Square-Number – je-li „K“ uvedeno, tak to určuje, že na dané pozici se vyskytuje dáma, jinak se jedná o obyčejný kámen. Square-number – stanovuje pozici, na které je umístěn kámen. V případě numerického zápisu definovaného v GameType je tato hodnota vymezena hodnotami <1, počet hracích polí>. Celkový počet hracích polí je dán pravidly, resp. herní deskou, na které se hraje. Definuje-li GameType alfanumerický zápis hodnoty pozic, tak pozice začínají na souřadnicích a1 (sloupec, řádek). Konkrétní vymezení rozsahu souřadnic je opět dáno pravidly hry. Případný popis této notace lze najít ve specifikaci PGN [24]. Příklady použití FEN:
36
Části aplikace [FEN "B:W18,24,27,28,K10,K15:B12,16,20,K22,K25,K29."] [FEN "B:W18,19,21,23,24,26,29,30,31,32:B1,2,3,4,6,7,9,10,11,12."] [FEN "W:Wa1,Kb3:Bc7,a6."]
Je nutno upozornit na poslední znak v obsahu sekce FEN a tedy tečku, ukončující zápis pozic. Tento prakticky zbytečný znak se v zápisu objevuje i v původním návrhu PDN a mnohé programy tuto skutečnost přijaly za vlastní. Bez tohoto znaku odmítnou FEN zpracovat. Spolu s definicí této sekce bývá ve starších programech definována i sekce SetUp, která určovala hodnotou „1“ či „0“, zda se má sekce FEN použít (hodnota 1) či nikoliv (hodnota 0). Specifikace PDN v2.0 tuto sekci vcelku rozumně vypouští (nač definovat FEN, když nebude později použit).
7.3.1.2. Provedené tahy Tato volitelná část zápisu partie definuje seznam dosud provedených tahů obou hráčů. Struktura zápisu tahu je následující: Zápis začíná číslem pořadí dvojice půltahů (tedy tahu). Číslování je prováděno inkrementačně od 1. Číslo je zakončeno tečkou. Následují 2 půltahy – bílého a černého (v tomto pořadí) oddělené bílým znakem nebo komentářem. Přirozeně, pokud černý netáhl jako odpověď na bílého v posledním tahu, tak jeho půltah není na konci výpisu uveden. Speciálním stavem je, pokud hru začíná černý. V tomto případě je půltah bílého nahrazen znaky „...”. Popis půltahu má tuto formu: •
jednoduchý tah – Start-field Separator End-Field,
•
zkrácený nebo jednoduchý skok – Start-field Separator End-field,
•
složený skok – Start-field [Separator Field]…Separator Endfield.
Start-field označuje počáteční a End-Field koncovou pozici tahu na herní desce. Pro jednoduché tahy je znak Separator „-“ a pro skoky je to znak „x“. Field pro složené skoky určuje meziskoková pole. Jednotlivé části mohou být odděleny bílým znakem. Příklady půltahů: •
jednoduchý tah – 3–17 popř. f1–c4,
37
Části aplikace •
zkrácený nebo jednoduchý skok – 9x22 popř. f1xc4,
•
složený skok – 43x23x12 popř. h7xf5xd3.
Konkrétní způsob zápisu pole na herní desce je dáno specifikací v sekci GameType.
7.3.1.3. Ukončovací příznak Tato sekvence znaků následuje bezprostředně za seznamem provedených tahů a slouží jako identifikátor konce zápisu partie. Hodnota tohoto oddělovače je stejná jako hodnota v sekci Result pro daný zápis partie. Není-li ukončovací příznak shodný s hodnotou sekce Result, parser označuje tento stav jako chybu.
7.3.1.4. Komentáře Komentář začíná znakem „{”. Následuje obsah komentáře. Komentář se bere jako neukončený dokud znakem obsahu není znak „}”. Komentáře mohou být umístěny kdekoliv mezi hlavními částmi partie, sekcemi nebo zápisem jednotlivých (půl)tahů. Není dovoleno vkládat komentář uprostřed (v těle) zápisu (půl)tahu.
7.3.2. Příklady zápisu partie Následující příklad PDN souboru názorně demonstruje celkové použití PDN.
38
Části aplikace [Event "Golden Prague"] [Site "Prague"] [Date "2001.07.01"] [Round "1"] [GameType "20"] {Mezinárodní dáma} [White "Hoogteijling, Peter"] [Black "Malis, Petr"] [Result "1-0"] 1. 34-29 19-23 2. 40-34 14-19 3. 45-40 10-14 4. 32-28 23x32 5. 37x28 1823 6. 29x18 12x32 7. 38x27 7-12 8. 42-38 12-18 9. 41-37 1-7 10. 46-41 7-12 11. 37-32 17-21 12. 41-37 19-23 13. 50-45 5-10 14. 47-42 21-26 15. 34-29 23x34 16. 39x30 20-24 17. 30x19 14x23 18. 40-34 10-14 19. 44-39 15-20 20. 49-44 14-19 21. 34-29 23x34 22. 39x30 18-23 23. 44-39 12-18 24. 39-34 8-12 25. 33-29 1117 26. 27-21 16x27 27. 31x11 6x17 28. 43-39 20-25 29. 32-27 3-8 30. 30-24 19x30 31. 35x24 17-22 32. 37-31 26x37 33. 42x31{!} 13-19 34. 24x13 8x19 35. 48-43 9-14 36. 31-26 22x31 37. 26x37 14-20 38. 39-33 19-24 39. 38-32 24-30 40. 43-39 12-17 41. 45-40 2-8 42. 37-31 30-35 43. 31-27 35x44 44. 39x50 4-9 45. 50-44 9-13 46. 33-28 13-19 47. 44-39 8-12 48. 27-22 18x38 49. 29x7 38-42 50. 7-2 19-23 51. 28x19 1-0 [Event "Mistrovství ČR-finále A"] [Site "Praha"] [Date "2001.11.??"] [Round "1"] [GameType "29"] {Česká dáma} [White "Sysel, J."] [Black "Bolban, M."] [Result "1-0"] 1. a3-d4 {zajímavý tah} d6-c5{zajímavá reakce}2. g3-f4 e7-d6 3. f2-g3 f6-g5 4. b2-c3 b6-a5 5. d4xb6 a7xc5 6. g3-h4 f8-e7 7. h4xf6 e7xg5 8. c3d4 c7-b6 9. d4-e5 g7-f6 10. e5xc7 {a nyní útok} b8xd6 {protitah} 11. d2c3 g5-h4 12. c1-b2 h8-g7 13. c3-b4 a5xc3 14. b2xd4 f6-g5 15. d4-e5 b6-a5 16. e5xc7 d8xb6 17. a1-b2 a5-b4 18. f4-e5 g5-f4 19. e3xg5 h6xf4 20. e1f2 h4-g3 21. f2xh4 b4-c3 22. b2xd4 c5xe3 23. h4-g5 g7-h6 24. g5-f6 e3-d2 25. f6-e7 d2-e1 26. e7-d8 e1-a5 27. d8-g5 f4-g3 28. h2xf4 a5-c3 29. g5d8 c3xh8 30. d8xa5 h8-d4 31. a5-e1 d4-f6 32. g1-h2 f6-d4 33. a3-b4 d4-f6 34. f4-g5 1-0 [Event "Test Demo"] [Site "Praha, CZE"] [White "Damaq 0.86"] [Black "Damaq 0.86"] [Round "1"] [Date "2006.05.17"] [GameType "20"] [SetUp "1"] [FEN "B:W30,31,32,33,35,k37,38,39:B1,2,3,4,5,6,7,8,9,10,11,12,k13,14,15,24."] [Result "*"] 1. ... 13x36 2. 30x19 *
39
Části aplikace Další příklady coby historii mnoha zahraných partií při různých turnajích je možné nalézt na Internetu (například na [3]). Je však potřeba upozornit, že ne všechny záznamy je možné v naprogramované implementaci přečíst (otevírání souboru skončí s chybou) a to z důvodu
porušení
kompatibility
popsaného
formátu
od
autorů
(resp.
aplikací)
zaznamenávajících partie.
7.3.3. Analýza PDN pro čtení ze souboru Analýza souboru PDN je založena na lexikálním a syntaktickém analyzátoru, vytvoření vnitřní reprezentace, kontrole její správnosti. Prvním krokem návrhu analyzátoru je identifikace lexikálních elementů v PDN a sestavení gramatiky odpovídající struktuře formátu.
7.3.3.1. Gramatika PDN Strukturu vstupního souboru lze popsat pomocí následující jednoduché bezkontextové gramatiky se startovním symbolem PDNDocument. 1) PDNDocument → Game PDNDocument 2) PDNDocument → ε 3) Game → Sections Moves End 4) Sections → left_bracket ident value right_bracket Comment NextSection 5) NextSection → Sections 6) NextSection → ε 7) Moves → Move Moves 8) Moves → ε 9) Move → numberWithDot WhiteMove BlackMove 10) WhiteMove → dots Comment 11) WhiteMove → Position MovePart 12) BlackMove → Position MovePart 13) BlackMove → ε 14) MovePart → dash Position Comment 15) MovePart → jump Position Jumps Comment 40
Části aplikace 16) Jumps → jump Position Jumps 17) Jumps → ε 18) Position → number 19) Position → coords 20) Comment → comment Comment 21) Comment → ε 22) End → draw 23) End → white_wins 24) End → black_wins 25) End → undecided
Gramatika bere v úvahu jak numerické zápisy tahů tak i zápis pomocí souřadnic, nebere však v úvahu zápis SAN (viz kap. 7.3.1). Možnost zápisu SAN nepodporuje a je omezením PDN gramatiky. Použití SAN notace zápisu je v dámových hrách prakticky nulové a je jen v podstatě doménou šachu. Podporu pro SAN lze brát jako významnou až pro případné nové programy (hry). Součástí PDN gramatiky také není podpora validace obsahu sekcí. Tato část úkolu je přenesena do sémantické analýzy.
7.3.3.2. Lexikální analýza Lexikální analyzátor čte prostřednictvím vstupního systému posloupnost znaků tvořící zdrojový program a transformuje ji na posloupnost lexikálních symbolů, které jsou terminálními symboly pro syntaktickou analýzu. Některé terminální symboly v gramatice mají odpovídající reprezentaci ve formátu PDN. Význam terminálních symbolů je uveden v následující tabulce (Tab. 1).
41
Části aplikace Terminální symbol left_bracket right_bracket ident value comment dash dots numberWithDot coords number jump white_wins black_wins draw undecided
Reprezentace ve formátu PDN [ ] identifikátor(název sekce) – řetězec začínající písmenem hodnota obsahu sekce hodnota komentáře ... číslo následováno tečkou souřadnice číslo x 1-0 0-1 1/2-1/2 *
Tab. 1 – Reprezentace terminálních symbolů gramatiky ve formátu PDN
Lexikální analyzátor lze založit na konečném automatu. Návrh automatu zde uveden není. Jeho struktura je velmi jednoduchá a prakticky shodná pro jakoukoli bezkontextovou gramatiku resp. lexikální symboly.
7.3.3.3. Syntaktická analýza Pro sestrojení syntaktického analyzátoru je nejprve nutné zjistit, o jaký typ bezkontextové gramatiky se jedná. Proto ověříme, zda gramatika obsahuje konflikty FIRSTFIRST nebo FIRST-FOLLOW.
42
Části aplikace
1 2 3 4 5
Pravidlo PDNDocument → Game PDNDocument PDNDocument → ε Game → Sections Moves End Sections → left_bracket ident value right_bracket Comment NextSection NextSection → Sections
6 NextSection → ε
FIRST left_bracket
ε
ε left_bracket left_bracket left_bracket ε
7 Moves → Move Moves 8 Moves → ε Move → numberWithDot WhiteMove 9 BlackMove 10 WhiteMove → dots Comment 11 WhiteMove → Position MovePart 12 BlackMove → Position MovePart
numberWithDot ε
13 BlackMove → ε
ε
14 MovePart → dash Position Comment MovePart → jump Position Jumps 15 Comment 16 Jumps → jump Position Jumps
dash
jump
17 Jumps → ε
ε
18 Position → number 19 Position → coords 20 Comment → comment Comment
number coords comment
21 Comment → ε
ε
22 23 24 25
draw white_wins black_win undecided
End → draw End → white_wins End → black_win End → undecided
FOLLOW
draw, white_wins, black_wins, undecided, numberWithDot draw, white_wins, black_wins, undecided
numberWithDot dots number, coords number, coords
draw, white_wins, black_wins, undecided, numberWithDot
jump comment, draw, white_wins, black_wins, undecided, number, coords, numberWithDot
draw, white_wins, black_wins, undecided, left_bracket, number, coords, numberWithDot
Tab. 2 – Výpočet množin FIRST a FOLLOW pro PDN gramatiku
Z tabulky Tab. 2 je patrné, že gramatika neobsahuje žádné konflikty FIRST-FIRST ani FIRST-FOLLOW a jedná se tedy o jednoduchou LL(1) gramatiku. Analýzu je tedy možné provést metodou rekurzivního sestupu pomocí následující rozkladové tabulky (v tabulce Tab. 3 jsou uvedena čísla pravidel, podle kterých se provádí expanze).
43
PDNDocument Game Sections NextSection Moves Move WhiteMove BlackMove MovePart Jumps Position Comment End
6 8
6 8
6 8
13
13
6 8
13 14
17
17
17
17
21 22
21 23
21 24
21 25
15 16
11 12
11 12
17 18 21
17 19 21
ε
numberWD
comment
left_bracket
coords
1 3 4 5
10 13
number
jump
dash
dots
undecided
black_wins
white_wins
draw
Části aplikace
2
6 7 9 13
21
17
17
20
21
Tab. 3 – Tabulka rozkladu pro PDN gramatiku
Na základě těchto informací již lze bez problému naprogramovat jak lexikální tak syntaktický analyzátor.
7.3.4. Programová realizace PDN Vlastní realizaci podpory čtení formátu PDN je věnován prakticky celý balík net.damaq.pdn aplikace. Obsah se skládá z několika logických součástí, které přibližně odpovídají jednotlivým krokům konverze textového souboru do objektové hierarchie. V průběhu implementace bylo počítáno i s možností dalšího samostatného využití kódu pro podporu formátu PDN. Z toho důvodu je kód napsán tak, aby bylo možné jej s minimem úprav převést na samostatnou knihovnu tříd (takovou knihovnu je pak možné volně distribuovat na Internetu a kdokoli ji může využít i v jiných programech k přidání podpory čtení formátu PDN).
7.3.4.1. Lexikální analýza Prvním krokem převodu je lexikální analýza. Lexikální analyzátor je založen na konečném automatu, který již byl zmíněn v části o analýze problému (viz kap. 7.3.3). Tento analyzátor je implementován ve třídě PDNLexAn a vrací pro syntaktický analyzátor jeden z lexikálních symbolů definovaných výčtovým typem LexSymbol.
44
Části aplikace Pro optimální načítání dat ze souboru je použita třída java.util.Scanner, která při vstupně výstupních operacích pracuje s vyrovnávací pamětí. Dále pro potřeby lexikálního analyzátoru je simulována metoda readCharacter() načítající (vracející) jeden znak ze vstupního proudu. V případě, že analyzátor zjistí lexikální chybu ve vstupním souboru, generuje výjimku LexException, která je zachycena a zpracována vyšší vrstvou aplikace. V případě výskytu chyby je možné získat doplňující informace o pozici v souboru, na které chyba nastala.
7.3.4.2. Syntaktická analýza Druhou vrstvou načítací části aplikace tvoří syntaktický analyzátor. Analyzátor pracuje na základě metody rekurzivního sestupu, k čemuž používá LL(1) gramatiku a rozkladovou tabulku uvedenou v kapitole zabývající se analýzou PDN (viz kap. 7.3.3). K reprezentaci jednotlivých partií slouží objekty třídy PDNGame. Třída PDNGame obsahuje všechny potřebné vlastnosti a metody pro plnohodnotnou reprezentaci partie v paměti počítače. Analogicky k formátu PDN využívá seznamu tříd PDNMove a všech potomků třídy PDNSection. Podobně jako lexikální analyzátor i analyzátor syntaktický generuje výjimku v případě, že dojde při zpracování vstupních dat k logické chybě, v tomto případě SyntException. Syntaktický analyzátor odhalí špatně strukturovaný vstupní soubor. Neumožní však odhalit chyby vzniklé z důvodu neplatného obsahu sekcí – toto je součástí sémantické analýzy.
7.3.4.3. Sémantická analýza Sémantická analýza tvoří třetí vrstvu podpory načítání PDN a jejím úkolem je odhalit chyby v logice provedených tahů a obsahu sekcí (zejména sekcí FEN a Result, viz kap. 7.3.1). Poněvadž gramatika přímo nepodporuje validaci sekcí, je toto zajištěno testem pomocí relativně jednoduchého regulárního výrazu v každém objektu reprezentujícím povinně definovanou sekci. Příkladem může být regulární výraz pro hodnotu sekce GameType (popis struktury obsahu viz 7.3.1), která je reprezentována třídou PDNGameType: ^[0-9]?[0-9](,(B|W),[0-9]?[0-9],[0-9]?[0-9],(A|N|S)(0|1|2|3),(0|1))?$
Veškeré chyby vzniklé selháním validace hodnot sekcí regulárním výrazem jsou interně signalizovány výjimkou InvalidStructureFormatException a informace o chybě je předána uživateli přes uživatelské rozhraní. 45
Části aplikace Další ověřovanou částí je podpora načtené partie z hlediska aktuální podpory různých variant v Dámě. Implementace třídy GameStyleFactory obsahuje metody (konkrétně getSupportedGameStyle()) pro ověření, zda je daná varianta partie akceptovatelná pro použití v aplikaci. Ačkoli je partie formálně korektně načtena, nepodporovanou variantu Dámy není možné v aplikaci otevřít. Kontrola existence podpory varianty a správnosti posloupnosti provedených tahů se provádí až po konkrétním zvolení partie uživatelem (v přehledu načtených partií ze souboru, viz 7.3.4.4), aby tak toto nezpomalovalo celkové načítání všech partií ze souboru.
7.3.4.4. Uživatelské rozhraní – načtené partie z PDN souboru Poslední vrstvou při načítání tvoří dialog, na kterém jsou zobrazeny načtené partie ze zvoleného PDN souboru pro uživatele (viz Obr. 17 přílohy). V dialogu si uživatel může zvolit libovolnou partii k přehrání.
46
Úroveň umělé inteligence
Část IV – Testování umělé inteligence 8. Úroveň umělé inteligence 8.1. Obtížnost hry Obtížnost hry je logicky odvozena od nastavení hloubky (resp. počtu půltahů) prohledávání v rozhodovacím algoritmu (viz kap. 7.1.3). Čím hlouběji dojde k prohledání a ohodnocení možných odvozených pozic z výchozí pozice, tím přesněji je počítač schopen „naplánovat“ obranu nebo útok při hře s lidským protihráčem. Čas nutný k výběru tahu během hry závisí na dvou hlavních faktorech. Hloubce prohledávání a pozicích, které jsou prohledávány. Rozestavení a typ kamenů na pozici přímo určuje šířku prohledávaného stromu. V mé implementaci byly naprogramovány celkem čtyři možné úrovně obtížnosti, kde každá má přiřazenu jinou hloubku pro prohledávání: •
začátečník – úroveň hloubky prohledávání 1,
•
pokročilý – úroveň hloubky prohledávání 5,
•
mistr – úroveň hloubky prohledávání 6,
•
velmistr – úroveň hloubky prohledávání 7.
Nastavení hloubky prohledávání je odstupňováno podle odhadované obtížnosti. Hloubka prohledávání podle nastavení však nemusí být konečná z důvodu použití techniky hledání klidu (viz kap. 5.2). Technika hledání klidu potenciálně může zvýšit hloubku prohledávání a tím prodlouží i dobu samotného hledání nejvhodnějšího tahu počítače pro danou pozici.
8.2. Porovnání algoritmů prohledávání herního stromu Pro ověření správnosti implementace metod prohledávání herního stromu byly zvoleny dvě metody měření. Měření počtu prohledávaných pozic (Tab. 4) a měření času vykonávání testované metody (Tab. 5). Měření byla provedena pro dvě různá rozmístění kamenů na herní desce, pro základní rozestavení hry a náhodně zvolené rozestavení hry, a to z důvodu lepší analýzy a interpretace naměřených hodnot. Postupně proběhla měření pro 47
Úroveň umělé inteligence všechny metody na čtyřech úrovní obtížnosti hry (viz výše kap. 8.1). Technika hledání klidu nebyla použita z důvodu zachování konstantní hloubky prohledávání (viz kap. 5.2). Všechna měření byla prováděna na počítači s procesorem PIII Celeron 1Ghz, 512MB paměti a Java Runtime Environment verze 1.5. Naměřené hodnoty jsou uvedeny v následujících tabulkách a pro snadnější srovnání jsou pod sebou uvedené hodnoty pro obě rozestavení hry: Metoda prohledávání [počet pozic] Minimaxová metoda Alfa-Beta metoda Alfa-Beta metoda + statické třídění Alfa-Beta metoda + historická heuristika
Hloubka prohledávání 1 9 2 9 2 9 2 9 2
5 32 130 10 673 10 196 4 226 8 391 3 751 6 959 2 407
6 199 270 87 874 50 586 49 766 27 721 26 322 22 336 21 545
7 1 248 712 758 514 269 839 201 149 208 135 167 205 176 791 84 807
Tab. 4 – Počet prohledávaných pozic herního stromu s danou hloubkou a metodou
Z tabulky počtu prohledávaných pozic herního stromu je patrné, že závislost počtu prohledávaných pozic na hloubce prohledávaní je exponenciální. Výjimkou je hloubka prohledávání 1, kde se počty prohledávaných pozic neliší, protože se zde neuplatní výhody metod vylepšujících Minimaxovou metodu. Porovnáme-li počet pozic pro jednotlivé implementace procházení herních stromů, zjistíme, že pro kteroukoliv hloubku prohledávání počet prohledávaných pozic klesá. Předpoklad zmenšení počtu prohledávaných pozic je tedy ověřen. Metoda prohledávání [ms] Minimaxová metoda Alfa-Beta metoda Alfa-Beta metoda + statické třídění Alfa-Beta metoda + historická heuristika
Hloubka prohledávání 1 10 10 10 10 25 25 10 10
5 160 80 130 60 170 80 100 50
6 1 300 371 270 200 350 240 170 170
Tab. 5 – Čas potřebný k prohledání herního stromu s danou hloubkou a metodou
48
7 5 500 2 670 1 300 1 000 1 650 1 320 1 282 680
Úroveň umělé inteligence Data v tabulce naměřených hodnot času potřebných k prohledávání herního stromu (Tab. 5) vykazují stejné závislosti jako je tomu u tabulky počtu prohledávaných pozic. Čas pro prohledání pozic roste s hloubkou prohledávání exponenciálně. Porovnáme-li hodnoty naměřených časů mezi jednotlivými metodami, zjistíme, že doba potřebná k prohledávání herního stromu klesá. Výjimkou jsou data času potřebného k prohledávání stromu naměřená pro metodu Alfa-Beta se statickým tříděním tahů, kde je z naměřených dat patrné, že je tato metoda pomalejší než původní metoda Alfa-Beta samotná. Je to dáno tím, že časová ztráta způsobená prováděním jednotlivých tahů s následným ohodnocením pozic před tříděním je větší než doba ušetřená při procházení menšího počtu pozic. Důvod časové ztráty u této metody může být dán neoptimálními paměťovými operacemi provádění tahu. Výsledkem analýzy naměřených dat je, že ze všech testovaných implementovaných metod, je pro prohledávání herního stromu nejvhodnější použití algoritmu Alfa-Beta společně s historickou heuristikou.
8.3. Zkušenosti hráčů ze hry K ověření obtížnosti hry a úrovně umělé inteligence bylo vyzváno několik hráčů (uživatelů) k otestování aplikace. Hráči byli vybráni na základě jejich zkušeností s hrou Dáma tak, aby skupina uživatelů obsahovala hráče s nejmenšími (žádnými) zkušenostmi až po hráče s velkými zkušenostmi (účastníka turnajů). Hráči dostali instrukci sehrát pět partií na obtížnosti dle svého uvážení. Následující tabulka (Tab. 6) shrnuje výsledky hry Dáma mezi hráčem a počítačem na různých stupních obtížnosti. Uživatel Hráč 1 Hráč 2 Hráč 3 Hráč 4 Hráč 5
Úroveň zkušeností žádné malé malé velké účastník turnajů
Začátečník 2/2 1/1 1/1
Úroveň obtížnosti ve hře Pokročilý Mistr 0/3 2/4 3/3 0/1 3/3 1/2 1/1
Velmistr
4/4
Tab. 6 – Odehrané partie hráčů testujících aplikaci
V tabulce jsou uvedeny hodnoty počtu vyhraných partií ku počtu odehraných partií pro danou úroveň obtížnosti. Na základě sebraných dat byla provedena analýza. Z tabulky lze vyvodit tyto závěry:
49
Úroveň umělé inteligence •
nastavení nejnižší úrovně obtížnosti (začátečník) splnilo svůj účel – úroveň není náročná ani pro hráče bez zkušeností, hra ho neodradí od dalšího hraní,
•
se základními zkušenostmi (úroveň zkušeností malé) je možné partii vyhrát bez větších potíží na úroveň pokročilý, což by odpovídalo předpokladu, že hráč, jenž hru Dáma někdy hrál, je schopen na tuto úroveň umělou inteligenci počítače porazit,
•
hráč s velkými zkušenostmi (úroveň zkušeností velké) poráží umělou inteligenci počítače na vyšší úrovně obtížnosti, což by odpovídalo amatérskému hráči s profesionální úrovní hry,
•
při určité úrovni zkušeností (účastník turnajů) je možné umělou inteligenci počítače vždy bez problému porazit.
50
Zhodnocení
Část V – Závěr 9. Zhodnocení Cílem této bakalářské práce bylo vytvořit aplikaci s umělou inteligencí počítače pro hraní deskové hry Dáma, což se podařilo beze zbytku splnit. Algoritmus pro umělou inteligenci obsahuje jak funkční implementaci metody ořezávání herního stromu, tak i další heuristiky na ohodnocení pozice. Podstatná část práce byla věnována návrhu algoritmu pro procházení pozic a jejich ohodnocování. Jako první metoda procházení pozic herního stromu byla implementována Minimaxová metoda, která je základní a nejjednodušší metodou výběru nejvhodnějšího tahu počítače pro danou pozici. Aplikace byla po této implementační fázi testována a dle očekávání nebyla rychlost vyhodnocování tahů vzhledem k velkému množství procházených pozic dostatečná. Došlo proto k úpravě Minimaxové metody na metodu Alfa-Beta a výsledná varianta aplikace byla opět podrobena dalším testům. Díky principům Alfa-Beta metody došlo k omezení počtu prohledávaných pozic stromu a tím k celkovému zrychlení hledání nejvhodnějšího tahu. Dalšího zrychlení Alfa-Beta metody bylo dosaženo použitím heuristiky. Z dvojice – statické třídění a historická heuristika – byla zvolena historická heuristika, která se významně osvědčila. Pro výslednou variantu funkce hodnotící jednotlivé tahy byla použita heuristika materiálního a pozičního ohodnocování. Na základě testování bylo zjištěno, že umělou inteligenci na středních úrovní obtížnosti není snadné porazit, zejména pro méně zkušené hráče. Nejobtížnější úroveň hry poráží pouze velmi zkušený hráč. Nedílnou součástí aplikace je i podpora formátu PDN, jehož popisu se tato práce věnuje jako jedna z prvních. Formát PDN umožňuje jednoduchý záznam nebo načtení partie Dámy, popř. výměnu záznamu partie s ostatními aplikacemi hry Dáma podporující kompatibilní verzi formátu. Výsledná aplikace byla hodnocena uživateli, kteří ji shledali kvalitní nejen co do funkcí a volitelné obtížnosti hry, ale i díky volitelným vzhledům také po stránce vizuální.
51
Náměty pro budoucí práci
10. Náměty pro budoucí práci Oblast umělé inteligence má málokdy jednoznačná nejlepší řešení a je možné ji neustále sledovat a promítat výsledky výzkumů i do praktických aplikací. Souběžně s pokroky v teoretické oblasti stoupá i výkon počítačů, dochází k rozvoji mobilních zařízení a jejich vzájemnému propojení některou z komunikačních sítí. Pro budoucí vylepšení programu vytvořeného v rámci této bakalářské práce je možné navrhnout následující: •
využití dalších technik zrychlování Alfa-Beta ořezávání (např. transpoziční tabulky, iterativní prohlubování) a tedy zlepšení úrovně umělé inteligence počítače při hře,
•
možnost hry po síti,
•
podpora dalších variant pravidel hry Dáma (Česká dáma, Španělská dáma aj.),
•
podpora integrované databáze pro archivaci zahraných partií,
•
podpora výukového módu, který by sloužil k výuce hraní Dámy pro začátečníky,
•
zlepšení celkového uživatelského komfortu přidáním různých volitelných nastavení uživatelského rozhraní.
Lze uvažovat i o využití snadné přenositelnosti kódu jazyka Java a provést tak portaci aplikace na mobilní zařízení.
52
Literatura
Literatura [1]
D. Steinwender, F. Friedel: Šachy na PC. 1995. Přel. Z. Petruželka. 1. vyd. Unis Publishing, Brno 1996
[2]
J. Schaeffer: The History Heuristic and Alpha-Beta Search
Enhancements in Practice. in: IEEE Transactions on Pattern Analysis and Machine Intelligence 11, 11, 1989
Internetové odkazy [3]
Česká federace dámy http://www.damweb.cz
[4]
Programming a Computer for Playing Chess http://tinyurl.com/jtyzr
[5]
Game theory http://en.wikipedia.org/wiki/Game_theory
[6]
Game tree http://en.wikipedia.org/wiki/Game_tree
[7]
Extensive form game http://en.wikipedia.org/wiki/Extensive_form_game
[8]
The number of possible positions in international draughts http://www.xs4all.nl/~mdgsoft/draughts/countpiece.html
[9]
Game Tree Searching and pruning http://www.cs.unm.edu/~aaron/downloads/qian_search.pdf
[10]
Programming topics – The main transposition table http://www.seanet.com/~brucemo/topics/hashing.htm
[11]
Hash table http://en.wikipedia.org/wiki/Hash_tables
[12]
Programming topics – Zobrist keys http://www.seanet.com/~brucemo/topics/zobrist.htm
53
Literatura [13]
Strategy Game Programming – Advanced Techniques http://www.fierz.ch/strategy2.htm
[14]
The Game of the Amazons http://en.wikipedia.org/wiki/Amazons_(game)
[15]
Negascout http://en.wikipedia.org/wiki/Negascout
[16]
MTD(f) – A Minimax Algorithm faster than NegaScout http://www.cs.vu.nl/~aske/mtdf.html
[17]
Java Technology http://java.sun.com
[18]
Co možná (ne)víte o Javě http://www.abclinuxu.cz/clanky/show/43730
[19]
The Java Virtual Machine Specification http://java.sun.com/docs/books/vmspec
[20]
SWT: The Standard Widget Toolkit http://www.eclipse.org/swt/
[21]
Adrian Millet: Portable Draughts Notation http://homepages.tcp.co.uk/~pcsol/pdn.htm
[22]
PDN 2.0 Specification http://www.nemesis.info/pdn2.txt
[23]
Portable Draughts Notation http://en.wikipedia.org/wiki/Portable_Draughts_Notation
[24]
Portable Game Notation http://www.very-best.de/pgn-spec.htm
54
Seznam použitých zkratek
A Seznam použitých zkratek FEN
Forsyth-Edwards Notation
IOC
International Olympic Committee
J2SE
Java 2 Standard Edition
JFC
Java Foundation Classes
PDN
Portable Draughts Notation
PGN
Portable Game Notation
SAN
Standard Algebraic Notation
SWT
Standard Widget Toolkit
UML
Unified Modeling Language
55
Stručná pravidla Mezinárodní dámy
B Stručná pravidla Mezinárodní dámy Pravidla dle České federace dámy [3] použitá pro implementovanou aplikaci: •
Hraje se na desce 10×10, na každé straně 20 kamenů ve 4 řadách na černých polích.
•
Kameny se táhne po diagonálách, vždy jen o jedno pole dopředu.
•
Skáče se dopředu i dozadu, hráč přenese svůj kámen na konečné pole skoku, naznačuje přitom průběh skákání a až poté odstraní přeskočené kameny z desky. Přes jeden kámen lze skákat jen jednou.
•
Skákání je povinné.
•
Přednost má ten skok, kterým se přeskakuje větší množství soupeřových kamenů.
•
Dokončí-li kámen tah na poslední řadě (bílý na polích 1–5, černý na polích 46–50), mění se v dámu. Dáma se pohybuje po diagonálách dopředu i dozadu, může skákat přes libovolný kámen na diagonále a dokončit skok na kterémkoli poli za přeskočeným kamenem.
•
Dáma nemá při skákání přednost.
•
Partii vyhrává hráč, jehož soupeř nemá tah podle pravidel, tzn., že nemá již žádné kameny, nebo jsou jeho kameny zablokovány, nebo se vzdal.
•
Partie skončí nerozhodně dohodou hráčů, nebo když se vyskytne 3x stejná pozice.
56
Instalační příručka
C Instalační příručka C.1 Systémové požadavky Doporučená konfigurace: •
MS Windows 9x/2000/XP™/Linux(core 2.4)/MacOS™ 9 nebo novější,
•
Pentium 500MHz procesor nebo novější,
•
35 MB volné paměti RAM,
•
5 MB volného místa na disku,
•
rozlišení obrazovky alespoň 1024×768 bodů,
•
Java 2 platforma – verze alespoň 1.5 nebo novější.
Poznámka: Aplikace byla testována pouze na operačním systému MS Windows™. Lze však očekávat, že na ostatních operačních systémech s podporou pro prostředí Java platformy poběží aplikace taktéž bez problémů.
C.2 Instalace prostředí Java Pro běh aplikace je nutné mít nainstalováno prostředí ke spuštění aplikací napsaných v jazyku Java – J2SE (Java 2 Standard Edition). Instalaci prostředí je možné vynechat, jestliže je v OS již přítomna verze alespoň 1.5 (nebo novější). V opačném případě je zapotřebí prostředí před spuštěním aplikace nainstalovat. Instalační soubor prostředí pro OS MS Windows™ se nachází na přiloženém CD v adresáři /install/java, pro jiné operační systémy je nutné instalační soubor získat na [17]. Instalace prostředí probíhá pomocí jednoduchého průvodce, jehož pokyny se stačí řídit. Na OS Linux je třeba zaregistrovat cestu k binárním souborům prostředí v souboru /etc/bashrc.
57
Instalační příručka
C.3 Spuštění aplikace Spustitelná
verze
aplikace
se
nachází
na
přiloženém
CD
v adresáři
exe/damaq-1.0.zip. Soubor s aplikací je třeba zkopírovat a rozbalit pomocí archivačního programu podporujícího ZIP kompresi do libovolného adresáře na pevném disku. K usnadnění spuštění aplikace byly vytvořeny pomocné dávky (aplikace), které se nacházejí v adresáři aplikace. Volba spouštěcí dávky se může lišit podle použitého operačního systému: •
MS Windows™ – aplikaci lze spustit příkazem pro spuštění souboru damaq.exe,
•
Unixové (Linux) systémy – aplikaci lze spustit příkazem pro spuštění dávkového souboru ./launch.sh.
Pro jakýkoli podporovaný operační systém lze také využít příkazu java -jar damaq.jar.
58
Uživatelská příručka
D Uživatelská příručka Příručka popisuje funkce dostupné v implementované aplikaci a jejich ovládání.
D.1 Obecné Aplikace Damaq slouží k hraní deskové hry Dáma podle Mezinárodních pravidel. Pravidla hry lze nalézt v příloze B. Aplikace podporuje jak hru s počítačem, tak i hru dvou lidských hráčů. Hra obsahuje i zvuky, které lze případně vypnout v uživatelském nastavení (viz D.7). Prostředí aplikace podporuje více jazyků, obsahuje podporu pro jazyk český a anglický. Při prvním spuštění je detekováno jazykové nastavení uživatele v operačním systému a jazykové nastavení aplikace se automaticky nastaví. Není-li detekováno české jazykové nastavení uživatelského prostředí operačního systému, je automaticky při prvním spuštění zvolen jazyk anglický. Jazykové nastavení lze v aplikaci kdykoliv později změnit (viz D.7).
D.1.1 Hlavní obrazovka Skladba hlavní obrazovky je následující (viz Obr. 8): •
Hlavní menu – obsahuje hlavní funkce pro ovládání aplikace.
•
Tlačítková lišta – obsahuje tlačítka pro rychlé vyvolání funkcí hlavního menu.
•
Herní deska – popisuje aktuální rozestavení kamenů během partie.
•
Nástroje – jedná se volitelné nástroje, plovoucí okna, pro analýzu pozice a informace o
partii. •
Stavový řádek – obsahuje informační pole k zjištění aktuálního stavu partie.
59
Uživatelská příručka
Hlavní menu
Tlačítková lišta
Nástroje
Herní deska
Stavový řádek
Obr. 8 – Hlavní obrazovka aplikace
D.2 Funkce hlavního menu Hlavní menu je rozděleno do sedmi hlavních částí (menu). Některé z pokročilých funkcí menu jsou dále popsány v samostatných odstavcích.
D.2.1 Menu Hra Menu obsahuje funkce pro práci s partií a funkci pro ukončení aplikace. Popis funkcí: •
Nová – Spustí novou partii. Po spuštění nové partie jsou automaticky nastaveni hráči – za bílé hraje hráč (člověk), za černé hraje počítač.
•
Otevřít – funkce vyvolá dialog pro otevření souboru ve formátu PDN a umožní tak načíst uloženou partii. Funkci Otevřít je věnován samostatný odstavec (viz D.6.3).
•
Uložit jako – funkce vyvolá dialog pro uložení partie do souboru ve formátu PDN nebo ve formě HTML stránky s odkazem na Java applet.
60
Uživatelská příručka •
Poslední soubory – menu zobrazuje několik naposledy otevřených souborů. Poklepáním na jméno souboru dojde k otevření souboru, podobně jako po zvolení souboru pomocí funkce Otevřít. Počet takto zobrazených souborů lze nastavit v uživatelském nastavení (viz D.7).
•
Konec – vyvoláním této funkce dojde k ukončení aplikace.
D.2.2 Menu Tah Menu obsahuje funkce sloužící k nastavení hráčů na tahu a ovládání historie zahraných tahů. Popis funkcí: •
Zpět – funkce vyvolá navrácení do pozice o jeden tah zpět a vznikne tím předchozí pozice. Tahy, které byly provedeny zpět jsou v nástroji Hra (viz D.3.2) zašedlé. Upozornění: Je-li v pozici na tahu počítač, po dvou vteřinách začne táhnout. Pro vyvolání o dva tahy zpět je nutné funkci zavolat dvakrát.
•
Opakovat provedený – funkce vyvolá provedení tahu, který byl před tím brán zpět. Provede se první „zašedlý“ tah z nástroje Hra.
•
Počítač – Počítač – obě strany hry budou zastupovány počítačem, počítač bude hrát sám proti sobě.
•
Hráč – Počítač – za stranu na tahu bude hrát hráč. Jeho protihráčem bude počítač.
•
Hráč – Hráč – spustí hru dvou hráčů.
•
Počítač na tahu – počítač bude hrát za stranu, která je aktuálně na tahu.
•
Hráč na tahu – lidský hráč bude hrát za stranu, která je aktuálně na tahu.
D.2.3 Menu Obtížnost V tomto menu si lze nastavit úroveň obtížnosti hraní proti počítači. Vyšší obtížnost zvyšuje dobu čekání na tah počítače. Nastavení obtížnosti se projeví až se započetím výpočtu nového tahu (až bude počítač opětovně na tahu). Popis funkcí: •
Začátečník – velmi jednoduchá úroveň.
•
Pokročilý – středně obtížná úroveň. 61
Uživatelská příručka •
Mistr – obtížná úroveň.
•
Velmistr – velmi obtížná úroveň.
D.2.4 Menu Herní deska Níže uvedené funkce se vztahují k aktuálnímu rozestavení kamenů a polím na herní desce. Popis funkcí: •
Číslování – zapne nebo vypne zobrazení čísel na hracích polích. Hodnoty jsou pro Mezinárodní dámu od 1 do 50. Hodnota 1 je uvedena v levém horním rohu herní desky (strana černého hráče).
•
Otočená – zapne nebo vypne zobrazení herní desky z pohledu protihráče (otočení o 180°).
•
Velikost – tato funkce je určena zejména pro obrazovky s vyšším rozlišením. Umožňuje uživateli nastavit velikost herní desky v několika úrovních:
malá – odpovídá 75% normální velikosti,
normální – odpovídá 100% velikosti herní desky dle aktivního skinu (viz. D.7),
•
velká – odpovídá 125% normální velikosti,
velmi velká – odpovídá 150% normální velikosti.
Schránka – obsah herní desky lze číst a přenášet nebo měnit prostřednictvím schránky operačního systému. Možnosti jsou následující:
vložit FEN – ze schránky op. systému je získán notace zápisu FEN a dle ní je upraven obsah herní desky. Vložením dojde k přechodu aplikace do editorského módu (viz D.3.3),
kopírovat jako FEN – do schránky op. systému bude vložena notace zápisu obsahu pozice FEN,
kopírovat jako text – do schránky op. systému bude vložen zápis obsahu herní desky ve formě obyčejného textu (ASCII znaků).
Jednotlivou
interpretaci kamenů si lze zvolit v uživatelském nastavení (viz D.7),
62
Uživatelská příručka
kopírovat jako obrázek – do schránky op. systému bude vložen zápis obsahu herní desky ve formě rastrového černobílého obrázku (náhled),
kopírovat jako DamPragueFont – do schránky op. systému bude vložen zápis obsahu herní desky ve formě textu ve fontu DamPragueFont. Font DamPragueFont je distribuován spolu s aplikací (v adresáři Fonts aplikace) a je nutné si ho volitelně pro používání nainstalovat do fontů používaných op. systémem.
D.2.5 Menu Nástroje Menu obsahuje obecné funkce k ovládání nástrojů sloužící k analýze pozice a získání informací o partii. Jednotlivé nástroje a jejich funkce jsou popsány v kapitole D.3.
D.2.6 Menu Zobrazit Funkce menu umožňují uživateli přizpůsobit si vzhled hlavní obrazovky. Popis funkcí: •
Tlačítková lišta – zapíná nebo vypíná zobrazení tlačítkové lišty
•
Stavový řádek – zapíná nebo vypíná zobrazení stavového řádku
D.2.7 Menu Damaq Menu obsahuje obecné funkce vztahující se k aplikaci. Popis funkcí: •
Nápověda – zobrazí nápovědu aplikace v HTML ve výchozím webovém prohlížeči operačního systému.
•
Jazyk – obsahuje seznam dostupných jazykových mutací pro aplikaci Damaq. Změna výběru jazyka je oznámena uživateli informačním dialogem. Pro aplikování nového jazykového nastavení je nutné aplikaci znovu spustit.
•
Kontrola nové verze – zobrazí dialog s informacemi o nastavení síťového připojení a který umožní ověření existence nové verze aplikace přes Internet (více viz D.8)
•
O programu – zobrazí dialog s detailními informacemi o verzi aplikace.
63
Uživatelská příručka
D.3 Nástroje Nástroje jsou pomocná okna umístěna v rámci hlavního okna, která umožňují uživateli analýzu partie a sledování informací o partii hry. S otevřenými okny lze libovolně pohybovat a lze je kdykoliv opětovně zavřít. Každé okno se skládá z hlavní části a pomocné tlačítkové lišty (toolbar). Pomocí funkcí (tlačítek) na tlačítkové liště lze změnit zobrazená data v hlavní části, popř. nastavení nástroje či partie.
D.3.1 Nástroj Možné tahy Nástroj lze vyvolat z menu Nástroje – Možné tahy. Okno (Obr. 9) obsahuje seznam všech dostupných (legálních) tahů pro danou pozici a hráče, který je aktuálně na tahu. Je-li na tahu hráč (člověk), lze poklepáním v seznamu tahů provést vybraný tah.
Obr. 9 – Nástroj Možné tahy
Zobrazení tahu lze dále upravit pomocí funkcí v tlačítkové liště: •
Dlouhé zobrazení tahů – je-li funkce zapnuta, seznam zobrazuje tahy i s informací o přeskoku (např. 28x19x13, nikoliv krátká varianta 28x13),
•
Zobrazit ekvivalentní tahy – je-li funkce zapnuta, seznam zobrazuje tahy, které jsou ekvivalentní (tahy u kterých se mění jen pořadí přeskoku, např. 32x21x12x23x32 a 32x23x12x21x32).
64
Uživatelská příručka
D.3.2 Nástroj Hra Nástroj lze vyvolat z menu Nástroje – Hra. Okno (viz Obr. 10) obsahuje popis partie (kdo, kdy s kým hrál), seznam provedených tahů partie obou hráčů a tlačítka pro posouvání v historii obsahu pozic na herní desce.
Popis partie (hry) lze libovolně měnit a upravovat. Obsah popisu partie je na zvážení uživatele.
Popis partie
Historie provedených tahů
Komentář tahu
Tlačítka k ovládání historie tahů
Obr. 10 – Nástroj Hra
Historie provedených tahů obsahuje jednotlivé tahy obou hráčů. V historii tahů lze libovolně skákat pomocí levého tlačítka myši poklepáním na libovolný tah (pozici). Tahy provedené v historii zpět jsou zašedlé. Poslední pole v historii tahů vždy udává aktuální výsledek partie (0–1 – výhra černých, 1–0 – výhra bílých, * – nedohráno, ½–½ – remíza). Ke každému tahu lze vložit komentář (poklepáním na editační pole vedle tahu).
Tlačítka k ovládání historie tahů umožňují rychlý výběr pozice partie z historie tahů (skok na pozici – první, předcházející, následující, poslední). Zobrazení panelů v okně lze dále upravit pomocí funkcí v tlačítkové liště: •
Zobrazit/skrýt popis hry – je-li funkce zapnuta, je zobrazen popis partie,
•
Dlouhé zobrazení tahů – je-li funkce zapnuta, seznam zobrazuje tahy i s informací o přeskoku (např. 28x19x13, nikoliv krátká varianta 28x13), 65
Uživatelská příručka •
zobrazit/skrýt komentáře – je-li funkce zapnuta, jsou zobrazeny komentáře tahů.
D.3.3 Nástroj Editor Nástroj lze vyvolat z menu Nástroje – Editor – Editační mód. Aktivací tohoto nástroje (viz Obr. 11) přechází partie do tzv. editačního módu, ve kterém není možné zadávat tahy na herní desce, ale dochází k nastavování kamenů na hracích polích desky. Editační mód lze kdykoliv ukončit zavřením nástroje.
Volba kamene pro editaci Obr. 11 – Nástroj Editor
Editovat pole na herní desce lze pomocí myši. Levým tlačítkem myši se nastavuje kámen (zvolený v okně nástroje). Pravým tlačítkem myši dochází k vymazání obsahu hracího pole na herní desce. Tlačítková lišta nástroje obsahuje následující funkce: •
Nastavit startovní pozici – na hrací desce bude nastavena výchozí pozice podle pravidel hry,
•
Odstranit všechny kameny – odstranění všech hracích kamenů z herní desky,
•
Bílý na tahu/černý na tahu – nastaví stranu, která má být aktuálně na tahu,
•
Obnovit pozici před editací – nastaví původní rozmístění kamenů před vstupem do editačního módu.
D.3.4 Nástroj Hodiny Nástroj lze vyvolat z menu Nástroje – Editor – Zobrazit. Okno (viz Obr. 12) zobrazuje uplynulý čas partie. Horní řada panelů zobrazuje celkový uplynulý čas přemyšlením pro bílého, resp. černého hráče. Dolní řada zobrazuje strávený čas na aktuální, resp. poslední tah (závisí podle toho, kdo je aktuálně na tahu).
66
Uživatelská příručka Celkový uplynulý čas bílého hráče
Uplynulý čas na aktuální tah bílého hráče
Celkový uplynulý čas černého Uplynulý čas na poslední tah Obr. 12 – Nástroj Hodiny
K ovládání hodin slouží pomocné funkce v tlačítkové liště:
Spustit hodiny – spustí čas pro hráče, který je na tahu,
Zastavit hodiny – zastaví počítání uplynulého času,
Vynulovat hodiny – nastaví uplynulé časy na 0, zároveň dojde k zastavení běhu hodin,
Nastavit hodiny – zobrazí dialog pro nastavení uplynulého času pro oba hráče.
D.4 Herní deska a zadávání tahu Herní deska slouží k zobrazení aktuálního rozestavení kamenů ve hře. K herní desce se vážou další funkce, které jsou umístěny v hlavním menu (viz D.2.4). S herní deskou lze pohybovat táhnutím při stisku levého tlačítko myši na okraji desky. Editaci pozice lze provádět pomocí nástroje Editor (viz D.3.3). Zadávání tahu je velice jednoduché, ovládá se pomocí levého tlačítka myši. Začíná volbou vlastního kamene hráče, kterým lze podle pravidel pohybovat (táhnout). Zvolená pozice je vždy barevně označena čtvercem (viz Obr. 13). Při kliknutí na kámen, kterým nelze pohybovat, je uživatel upozorněn změnou kurzoru a zvukovým signálem. Na herní desce se po zvolení počáteční pozice ukazují možné varianty pokračování tahu, pozice lze vybírat kliknutím. Celkový tah je zadán postupným výběrem tahu až do koncové pozice. Pro přehlednost jsou pole meziskoku tahu od koncových polí tahu barevně rozlišeny. Zadávání tahu pro zvolený kámen lze kdykoliv přerušit kliknutím na původní kámen nebo libovolný jiný vlastní, kterým lze také táhnout.
67
Uživatelská příručka Koncová pozice tahu Označené meziskokové pole
Zvolený kámen k táhnutí
Obr. 13 – Zadávání tahu
Další možný způsob zadání tahu je pomocí nástroje Možné tahy (viz D.3.1).
D.5 Stavový řádek Stavový řádek zobrazuje aktuální informace o stavu partie a nastavení kláves Num Lock a Caps Lock. Význam jednotlivých informačních polí stavového řádku nejlépe ilustruje následující obrázek:
Strana na tahu
Poměr kamenů na desce – bílého a černého hráče
Stav kláves Caps Lock a Num Lock
Obr. 14 – Stavový řádek Hráč na tahu Indikace zapnutých hodin
Indikace probíhání hledání tahu počítače
Hodnoty ve stavovém řádku jsou obnovovány automaticky.
D.6 Uložení a načtení rozehrané partie Aplikace Damaq umožňuje uložit a načíst rozehranou partii ve formátu PDN. Dále je možné vyexportovat partii i jako HTML stránku s odkazem na Java applet.
68
Uživatelská příručka Formát PDN (Portable Draughts Notation) slouží k výměně uložených partií mezi různými aplikacemi hry Dáma. PDN soubory mohou obsahovat jednu nebo více zaznamenaných partií. Partie jsou zaznamenány v textové podobě.
D.6.1 Uložení partie do formátu PDN K uložení partie v tomto formátu stačí vyvolat funkci hlavního menu Hra - Uložit jako, která zobrazí. dialog k výběru cesty a názvu souboru pro zápis. V dialogu je nutné vybrat typ souboru „Portable Draughts Notation soubory (*.pdn)“. Po potvrzení a zavření dialogu je zobrazen dialog popisu vlastností PDN partie (Obr. 15).
Obr. 15 – Dialog uložení partie do PDN souboru
V dialogu je možné popsat detailní informace o partii (událost, místo konání partie, jména obou hráčů, datum, kolo, výsledek partie). Zaškrtnutím „Připojit na konec souboru“ lze určit, zda se má zaznamenávaná partie připojit na konec již existujícího souboru PDN. Pokud nebude volba zaškrtnuta, stávající soubor bude přepsán a bude obsahovat pouze aktuálně ukládanou partii. Možnost zaškrtnutí není povolena, pokud je vytvářen nový soubor . Uložení partie do souboru proběhne po stisku tlačítka Uložit. Tlačítkem Storno je možné celý proces ukládání zrušit. Úspěšné provedení akce uložení souboru je oznámeno informačním dialogem.
69
Uživatelská příručka
D.6.2 Uložení partie jako odkaz na Java applet K uložení partie v tomto formátu stačí vyvolat funkci hlavního menu Hra - Uložit jako, která zobrazí dialog k výběru cesty a názvu souboru pro zápis. V dialogu je nutné vybrat typ souboru „Damweb.nl applet (*.html,*.htm)“. Stiskem tlačítka Uložit dojde k vytvoření HTML souboru. Úspěšné provedení akce uložení souboru je oznámeno informačním dialogem. Uloženou HTML stránku lze otevřít v libovolném internetovém prohlížeči. Spuštěný applet v HTML stránce může vypadat podobně jako na Obr. 16.
Obr. 16 – Přehrávání partie v Java appletu
D.6.3 Načtení partie ze souboru formátu PDN K načtení partie ze souboru je třeba zvolit funkci hlavního menu Hra – Otevřít, dále je nutné vybrat soubor ve formátu PDN a stisknout tlačítko Otevřít. Následně je otevřen dialog načtených partií daného souboru PDN (Obr. 17).
70
Uživatelská příručka
Obr. 17 – Dialog načtených partií z PDN souboru
Uživatel má v tabulce možnost vybrat si kteroukoli z načtených partií pro přehrání či vlastní analýzu strategie. K výběru partie kromě standardních informací o partii z PDN může pomoci i podpora třídění podle sloupců v tabulce nebo možnost náhledu na herní desku partie (jak ve stadiu startovní, tak i koncové pozice). Pro přehled jsou uvedeny tahy otevírající hru. Stiskem tlačítka Otevřít v dialogu je možné načíst celou partii a hrát od poslední pozice partie (popř. od jakékoliv pozice při skoku na libovolnou pozici historie partie pomocí nástroje Hra).
D.7 Uživatelská nastavení K zvýšení uživatelského komfortu slouží volby v dialogu uživatelských nastavení. Ten lze otevřít funkcí z hlavního menu Damaq – Nastavení. Dialog (viz Obr. 18) je rozdělen na čtyři záložky, mezi nimiž lze přepínat pomocí tlačítek na levé straně (Obecné, Vzhled, Export, Různé). Hlavní část obsahuje možné volby nastavení aplikace.
71
Uživatelská příručka
Volby nastavení
Tlačítka pro přepínání záložek
Obr. 18 – Dialog uživatelských nastavení
Změnu volby nastavení lze aplikovat stiskem tlačítka Použít. Změny se
projeví
okamžitě (pokud to volba podporuje). Aplikovat změny lze také stiskem tlačítka OK s tím rozdílem, že po aplikaci změn dojde k zavření dialogu. Stiskem tlačítka Zavřít dojde k zavření dialogu a k zrušení neaplikovaných změn voleb nastavení.
D.7.1 Obecná nastavení Záložka Obecné obsahuje tyto volby: •
Ukládat velikost a polohu oken – pokud je volba vybrána, aplikace si ukládá vždy poslední pozici a velikost všech oken (hlavní okno, herní deska, nástroje). Při znovuotevření okna je poslední pozice s velikostí obnovena,
•
Povolit pouze jednu instanci – pokud je volba vybrána, nelze spustit více než jednu instanci aplikace. Při pokusu o spuštění další instance bude aktivována aktuálně běžící,
•
Automaticky kontrolovat nové verze – pokud je volba vybrána, dochází k ověřování nové verze aplikace vždy automaticky po spuštění na pozadí aplikace,
•
Žádat o schválení nové hry – pokud je volba vybrána, je po uživateli vyžadováno potvrzení pro spuštění nové hry (partie),
•
Žádat o potvrzení při ukončení programu – pokud je volba vybrána, je po uživateli vyžadováno potvrzení pro ukončení programu,
72
Uživatelská příručka •
Informovat při úspěšném uložení souboru – pokud je volba vybrána, je uživatel informován dialogem o proběhnutém úspěšném uložení souboru na disk,
•
Počet naposledy použitých souborů – volba udává maximální počet zobrazených odkazů na posledně načítané soubory v menu Hra – Poslední soubory (viz D.2.1).
D.7.2 Nastavení vzhledu Záložka obecné obsahuje tyto volby: •
Look&Feel – uživatel si může vybrat z dostupných globálních vzhledů aplikace. Po výběru a potvrzení je nutné aplikaci restartovat,
•
Skin – uživatel si může vybrat z několika dostupných vzhledů herní desky a pozadí okna,
•
Zobrazit tlačítkové lišty pro nástroje – pokud je volba vybrána, jsou zobrazeny tlačítkové lišty v oknech nástrojů,
•
Okraj dle Look&Feel – pokud je volba vybrána, jsou vykreslovány graficky i okraje oken podle aktuálně nastaveného Look&Feel (nikoliv okraje okna operačního systému). Pro aplikaci volby je vyžadován restart aplikace.
D.7.3 Nastavení exportu do schránky Vstupní textová pole umožňují nastavit textovou reprezentaci kamenů a polí pro export pozice herní desky do schránky operačního systému (viz D.2.4). Tlačítkem Výchozí lze obnovit původní textovou reprezentaci kamenů a polí dle továrního nastavení.
D.7.4 Různá nastavení •
Otevřít PDN obsahující pouze jednu hru okamžitě – pokud je volba vybrána a otevíraný soubor PDN obsahuje záznam pouze jedné partie, tak je partie načítána ihned bez zobrazení dialogu načtených partií (viz D.6.3),
•
Kódování pro PDN soubory – volba kódovací stránky pro načítání a ukládání PDN souborů,
•
Zvuky – pokud je volba vybrána, aplikace přehrává při hře zvuky.
73
Uživatelská příručka
D.8 Ověření nové verze Pokud má počítač, na kterém je program spuštěn, dostupné připojení na Internet, je možné snadno ověřit existenci nové verze programu. Volbou menu Damaq – Kontrola nové verze dojde k zobrazení dialogu nastavení internetového připojení (Obr. 19).
Obr. 19 – Dialog nastavení připojení a kontrola nové verze
V dialogu je možné případně nastavit detaily připojení – adresu serveru proxy a port, popř. uživatelské jméno s heslem pro přihlášení. Poznámka: ukládání hesla není bezpečné, heslo je na disku uloženo v nezašifrované podobě. Stiskem tlačítka Ověřit dojde k připojení na Internet a ověření. O výsledku kontroly nové verze je uživatel informován prostřednictvím informačního dialogu.
74
Obsah přiloženého CD
E Obsah přiloženého CD Na Obr. 20 je zobrazena adresářová struktura přiloženého CD.
Obr. 20 – Adresářová struktura přiloženého CD
Obsah CD: •
exe/damaq-1.0.zip – přeložený spustitelný program
•
html/ – dokumentace v HTML
•
abstract/ – obsahuje texty abstraktů v českém a anglickém jazyce,
javadoc/ – programátorská dokumentace
install/ – součásti nutné ke spuštění aplikace
java/ – obsahuje instalační soubor pro jazyk Java (J2SE SDK verze 1.5.0_06) •
src/ – zdrojové texty
bk-src.zip – zdrojové soubory pro elektronickou podobu textu bakalářské práce ve formátu MS Word
•
damaq-1.0-src.zip – zdrojové kódy aplikace
text/bk.pdf – elektronická podoba textu bakalářské práce ve formátu PDF
75