README update

This commit is contained in:
Filip Znachor 2023-05-08 00:04:54 +02:00
parent e7b7f77e0b
commit 693dc8efe0
Signed by: Znachor
GPG key ID: F7E1AF4FD8E2D01E
2 changed files with 60 additions and 11 deletions

View file

@ -1,25 +1,74 @@
# Šachy
Program umožňuje hrát šachy dvěma hráčům u jednoho počítače. V současné době je implementována pouze základní funkčnost, tedy vykreslení šachovnice, černých a bílých kamenů společně s možností přesunu kamenů na jiná libovolná políčka. V případě přesunutí kamenu na obsazené políčko se původní kámen odstraní.
Program umožňuje hrát šachy dvěma hráčům u jednoho počítače s možností přepnout libovolného hráče na počítač. V programu jsou implementována pravidla pohybu kamenů včetně braní mimochodem, rošády a proměny v dámu. Kromě hraní šachů je v programu také možné si vybrat jedno ze čtyř barevných provedení šachovnice i kamenů, exportovat vektorově či rastrově aktuální šachovnici nebo si pomocí dalších možností přizpůsobit herní zážitek.
## Popis implementace
Hra je naprogramována v programovacím jazyce Java za použití grafické knihovny Swing pro vykreslování šachovnice a kamenů. Hlavní třídou je `Chess`, která vytváří a nastavuje okno programu a pokračuje s vytvořením šachovnice a jednotlivých kamenů.
Hra je naprogramována v programovacím jazyce Java za použití grafické knihovny Swing pro vykreslování šachovnice a kamenů, JFreeSVG pro vektorový export šachovnice a JFreeChart pro vykreslení sloupcového grafu. Hlavní třídou programu je `Chess`, která vytváří a nastavuje okno programu, vytváří hlavní nabídku pod horním okrajem okna a pokračuje s vytvořením šachovnice.
Šachovnice je v programu reprezentována třídou `Chessboard`, která vykresluje jednotlivá políčka a uchovává dvourozměrné pole kamenů na ní umístěných. Kameny jsou tvořeny třídami, které dědí od abstraktní třídy `AbstractPiece` a implementují rozhraní `IPiece`.
Šachovnice je v programu reprezentována třídou `Chessboard`, která vykresluje jednotlivá políčka, uchovává dvourozměrné pole kamenů na ní umístěných a řeší další problémy které s ní souvisejí. Všechny kameny jsou tvořeny třídami podle jejich anglického názvu a implementují jejich vykreslování a možné pohyby. Třídy kamenů dědí od abstraktní třídy `APiece`, která implementuje společné chování kamenů.
Třída `ChessboardMouseAdapter` umožňuje přesouvat jednotlivé kameny na šachovnici kliknutím a tažením myši. Tato třída zaznamenává kliknutí tlačítka na myši, pohyb myší a uvolnění tlačítka, a na základě těchto událostí provádí přesun kamenů.
Třída `ChessboardMouseAdapter` umožňuje přesouvat jednotlivé kameny na šachovnici klikáním či tažením myší. Tato třída zaznamenává kliknutí tlačítka myši, pohyb myší a uvolnění tlačítka, a na základě těchto událostí provádí přesun kamenů. Třída kromě toho také při zvednutí kamenu nechá zobrazit všechny jeho možné pohyby, které jsou v souladu s pravidly.
Kromě těchto hlavních tříd se v programu nacházejí i další pomocné třídy. Třída `Player` reprezentuje hráče, jeho kameny a operace s ním související. Je možné nastavit, aby za hráče hrál počítač, přičemž je možné využít režimu náhodných možných pohybů či chytrého módu, ve kterém za hráče hraje šachový engine Stockfish, který je v programu reprezentován třídou `Stockfish`.
V programu je využita také třída `PiecePosition`, která umožňuje konvertovat a uchovávat pozici na šachovnici, výčet `PieceColor`, který uchovává barvu hráče a výčet `StartPosition`, který označuje hráčovu startovní pozici. Výčet `Theme` uchovává 4 barevné módy šachovnice i kamenů.
## Funkce programu
Po spuštění se program automaticky pokusí zjistit barevné schéma a rozložení prvků operačního systému a pokusí se mu přizpůsobit. Ihned po spuštění programu se spustí nová hra, takže je možné začít ihned hrát. Horní část okna programu obsahuje hlavní nabídku, ve které je možné nastavit jeho chování. Níže najdete podrobný popis jednotlivých položek nabídky.
- **Hra**
- **Start new game** - začne novou hru
- **Load from FEN** - začne novou hru s načtenou pozicí podle zadané Forsyth-Edwardsovy notace
- **Get current FEN** - vypíše aktuální stav pomocí Forsyth-Edwardsovy notace
- **Statistics**- otevře nové okno s grafem znázorňujícím dobu jednotlivých tahů obou hráčů
- **Blind mode** - aktivuje slepý mód, po jehož zapnutí jsou vidět pouze kameny hráče na tahu
- **Vzhled**
- tato položka obsahuje 4 barevné varianty: klasickou (classic), zelenou (green), žlutou (yellow) a červenou (red)
- **CPU**
- **Disabled** - nastaví, aby za hráče nehrál počítač
- **Automatic random** - nastaví, aby za hráče hrál počítač náhodnými tahy
- **Automatic smart** - nastaví, aby za hráče hrál počítač pomocí enginu Stockfish
- **Export**
- **Export as SVG** - vytvoří vektorový SVG obrázek aktuálního stavu šachovnice a uloží jej do složky s programem jako `chess.svg`
- **Export as PNG** - vytvoří rastrový PNG obrázek aktuálního stavu šachovnice a uloží jej do složky s programem jako `chess.png`
## Použití Stockfish
Program umožňuje nastavit, aby za libovolného hráče hrál [šachový engine Stockfish](https://stockfishchess.org/), pomocí nabídky v horní části okna pod položkou CPU. Stockfish není v programu přibalen, je proto potřeba si jej doinstalovat, na což vás program před aktivací enginu upozorní.
Instalaci enginu lze provést pomocí stažení jeho spustitelného souboru do složky s programem nebo do systémové cesty pod názvem `stockfish` nebo `stockfish.exe`. Je možné jej nainstalovat také pomocí správce balíčků, pokud to používaný operační systém podporuje.
Po instalaci enginu by jej měl být program schopen najít a využít ke
hraní.
## Funkce šachovnice
Šachovnice implementovaná v tomto programu obsahuje kromě základního vykreslování a přesouvání kamenů pomocí myši také následující funkce.
- přesun kamenů pomocí tažení i klikání
- zobrazení možných tahů a jejich validace podle pravidel
- animace pohybu i sebrání kamenu
- informování o matu a patu formou dialogového okna
- restart hry bez nutnosti zavření programu
- zvýraznění posledního provedeného tahu (dvou polí) modrou barvou
## Omezení
Současná implementace má několik omezení, která je potřeba před finální verzí vyřešit. Aktuálně není kontrolováno, jestli daný hráč smí konkrétní přesun kamene provést, takže může hrát neplatné tahy i víckrát za sebou.
V této verzi programu je vyřešena většina omezení, která se vyskytovaly v předchozí verzi. Odstranit je pomohla především implementace pravidel, která nyní nedovoluje zahrát žádný tah, který by s nimi byl v rozporu. Hráči také nemohou hrát tak, aby dostali svého krále do šachu a to ani v případě složitějších pravidel, kterými je například braní mimochodem.
Kromě správnosti tahů nejsou implementována ani složitější pravidla hry, není tedy možné provést en passant (braní mimochodem), rošádu ani proměnu pěšce. Program nekontroluje ani to, zda je některý z hráčů v šachu či matu nebo nastala remíza. V tuto chvíli také není možné, aby hráč navrhl remízu nebo se vzdal.
Informaci o tom, jestli nastal mat či pat se hráči nyní dozví pomocí dialogového okna. V případě šachu jsou nuceni zobrazenými možnými tahy hrát pouze tak, aby šach odvrátili.
## Možná vylepšení
Stále se však v programu nachází některá malá omezení, která nejsou vyřešena, jako je například chybějící kompletní proměna.
V budoucnu je možné kromě zmíněných omezení implementovat i další funkce, jako je například hra na čas či přesun jednotlivých kamenů kliknutím na původní a nové pole společně s grafickým znázorněním, kam je možné kámen přesunout.
## Závěr
V dalších verzích je také možné přidat ukládání všech odehraných her a tažení kamenů, aby si uživatelé mohli projít předchozí hry po jednotlivých tazích.
> **Info**: Tento projekt jsem tvořil jako semestrální práci do předmětu **KIV/UPG** na **FAV ZČU**.
Přidána by mohla být i možnost uložení aktuálního stavu šachovnice do formátu SVG, PDF nebo PNG. Tato možnost by byla dostupná i u přehrávání již odehraných her.
Během zpracovávání semestrální práce jsem měl příležitost získat praktické zkušenosti s knihovnami Swing, JFreeSVG a JFreeChart a osvojit si jejich základy a zároveň se blíže seznámit s problematikou vykreslování grafického obsahu nejen v počítačových programech.
Semestrální práci považuji za přínosnou, jelikož mě především při implementaci pravidel postavila před některé druhy problémů, se kterými jsem se dosud neměl příležitost setkat a přiměla mě k vymýšlení jejich vhodných řešení. Při vypracovávání práce jsem se také více seznámil s pravidly šachů a rozšířil si obzory i v tomto směru.

View file

@ -85,7 +85,7 @@ public class ChessboardMouseAdapter extends MouseAdapter {
/**
* Render and move selected piece on drag
* @param me
* @param me mouse event
*/
public void onDrag(MouseEvent me) {
Chessboard c = (Chessboard) me.getSource();