Praha 6, Arabská 16. Dokumentace Ročníkového Projektu

Podobné dokumenty
CineStar Černý Most Praha

Piškvorky. Gymnázium, Praha 6, Arabská 16. Kristofer Filip, 1.E. Květen Stránka 1. předmět programování, vyučující Tomáš Obdržálek

Gymnázium, Praha 6, Arabská 16. předmět Programování, vyučující Tomáš Obdržálek Lodě Dokumentace ročníkového projektu Martin Karlík, 1E 17.5.

PŘÍRODOVĚDECKÁ FAKULTA UNIVERZITY PALACKÉHO KATEDRA INFORMATIKY ROČNÍKOVÝ PROJEKT KLOKAN. Informatika, II. ročník

Úvod do programu Solid Edge

Úvod do počítačových sítí

Úvodem... 9 Kapitola 1 Karetních

Gymnázium, Praha 6, Arabská 16 předmět Programování, vyučující Tomáš Obdržálek Šibenice ročníkový projekt Tadeáš Váša, 1E květen 2014

Bc. Martin Majer, AiP Beroun s.r.o.

Gymnázium, Praha 6, Arabská 14. předmět Programování, vyučující Tomáš Obdržálek. Počítačová hra Fotbalový Manažer. ročníkový projekt.

Mobilní hra Block Runner ročníkový projekt David Novák, 1.E květen 2014

Nový způsob práce s průběžnou klasifikací lze nastavit pouze tehdy, je-li průběžná klasifikace v evidenčním pololetí a školním roce prázdná.

Hodnocení soutěžních úloh

Zadání soutěžních úloh

CAS. Czech Association of Shogi

5a. Makra Visual Basic pro Microsoft Escel. Vytvořil Institut biostatistiky a analýz, Masarykova univerzita J. Kalina

CommonTestsAndGames03

Obsah herní sady: 40x dřevěný kámen hrací deska návod

DUM 06 téma: Tvorba makra pomocí VBA

Gymnázium, Praha 6, Arabská 14. Loydova patnáctka. Dokumentace ročníkového projektu. Předmět: Programování Vyučující: Ing. Tomáš Obdržálek Třída: 1.

8 Makra Příklad 4 Excel 2007

Hledání správné cesty

Desktop GUI. IW5 - Programování v.net a C# Desktop GUI

Fingerprint Verification Control

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

02. HODINA. 2.1 Typy souborů a objektů. 2.2 Ovládací prvky Label a TextBox

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: Předmět: ZAP

Základy práce na PC. Ing. Jan Roubíček

Šachy, vrhcáby (backgammon) & dáma

4a. Makra Visual Basic pro Microsoft Excel Cyklické odkazy a iterace Makra funkce a metody

SignEditor 1 - návod k použití

3 Makra Příklad 4 Access Ve vytvořené databázi potřebuje sekretářka společnosti Naše zahrada zautomatizovat některé úkony pomocí maker.

V Dolních Břežanech dne 10. května 2014

Pravidla vybraných deskových her pro potřeby předmětů Projektový seminář 1 a 2 v roce 2011/2012. Tomáš Kühr

Zá kládní nástávení prostr edí operáč ní ho syste mu Windows 7 á vybrány čh áplikáčí

FORMÁTOVÁNÍ 2. Autor: Mgr. Dana Kaprálová. Datum (období) tvorby: září, říjen Ročník: sedmý. Vzdělávací oblast: Informatika a výpočetní technika

Manuál k programu KaraokeEditor

Pro správné zobrazení mapové aplikace je potřeba mít nainstalovaný zásuvný modul Flash Adobe Player.

Popis ovládání. Po přihlášení do aplikace se objeví navigátor. Navigátor je stromově seřazen a slouží pro přístup ke všem oknům celé aplikace.

Mapová aplikace HZS Ústeckého kraje

Nový design ESO9. E S O 9 i n t e r n a t i o n a l a. s. U M l ý n a , P r a h a. Strana 1 z 9

Architektura. Vedení sesterské dokumentace

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

Choose a building block. Znalostní báze Kleos. Kleos 6.5 (březen 2019)

Středoškolská technika 2017 PROGRAM NA GENEROVÁNÍ PRVOČÍSEL

František Hudek. červenec 2012

Druhy souborů. textové. binární. nestrukturované txt strukturované - ini, xml, csv. veřejné bmp, jpg, wav proprietární docx, cdr, psd

PŘÍRODOVĚDECKÁ FAKULTA UNIVERZITY PALACKÉHO KATEDRA INFORMATIKY BAKALÁŘSKÁ PRÁCE. Desková hra s podporou hraní po síti Lovci pokladů.

Úvod. Program ZK EANPRINT. Základní vlastnosti programu. Co program vyžaduje. Určení programu. Jak program spustit. Uživatelská dokumentace programu

Používání u a Internetu

Obsah. 1 Úvod do Visia Práce se soubory 47. Předmluva 11 Typografická konvence použitá v knize 13

Uživatelský manuál. A4000 Download

Angličtina program k procvičování slovní zásoby

Excel tabulkový procesor

ZŠ ÚnO, Bratří Čapků 1332

TÉMATICKÝ OKRUH Softwarové inženýrství

Windows - základy. Hlavním vypínačem na základní jednotce. K datům uloženým do výchozí složky.

Kontingenční tabulky v MS Excel 2010

Uživatelská příručka. 06/2018 Technické změny vyhrazeny.

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Excel - pokračování. Př. Porovnání cestovních kanceláří ohraničení tabulky, úprava šířky sloupců, sestrojení grafu

Územní plán Ústí nad Labem

UNIVERZITA PARDUBICE Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Zdokonalování gramotnosti v oblasti ICT. Kurz MS Excel kurz 6. Inovace a modernizace studijních oborů FSpS (IMPACT) CZ.1.07/2.2.00/28.

Začínáme pracovat s tabulkovým procesorem MS Excel

(IMPACT) CZ.1.07/2.2.00/

Registrační číslo projektu: CZ.1.07/1.5.00/ Název projektu: Moderní škola 21. století. Zařazení materiálu: Ověření materiálu ve výuce:

Gymnázium Vysoké Mýto nám. Vaňorného 163, Vysoké Mýto

Specifikace softwarového díla & Časový plán implementace. pro. MEF Editor

Gymnázium Vysoké Mýto nám. Vaňorného 163, Vysoké Mýto

Popis programu EnicomD

ONI system Notifikace a pravidla + vícenásobný filtr

Programování jako nástroj porozumění matematice (seriál pro web modernivyuka.cz)

Odpadové hospodářství v ORP Ústí nad Labem

Dále jsou ke hře potřeba dvě sady kamenů (figur) bílé a černé. Každá sada obsahuje

JAY Systém TELwork s.r.o. JAY Systém Klient. Uživatelská příručka ( ) JAYSystem Klient - Uživatelská příručka.docx Stránka: 1 / 15

MS Excel makra a VBA

Část 1 - Začínáme. Instalace

Aktuální výběr, nad kterým je kurzor myši

Cesta po Evropské unii Cesta za poznáním. Jak hrát tuto hru?

zapište obslužnou metodu události Click tlačítka a vyzkoušejte chování polevýsledek.text = polečíslo1.text + polečíslo2.text;

Matematika. Gymnázium, Praha 6, Arabská 16. předmět Programování, vyučující Tomáš Obdržálek. dokumentace ročníkového projektu.

IPFW. Aplikace pro ovládání placeného připojení k Internetu. verze 1.1

Program pro tvorbu technických výpočtů. VIKLAN - Výpočty. Uživatelská příručka. pro seznámení se základními možnostmi programu. Ing.

Aplikace GoGEN Smart Center

Postup instalace přídavného modulu pro Aktuální zůstatky (CBA) v programu MultiCash KB (MCC)

Tabulkový procesor. Základní rysy

Práce s programem MPVaK

Gymnázium, Praha 6, Arabská 16 Předmět Programování, vyučující Tomáš Obdržálek Hledání Min Ročníkový projekt Filip Mašát, 1.

Microsoft Office. Word vzhled dokumentu

Psaní programu pro PLC SIMATIC S7-300 pomocí STEP 7

Reliance 3 design OBSAH

01. HODINA. 1.1 Spuštění programu VB Prvky integrovaného vývojového prostředí. - pomocí ikony, z menu Start.

BALISTICKÝ MĚŘICÍ SYSTÉM

Záložka také kombinuje ikony s textem a tak usnadňuje vyhledání přesně té funkce, kterou potřebujete.

Svolávací systém Uživatelský manuál

Úvod...1 Instalace...1 Popis funkcí...2 Hlavní obrazovka...2 Menu...3 Práce s aplikací - příklad...5

Sada 1 - PHP. 03. Proměnné, konstanty

Transkript:

Gymnázium Praha 6, Arabská 16 Šachy Dokumentace Ročníkového Projektu Autor Ondřej Nývlt Třída 1. E Vyučující Tomáš Obdržálek Předmět Programování 18. května 2014

Obsah 1 Úvod 1 1.1 Anotace................. 1 1.2 Prohlášení................ 1 1.3 Poznámky................ 1 1.4 Zadání.................. 1 1.4.1 Základní funkcionalita..... 1 1.4.2 Bonusová funkcionalita.... 2 2 Hra 2 2.1 Historie hry............... 2 2.2 Princip hry............... 2 3 Aplikace 3 3.1 Použité technologie........... 3 3.2 Ovládání................. 3 3.3 Návrh.................. 4 3.4 Struktura projektu........... 5 3.4.1 View............... 5 3.4.2 Model.............. 6 3.4.3 ViewModel........... 6 3.5 Aplikační logika............. 7 3.5.1 Kliknutí na pole........ 7 3.5.2 Získání tahů.......... 8 3.5.3 Provedení tahu......... 9 4 Závěr 9 4.1 Vývoj návrhu, problémy........ 9 4.2 Splnění zadání............. 10 1 Úvod 1.1 Anotace Cílem projektu bylo vytvořit implementaci klasické strategické deskové hry šachy, kde dva hráči proti sobě soupeří posouváním figurek po šachovnici. Aplikace je postavena na.net frameworku s využitím programovacího jazyka C# a technologie WPF pro grafické uživatelské rozhraní. Aplikace je navržena pro PC a umožňuje hru dvou hráčů nedisponuje možností hry hráč proti počítači. Abstract The objective of the project was to create full-featured implementation of classic strategy board game chess where two player fight with each other by moving pieces around the chessboard. Application is built on.net framework using C# programming language and WPF technology for graphical user interface. App is designed for PCs and is capable of handling two-player game player vs. computer game mode is not available. 1.2 Prohlášení Prohlašuji, že jsem jediným autorem tohoto projektu, všechny citace jsou řádně označené a všechna použitá literatura a další zdroje jsou v práci uvedené. Tímto dle zákona 121/2000 Sb. (tzv. Autorský zákon) ve znění pozdějších předpisů uděluji bezúplatně škole Gymnázium, Praha 6, Arabská 14 oprávnění k výkonu práva na rozmnožování díla ( 13) a práva na sdělování díla veřejnosti ( 18) Datum Místo Autor 1.3 Poznámky V tomto dokumentu dochází ke vzniku mnohoznačných pojmů. Aby nevznikala nedorozumnění, uvádím následující pokyny: Pojem pole v tomto dokumentu označuje oblast průniku řádku a sloupce na mříži šachovnice nebo objekt typu Square či jeho grafickou interpretaci v uživatelském rozhraní. Ve významu datové struktury array není použit. Pojmy aktivní pole, vybrané pole, povolený tah, zakázaný tah atd. existují pouze v rámci aplikace a nevyskytují se ve hře šachy. 1.4 Zadání 1.4.1 Základní funkcionalita Aplikace s grafickým uživatelským rozhraním (GUI) Implementace hry šachy Umožňuje hru dvou hráčů Zprostředkuje pohyb figurek po šachovnici 1

Rozpozná libovolnou možnost konce hry (šach, mat, pat) 1.4.2 Bonusová funkcionalita Započítává body a zaznamenává průběh hry Zobrazí statistiky na konci hry Umožní uložení výsledků hry do textového souboru Speciální tahy (rošáda, tah mimochodem) 2 Hra Šachy jsou klasická desková hra pro dva hráče. V soutěžní podobě je považována za odvětví sportu. Hráči spolu soupeří prostřednictvím figurek posouvaných po šachovnici. Cílem je dostat protihráčovu figurku krále do situace, kdy je ohrožen a nelze toto ohrožení kterýmkoliv způsobem odvrátit. 2.1 Historie hry Původ Jako místo vzniku se kvůli jazykovým souvislostem nejčastěji označuje Indie. První zmínka o předchůdci hry se objevila v Persii kolem roku 600 n. l., kde je nyzývána jako Šatrandž. V 9. století se dostala do Číny a poté se začala postupně šířit i v Evropě. Kolem roku 1000 jsou v Evropě šachy všeobecně známou hrou. Moderní hra Ve 13. století se začala pravidla rozšiřovat a ustálila se kolem 15. století. Oproti relativně omezenému Šatrandži se liší mimo jiné rozšířenými tahy zejména u královny, která měla původně velmi omezené možnosti pohybu. Finální podobu hra získala v 19. století. 2.2 Princip hry Šachovnice Hra probíhá na šachovnici. Šachovnice je čtvercová deska s mříží o velikosti 8 sloupců (značeny písmeny a až h) a 8 řad (značených čísly 1 až 8). Buňka v mříži se nazývá pole. Pole mají střídavě tmavou (černá pole) a světlou barvu (bílá pole). Na každém poli může stát maximálně jedna figurka. Obrázek 1: Výchozí rozložení figurek na šachovnici. Figurky Každý hráč má na začátku hry k dispozici sadu 16 figurek šesti různých typů, rozmístěných ve výchozím postavení. Figurky rozdílných hráčů se liší barvou; světlé figurky náleží bílému hráči (zkráceně bílý) a tmavé černému hráči (černý). Každý typ figurky má zvláštní možnosti pohybu po šachovnici (počet figurek na jednoho hráče v závorce). Pěšec (8): Pohyb o jedno pole vpřed, je-li volné; v prvním tahu konkrétního pěšce je možné ho posunout o dvě pole vpřed. Brát může pohybem o jedno pole vpřed a jedno stranou. Věž (2): Přímý pohyb po řadách a sloupcích o libovolný počet polí. Jezdec též Kůň (2): Pohyb o dvě pole rovně a jedno stranou (ve tvaru písmene L ). Střelec (2): Pohyb po diagonálách o libovolný počet polí. Střelec se pohybuje vždy na polích stejné barvy. Dáma též Královna (1): Kombinuje možnosti pohybu střelce a věže. Král (1): Pohyb o jedno pole libovolným směrem. Tahy Figurky jsou na šachovnici přesouvány prostřednictvím tahů. Hráči se v tazích pravidelně střídají; bílý zahajuje hru prvním tahem. Tah se sestává z přesunutí figurky táhnoucího hráče podle pravidel pohybu přemist ované figurky. Po- 2

kud přemist ované figurce stojí v cestě jiná figurka, nelze ji přeskočit (výjimku tvoří jezdec). Figurku nelze přemístit na pole, kde se nachází jiná figurka stejné barvy. Pokud se na cílovém poli nachází figurka rozdílné barvy, je odebrána ze šachovnice a dále se hry nezúčastňuje; takový tah se nazývá braní. Existují tahy, pro které platí speciální pravidla: Tah mimochodem (en passant): Pěšcem je možné sebrat pěšce protihráče, který se posunul o dvě pole, jako by se posunul pouze o jedno. Lze vykonat pouze v tahu bezprostředně následujícím po dvojitém tahu sebraného pěšce. Rošáda Posunutí krále o dvě pole směrem k věži a přesunutí věže na pole přeskočené králem. Rošáda je jediný tah, kdy se pohybují dvě figurky současně, ale je považována jako tah krále. Aby bylo možné rošádu vykonat, musí být splněny podmínky: Mezi králem a věží se nenachází žádná figurka; králem ani věží nebylo taženo; král nesmí být v šachu a nesmí přejít přes pole, které je ohrožené soupeřovou figurkou. Šach Situace, kdy je král ohrožen figurkou (figurkami) soupeře, se nazývá šach. Kdyby nebyl šach odvrácen hráčem, jehož král je ohrožen, soupeř by mohl krále v následujícím tahu sebrat taková situace nesmí nastat. Hráč proto musí šach odvrátit: Ustoupí s králem na neohrožené pole. Postaví před krále figurku a ochrání ho. Sebere figurku ohrožující krále. Situace, kdy nelze šach odvrátit žádným tahem, se nazývá mat (resp. šachmat). V takovém případě hra končí a hráč, který soupeři způsobil mat, se stává vítězem. Kromě matu může nastat pat. V takové situaci hráč, který je na tahu, není v šachu, ale nemůže vykonat žádný tah. Hra končící patem nemá vítěze; nastává remíza. 3 Aplikace 3.1 Použité technologie Běhové rozhraní vyvíjené fir-.net Framework mou Microsoft. C# Programovací jazyk Windows Presentation Foundation (WPF) Technologie pro tvorbu GUI, která využívá značkovací jazyk XAML (Extensible application markup language). Microsoft Visual Studio 2013 Express for Desktop Vývojové prostředí, které umožňuje vyvíjet aplikace pro Windows na klasickou plochu (tj. nikoliv moderní aplikace Windows 8 a vyšší). 3.2 Ovládání Instalace Hráč získá složku, ve které se nachází spustitelný soubor setup.exe. Když jej uživatel spustí, aplikace se nainstaluje a poté ji může najít v nabídce start. Aplikace lze nainstalovat pouze na operační systém Windows. Ovládání Po spuštění aplikace se otevře hlavní okno, které obsahuje tři základní prvky: menu, šachovnici a panel hráčů. Šachovnice umožňuje samotnou hru. Panel hráčů, který se nachází na pravé straně od šachovnice, poskytuje základní informace a statistiky o jednotlivých hráčích (jméno, barva, počet figurek). Nad panelem hráčů je zobrazen počet vykonaných tahů a doba uplynulá od začátku hry. Nad šachovnicí se nachází menu. Šachovnice Šachovnice se ovládá kliknutím na zvolené pole. Pokud se na něm nachází figurka aktuálního hráče, vybrané pole se stává aktivním a je červeně zvýrazněno. Pole, na které je možné vykonat tah, jsou zvýrazněna barevným ohraničením. Speciální tahy jsou zvýrazněny podobně, liší se 3

(a) Historie tahů (b) Statistika Obrázek 4: Speciální okna dostupná přes menu. Obrázek 2: Hlavní okno. Na aktivním poli (červeně) stojí bílá dáma a šedomodře ohraničené pole značí možné tahy. zobrazuje odlišným způsobem. Tahy jsou vykresleny jako graf závislosti počtu figurek na počtu vykonaných tahů. Graficky tak zobrazuje bilanci počtu figurek obou hráčů v průběhu hry. About Otevře okno About. Toto okno zobrazuje informace o aplikaci. Obrázek 3: Zvýraznění speciálního tahu rošády (fialově ohraničené pole) před a po přejetí myší. pouze barvou ohraničení. Po přejetí myši na takovým polem se zobrazí popisek s typem tahu. Kliknutím je vykonán příslušný tah; figurka je přesunuta na cílové pole a veškerá zvýraznění zmizí. Klikneli uživatel přímo na aktivní pole, zvýraznění zmizí a žádný tah není vykonán. Menu Nad šachovnicí, tj. v levém horním rohu okna, se nachází menu horizontální pás tlačítek, které uživateli umožňují vykonat příkazy: New Spustí novou hru. Save Uloží průběh hry do textového souboru ve formátu YAML. Po kliknutí na toto tlačítko se otevře dialog pro uložení souboru. History Otevře okno History (historie tahů). Historie tahů zobrazuje veškeré provedené tahy od začátku hry a příslušné informace (táhnoucí figurka, výchozí a cílové pole, sebraná figurka, čas, stav hráče,...); data pro vykreslení získává od objektů HistoryRecord z uspořádané kolekce History ve třídě Chessboard. Stats Otevře okno Statistics (Statistika). Okno je funkčně podobné oknu History, ale informace Konec hry Po skončení hry se objeví okno Results (Výsledky). Okno oznámí vítěze a prostřednictvím tlačítek odkáže uživatele do historie tahů či statistik. Zbývající tlačítka nabízí uložení průběhu hry do textového souboru nebo spuštění nové hry. 3.3 Návrh Aplikace byla navržena podle vzoru Model View ViewModel (MVVM). Schéma je založeno na striktním oddělení grafického uživatelského rozhraní (GUI) od logiky aplikace (bussines logic). To umožňuje měnit GUI nezávisle na kódu aplikace a naopak. MVVM dělí aplikaci na tři vrstvy: View Reprezentuje uživatelské rozhraní, které je navrženo ve značkovacím jazyce XAML. Určuje vzhled oken, stránek, ovládacích prvků atd. Převádí data do vizální podoby. Model Popisuje data, se kterými pracuje aplikace, obvykle ve formě objektů. ViewModel Třída, která drží stav aplikace. View- Model poskytuje data pro View, který je převádí do vizuální podoby a zobrazuje je v UI. 4

Converters Převodníky hodnot mezi View a ViewModelem třídy implementující IValueConverter. Model Obsahuje vnořené jmenné prostory: Obrázek 5: Schéma MVVM (zdroj: msdn.microsoft.com) Svázání View a ViewModelu je realizováno pomocí bindingu View je navázán na vlastnosti třídy ViewModel. Data mohou být mezi Viewem a View- Modelem synchronizována oběma směry. Změní-li uživatel data v UI pomocí ovládacích prvků, automaticky se změní i vlastnosti příslušné ViewModelu. Opačným směrem: jsou-li změněny vlastnosti View- Modelu, aktualizují se i navázané UI prvky. Aby aktualizace UI fungovala, musí ViewModel implementovat INotifyPropertyChanged interface. (V případě kolekce musí jít o typ ObservableCollection). Dojde-li ke změně hodnoty vlastnosti ViewModel, je vyvolána událost PropertyChanged, která informuje View a ten překreslí UI na základě nových dat. Pro převod dat (např. převod řetězců na čísla, matematická operace,...) mezi View a ViewModelem slouží konvertory, tj. objekty tříd implementující interface IValueConverter ViewModel vystavuje příkazy, tj. objekty tříd implementujících ICommand interface. Představují akce vykonané při určité události spojené s UI prvkem, který je na něj navázán (např. stisknutí tlačítka). Mimo jiné podle stavu ViewModelu určují, zda je možné akci vykonat, a podle toho změní stav příslušného UI prvku (zneaktivnění tlačítka). 3.4 Struktura projektu Soubory projektu jsou roztříděny do logických celků jmenných prostorů (namespaces). Na nejvyšší úrovni je namespace Chess. Jmenné prostory Model, View a ViewModel odpovídají vrstvám MVVM schématu. Každá složka v projektu představuje právě jeden jmenný prostor. Chess Namespace na nejvyšší úrovni. Commands ICommand. Příkazy třídy implementující Moves Tahy třídy implementující IMove. Pieces Figurky třídy rozšířující třídu Piece. ViewModel Obsahuje hlavní třídu Chessboard a vlastní typy kolekcí View Návrh UI. Obsahuje XAML soubory windows (okna) a resource dictionaries (slovníky zdrojů) 3.4.1 View Ve jmenném prostoru View se nachází veškerý návrh uživatelského rozhraní. Protože některé úseky XAML kódu jsou příliš dlouhé nebo se opakují, je výhodné je umístit do tzv. resource dictionary (slovník zdrojů), kde se mohou vyskytovat statické konstantní hodnoty, řetězce, barvy, styly, šablony, uživatelské ovládací prvky atd. (ekvivalent CSS s rozšířenými možnostmi) K hodnotám v resource dictionary lze následně přistupovat pomocí klíčů. Resource dictionary se může vyskytovat bud lokálně nebo v samostatném souboru, na který je potřeba odkázat. Každý XAML soubor v projektu představuje resource dictionary nebo okno (window). Soubor App.xaml se nachází na nejvyšší úrovni a obsah resource dictionaries zahrnutých v tomto souboru je dostupný globálně. Kód hlavního okna (MainWindow) je kvůli své délce rozdělen do dílčích resource dictionaries: ChessboardDictionary.xaml (šachovnice), PlayerPaneDictionary.xaml &.cs (panel hráčů). Obsah slovníku BasicDictionary.xaml je obecný, nevztahující se pouze k hlavnímu oknu. K některým souborům obsahujícím XAML kód (nejčastěji okna) je připojen soubor se stejným názvem a příponou.cs, které obsahují C# kód tzv. code-behind (např. k souboru MainWindow.xaml je připojen code-behind soubor MainWindow.xaml.cs). Zde je možné např. odchytávat události z View apod. 5

3.4.2 Model Model popisuje data, se kterými aplikace pracuje. Vyjmenovány jsou pouze důležité třídy, vlastnosti a metody. Všechny třídy modelu rozšiřují třídu ModelBase, která implementuje INotifyPropertyChanged interface. Díky tomu se změny hodnot vlastností projeví v UI. Square Představuje pole na šachovnici. int X, Y: Sloupec a řádek na šachovnici. Piece Piece: Figurka, která se na poli nachází. Move Move: Tah, který je možné na pole vykonat. bool IsActive: Pravdivé, pokud je pole aktivní. Piece Představuje figurku. Každý typ figurky má vlastní třídu, která rozšiřuje třídu Piece. char Sign: Unicode znak, který představuje šachovou figurku (např. symbol U+2658 N jezdec). bool HasMoved: Pravdivé, pokud byl s figurkou vykonán alespoň jeden tah. Výchozí hodnota je false. bool ThreatensKing: Pravdivé, pokud ohrožuje krále protihráče. Player Player: Hráč, jemuž figurka náleží. HashSet<IMove> GetMoves(): Získá tahy. HashSet<IMove> GetEvaluatedMoves(): Získá vyhodnocené tahy. Tahy, jejichž vykonání by způsobilo ohrožení vlastního krále, mají vlastnost IsRestricted pravdivou, ostatní nepravdivou (výchozí hodnota). Player Představuje hráče. string Name: Jméno hráče PlayerColor Color: Barva hráče (výčet obsahuje hodnoty Black a White. PlayerState State: Stav hráče (šach, šachmat, pat,...) Move Představuje tah. Seskupuje informace o tahu a metody k jeho ovládání. Jedná se o základní implementaci rozhraní IMove. Piece Piece: Figurka, která je tahem přemist ována. Square StartingSquare, FinalSquare: a cílové pole přesunu figurky. startovní Piece Captive: Figurka, která je tímto tahem sebrána. Obvykle je sebrána figurka nacházející se na cílovém poli, výjimku tvoří tah mimochodem. bool IsRestricted: Pravdivé, pokud by takový tah způsobil šach vlastnímu hráči. string Type: Typ tahu. Poskytuje bližší informace o tahu, např. dvojitý tah pěšce má v této vlastnosti uloženo "Pawn Double Move". Základním typem je "Common". void Do(Chessboard chessboard): Vykoná tah, tj. přesune figurku Piece na pole FinalSquare, sebere figurku Captive: a vyvolá akci Action. void TryDo(): Vykoná tah zkušebně, tj. je možné ho anulovat vyvoláním metody Undo(). void Undo(): Anuluje zkušební tah. Speciální tahy (tah mimochodem, rošáda) mají vlastní implementace IMove. Tahy, které se od základního tahu příliš neliší (povýšení pěšce), využívají základní Move a ve vlastnosti Action je uložena přídavná akce, která je vyvolána při vykonání tahu. HistoryRecord Představuje záznam o vykonaném tahu. V uspořádané kolekci pak objekty této třídy tvoří historii tahů. int Order: Pořadí záznamu. IMove Move: Vykonaný tah. TimeSpan Time: Doba uplynulá od začátku hry do okamžiku vykonání tahu. PlayerState State: Stav hráče, který tento tah způsobil protivníkovi. 3.4.3 ViewModel Chessboard Představuje šachovnici, která je ViewModelem aplikace. V celé aplikaci se nachází 6

jediná instance této třídy, ze které View čerpá data. SquareSet Squares: Kolekce polí na šachovnici. Typ kolekce SquareSet rozšiřuje třídu HashSet< Square> o metodu Square Get(int x, int y) pro získání pole z kolekce. HashSet<Piece> Pieces: Kolekce všech figurek (vč. sebraných). Aplikace s touto kolekcí téměř nemanipuluje; kolekce zaručuje, že nikdy nenastane situace, kdy by na určitý objekt figurky neexistovala reference a byl by tak vymazán. PropertyDictionary<PlayerColor, Player> Players: Kolekce hráčů. Typ PropertyDictionary <K, V> je vlastní implementace kolekce objektů, která jako klíč k získání objektu využívá jeho vybranou vlastnost. ObservableCollection<HistoryRecord> History: Kolekce objektů HistoryRecord, která tvoří záznam o průběhu hry. event MovePerformed: Událost vyvolaná při vykonání tahu event GameEnded: Událost vyvolaná při skončení hry. event PropertyChanged: Událost vyvolaná při změně vlastnosti tříd. Její vyvolání aktualizuje UI. void SetSquares(Square square): Metoda je vyvolána příkazem SetSquaresCommand a jejím parametrem je vybrané pole. Na základě vybraného pole nastaví stavy ostatních polí (nastaví aktivní pole a tahy, zneaktivní pole, vykoná tah, atd.) void ResetSquares(): Uvede šachovnici do stavu bez žádného aktivního pole a tahů. void PerformMove(Square square): Spustí metodu square.move.do(this), která vykoná tah. Poté nastaví následujícího hráče jako aktuálního a naopak. Zkontroluje šach, mat i pat. Přidá nový záznam o tahu do historie tahů. Nakonec vyvolá metodu ResetSquares() a událost MovePerformed. bool CheckCheck(): Zkontroluje šach. void CheckEnd(): Zkontroluje mat a pat. void SaveFile(): Uloží textový soubor se záznamem hry ve formátu YAML. Metoda vystavena přes příkaz SaveFileCommand. 3.5 Aplikační logika 3.5.1 Kliknutí na pole Chessboard obsahuje kolekce objektů Square (pole), Piece (figurka), Player (hráč). Každý objekt Square má vlastnost Piece, která značí figurku stojící na daném poli. View je navázán kolekci objektů Squares a vykresluje je do šachovnice. Square implementuje INotifyPropertyChanged, proto se změny vlastností objektu projeví v UI. V okně jsou pole reprezentována do mříže uspořádanými tlačítky, na které je navázán příkaz SetSquaresCommand (nastav pole). Pole je možné vybrat pouze v případě, že je na něj možné vykonat tah nebo se na něm nachází figurka táhnoucího hráče; tato podmínka je vložena do metody CanExecute() na objektu SetSquaresCommand a pokud ji pole nesplňuje, tlačítko je neaktivní (není možné na něj kliknout). Je-li však podmínka splněna, tlačítko je aktivní a klikne-li na něj uživatel, spustí se příkaz; jako parametr je příkazu předán navázaný objekt Square. Příkaz vyvolá metodu SetSquares(Square square), která vyhodnotí ostatní pole na šachovnici podle pole příslušejího tlačítku, na které uživatel klikl (tj. vybrané pole). Mohou nastat následující situace: 1. Na vybraném poli se nachází figurka táhnoucího hráče. Nejprve je zavolána metoda ResetSquares(), která odstraní případné jiné aktivní pole. Poté je vybrané pole nastaveno jako aktivní (IsActive = true). Na celé šachovnici se může nacházet pouze jediné nebo žádné aktivní pole. Tahy jsou získány od figurky, která stojí na aktivním poli, pomocí metody GetEvaluatedMoves() a následně jsou zobrazeny v UI. 2. Vybrané pole je aktivní, tj. uživatel na něj klikl dříve. Je zneaktivněno zavoláním ResetSquares(). Metoda nastaví Square.IsActive = false (zneaktivnění pole) a Square.Move = null (odstranění tahů) u každého pole v kolekci Squares. 3. Na vybrané pole je možné vykonat tah. Platí: Square.Move!= null. To znamená, že 7

uživatel dříve vybral pole, které se stalo aktivním a nyní chce provést tah s figurkou stojícím na aktivním poli na právě vybrané pole. Tento tah je vykonán zavoláním metody PerformMove(Square square), kde je parametrem vybrané pole. 3.5.2 Získání tahů K získání tahů dochází v případě 1 pomocí metody GetEvaluatedMoves() na objektů figurky, která stojí na aktivním poli. Každý typ figurky má speciální algoritmus pro získání tahů; všechny figurky mají metody GetMoves() a GetEvaluatedMoves(), které vrací množinu objektů IMove. Surové tahy Metoda GetMoves() vrací surové tahy, u kterých není zaručeno, že vykonání žádného z nich nezpůsobí ohrožení vlastního krále. Pokud by byl takový tah vykonán, protivník by mohl v následujícím tahu sebrat krále, což se nesmí stát. Vyhodnocené tahy GetEvaluatedMoves() vrací vyhodnocené tahy, které mají nastavenou vlastnost IsRestricted na true nebo false. Pakliže je IsRestricted = true, je tah zakázaný a jeho vykonání by způsobilo ohrožení vlastního krále. V opačném případě se jedná o povolený tah, v jehož vykonání hráči nic nebrání. Zajímavý je algoritmus pro získání vyhodnocených tahů. Metoda GetEvaluatedMoves() nejprve získá surové tahy od metody GetMoves(). Následně je proveden foreach cyklus na kolekci tahů; každá iterace náleží jednomu surovému tahu a vykoná následující: 1. Zkušební přesunutí figurky na cílové pole tahu 2. Získání tahů všech figurek soupeře; pokud se mezi nimi nachází alespoň jeden tah, jehož vykonáním by byl sebrán král aktuálního hráče, je tah (nikoliv soupeřův) označen jako zakázaný nastavením vlastnosti IsRestricted = true. V opačném případě je tah povolený. 3. Přesunutí figurky zpět na výchozí polohu a uvedení šachovnice do původního stavu Zkušební tah je vykonán zavoláním metody TryDo() na objektu tahu. Zkušební vykonání se od opravdového vykonání tahu liší tak, že má omezenější vliv a proto je možné ho vrátit zpět pomocí metody Undo (). Přestože iterace cyklu probíhají tak rychle, že View většinou nestíhá zobrazovat změny poloh figurek v UI, původně při vykonávání zkušebních tahů figurka poblikávala na šachovnici. Tento problém byl vyřešen dočasným vypnutím volání události PropertyChanged na objektech Square, což brání aktualizacím UI. Figurka vrátí množinu tahů, které je možné vykonat. Program uloží všem objektům Square do vlastnosti Move takový tah, jehož cílové pole je právě ten objekt Square. Protože vlastnost Move je navázána na View, zobrazí se tahy v okně. HashSet<IMove> moves = GetMoves(); // Vypne notifikace pro UI chessboard.squares.isnotifying = false; foreach (IMove m in moves) { // Zkušebně vykoná tah m.trydo(); // Zkontroluje, jestli v takovém rozložení // figurek není ohrožen král Piece king = chessboard.kingof(this.player); if (chessboard.squares.any(sq => sq.piece!= null && sq.piece.player!= this.player && sq.piece.getmoves().any( move => move.captive == king))) { // Existuje soupeřova figurka, která by // po vykonání toho tahu mohla // zajmout krále aktuálního hráče. // -> Tah je zakázán. m.isrestricted = true; } // Vrátí tah zpět m.undo(); } chessboard.squares.isnotifying = true; return moves; Kód 1: Úryvek kódu z metody pro získání vyhodnocených tahů ve třídě Piece 8

3.5.3 Provedení tahu K provedení tahu dochází v případě 3. Vybrané pole má ve vlastnosti Moove uložen tah, který je vykonán zavoláním metody IMove.Do(): Metoda vykoná následující: 1. Odstraní figurku Piece IMove.Captive (sebraná figurka) ze šachovnice, pokud není hodnotou této vlastnosti null 2. Odstraní stojící figurku na aktivním poli a tutéž figurku nastaví jako stojící na vybraném poli. Po samotném tahu je aktuálnímu hráči nastavena vlastnost Turns = false a následujícímu true. Tím se následující hráč stává aktuálním a naopak. Následuje ověření, zda tah nezpůsobil šach, mat či pat aktuálnímu hráči. Vyhodnocení šachu Nejprve je vyhodnocen šach zavoláním metody CheckCheck(). Metoda získá tahy všech figurek soupeře a je-li mezi nimi takový tah, jehož vykonáním by byl sebrán král, je nastaven stav hráče na PlayerState.Check. bool check = false; // Najde všechna pole s figurkou soupeře, // která má alespoň jeden tah ohrožující krále foreach (Square sq in Squares.Where(sq => sq.piece!= null && sq.piece.player!= CurrentPlayer && sq.piece.getmoves().any(m => m.captive == KingOf(CurrentPlayer)))) { // Všechny figurky stojící na takových // polích ohrožují krále a způsobují šach sq.piece.threatensking = true; check = true; } if (check) { SetPlayerState(CurrentPlayer, PlayerState.Check); return true; } return false; Kód 2: Kód metody oveřující šach Vyhodnocení matu a patu Dále je vyvolána metoda CheckEnd(), která vyhodnotí konec hry. Metoda obsahuje dvě podmínky, druhou vnořenou v první. Vnější podmínka vyhodnotí, zda aktuální hráč může vykonat nějaký tah. Získá tahy všech figurek aktuálního hráče a pokud mezi nimi není žádný povolený tah, podmínka je splněna. Tehdy se vyhodnocuje vnořená podmínka. Mohou nastat situace: 1. Hráč je v šachu. Ze situace vyplývá, že král hráče je ohrožen a nelze tuto situaci nelze zvrátit žádným tahem Nastává šachmat. 2. Hráč není v šachu. Ze situace vyplývá, že král hráče není ohrožen a hráč nemůže vykonat žádný povolený tah Nastává pat. Metoda v obou případech nastaví příslušným hráčům odpovídající stav, nastaví vlastnost šachovnice IsGameOver = true a vyvolá událost GameEnded s argumenty popisujícími konec hry. View na vyvolanou událost reaguje otevřením okna, které oznamuje konec hry a dodatečné informace (data čerpá z argumentů události objektu GameEndedEventArgs). // Podmínka je splněna, existuje-li figurka // aktuálního hráče, která má alespoň // jeden povolený tah. if (!Squares.Any(p => sq.piece!= null && sq.piece.player == CurrentPlayer && sq.piece.getevaluatedmoves().any( m =>!m.isrestricted))) { if (CurrentPlayer.State == PlayerState.Check) { /* Mat */ } else { /* Pat */ } } Kód 3: Podmínka oveřující mat a pat Dále je do kolekce ObservableCollection < HistoryRecord> History přidána nová instance třídy HistoryRecord, která shromažd uje informace o vykonaném tahu. Kolekce History tvoří kompletní záznam průběhu hry. 4 Závěr 4.1 Vývoj návrhu, problémy Návrh aplikace se v průběhu vývoje značně měnil a při konfliktech s problémy bylo potřeba provést několik klíčových přebudování projektu. Původní myšlenka byla následující. 9

Hlavní aplikační třída (šachovnice) bude obsahovat kolekci objektů figurek. Projekt obsahuje třídu Position; každá figurka má vlastnost tohoto typu, která značí, na jaké pozici se figurka nachází. Figurka vrací kolekci objektů Position jako pozice, na které je možné vykonat tah. Toto rozvržení bylo základem aplikace a později se ukázalo jako nevýhodné. Vykreslení uživatelského rozhraní podle tohoto modelu bylo obtížné a návrh neumožňoval zapamatování stavu polí, na kterých se nenacházela figurka. Nabízely se dvě možnosti návrhu aplikace: 1. Kolekce figurek s vlastností pole, na kterém figurka stojí. 2. Kolekce polí s vlastností figurky, která na poli stojí. Zvítězil návrh #2 (kvůli jednoduššímu bindingu) a projekt prošel první přestavbou. Třída Position se vyvinula ve třídu Square, nyní představující samotné pole spíše než jen pozici; kromě souřadnic obsahuje informace jako figurku, která na poli stojí, barvu a stav (tj. jestli je aktivní, jestli je na toto pole možné vykonat tah atd.). Hlavní aplikační třída Chessboard obsahuje kolekci objektů figurek (Piece) a polí (Square), přičemž figurky neví, na kterém poli stojí. Figurky ovšem obsahují referenci na Chessboard instanci a proto mohou jednoduše vrátit pozici vyhledáním příslušného pole v kolekci. Figurky zároveň potřebují mít referenci na šachovnici pro získání tahů. Nejprve byly tahy získávány ve formě vracení kolekce polí či pozic, na které je možné vykonat tah. Poté bylo použito zapisování stavů přímo do objektů Square bez vracení kolekce, což se později ukázalo být neefektivní ze dvou důvodů: bylo obtížné realizovat speciální tahy (např. tah mimochodem, kdy se sebraná figurka neshoduje s figurkou, jež stojí na cílovém poli) a také nebylo možné tahy před zobrazením na šachovnici zpracovat (vyhodnocení tahů). Jako řešení se jevilo vracení kolekce objektů představujících tahy (s vlastnostmi jako startovní a cílové pole, přemist ovaná figurka, sebraná figurka,...). Pro tento účel bylo vytvořeno interface IMove, specifikující vlastnosti tahu, a kterýkoliv druh tahu implementuje toto rozhraní. Díky tomuto systému je možné přidat libovolný speciální tah a upřesnit akci při jeho vykonání. Vyhodnocení tahů Obtížné bylo poradit si s tahy, jejichž vykonání by způsobilo ohrožení vlastního krále (zakázané tahy). Původní řešení zobrazovalo uživateli zakázaný tah jako povolený. Při vykonání takového tahu však byl uživatel upozorněn a tah vrácen zpět. Náhradním řešením bylo vyhodnocení tahů, které spočívalo v zabránění uživateli ve vykonání zakázaného tahu. Každý tah získaný od figurky je zkušebně vykonán a podle ohrožení vlastního krále je tah vyhodnocen jako povolený či zakázaný. Na základě této informace se takový tah na šachovnici zobrazí odlišně a uživateli není povoleno jej vykonat. Problémem byla skutečnost, že zkušební vykonání tahu se zobrazovalo i v UI, což bylo nežádoucí. Původním konceptem řešení bylo vytvoření kopie šachovnice, na které budou tahy vykonány nezávisle na UI. Jednodušším a finálním řešením bylo vypnutí volání události PropertyChanged při změně vlastnosti Square během vykonávání zkušebních tahů, což zabránilo aktualizacím UI. Zkušební tah mimo jiné neobnáší všechny akce jako tah na ostro. 4.2 Splnění zadání V průběhu vývoje aplikace Šachy se mi podařilo naplnit všechny body zadání, vč. základní i bonusové funkcionality. Výjimkou je započítávání bodů, nebot pravidla hry šachy žádné body nepopisují. Místo toho aplikace umožňuje v okně Statistics zobrazit vývoj počtu figurek v průběhu hry, což může být považováno za alternativu k bodovému hodnocení. 10