====== Reversi ====== Ve třetí úloze bude Vaším úkolem naprogramovat hráče (původně deskové) dvouhráčové hry [[http://en.wikipedia.org/wiki/Reversi|Reversi]]. ===== Formulace problému ===== Mějme čtvercovou hrací plochu N x N čtvercových políček. Hrací plocha je ohraničená a hrany hrací plochy spolu nesousedí. Máme hrací kameny dvou barev. Na začátku hry máme ve středu hrací plochy umístěny dva kameny od každé barvy. Hráč, který je na tahu položí na hrací plochu kámen své barvy tak, aby uzavřel souvislou řadu soupeřových kamenů. Tyto kameny se potom stanou kameny hráče na tahu. To je možné provádět vodorovně, svisle a šikmo. Pokud hráč nemůže umístit kámen tak, aby soupeři zabral alespoň jeden kámen, hraje automaticky soupeř. Hra končí v okamžiku, kdy je celá hrací plocha zaplněna kameny nebo pokud žádný hráč nemůže položit svůj kámen. Vítězem hry je hráč mající na hrací ploše více kamenů než soupeř. ===== Formulace úlohy ===== Naprogramujte hráče, který bude hrát korektně a lépe než hráči všech ostatních. ===== Cíle ===== Na úloze si ukážeme následující vlastnosti této skupiny problémů: * Objevení základních úskalí prohledávání v prostoru s oponentem, v dynamickém prostředí * Problém prohledávání jako kombinatorická exploze * Efektivita prohlédávacích algoritmů * Zobecnění tohoto problému na celou třídu úloh, které lze řešit stejným či obdobným přístupem ===== Hodnocení ===== Stejně jako v celém předmětu RPH se cení především vaše snaha. Pak se nemusíte bát, že byste kvůli této úloze předmět neukončili. Nicméně v průběhu práce na úloze budou definované kontrolní body, kdy budete muset odevzdat implementaci jisté části úlohy. Na závěr se porovnají vaše hráče s ostatními a pokusíte se umístit v této minisoutěži co nejlépe. * Měli byste úloze porozumět a naimplementovat jednoduchého hráče. * Měli byste navrhnout sofistikovanější hráče, který si poradí s ostatními soupeři. ===== Odevzdání ===== Odevzdání se dělí na dvě části: - Odevzdání jednoduchého hráče, který umí hrát korektní tahy. - Odevzdání sofistikovaného hráče pro turnaj. * Odevzdávejte pouze .java soubory - minimálně ''MyPlayer.java'' extendující od ''ReversiPlayer''. Pokud potřebujete více tříd, vytvořte tyto třídy také v balíku cz.cvut.agents.rph.reversi.players.xxxx, kde xxxx je Vaše username. ===== Další informace ===== * v turnaje je limit 1 sekunda na 1 tah * hráči mají zakázáno používat další vlastní výpočetní vlákna * odevzdávací stroj poběží na Javě 8, ale neměl by být problém s kompatibilitou kódů v Javě 7 ===== Instrukce pro úlohu Reversi ===== - Stáhnout {{:courses:a4b99rph:cviceni:reversi:reversi.zip|Reversi JAR ZIP soubor}} - Vytvořit ve vašem oblíbeném IDE projekt ''Reversi'' - Přidat k projektu závislost na reversi.jar (reversi.jar získám tak, že rozbalím reversi.jar.zip) - Zadejte dotaz na Google "How to add jar in ''$$$''", kde místo ''$$$'' doplňte název Vašeho oblíbeného IDE (NetBeans, Eclipse, Intellij Idea, ...) - Následujte odkazy na Google - Vytvořit balík (package) ''cz.cvut.agents.rph.reversi.players.xxxxxxxx'', kde místo ''xxxxxxxx'' doplníte Vaše uživatelské jméno. - V tomto balíku vytvořte třídu s názvem ''MyPlayer'', tedy např. student s uživatelským jménem novakja1 pojmenuje svého hráče ''cz.cvut.agents.rph.reversi.players.novakja1.MyPlayer'' (Na velikosti písmen záleží!) - Tato třída musí dědit od třídy ''ReversiPlayer'' - Dále musí implementovat tyto metody: - **''String getName()''**, která vrátí Vaše uživatelské jméno - **''ReversiMove makeNextMove(int[][] board)''**, která pro daný stav hry (definovaný v proměnné board) vrátí tah obalený třídou ''ReversiMove''. Pro zjištění Vaší barvy použijte metodu ''getMyColor()'' implementovanou ve tříde ''ReversiPlayer''. - volitelně můžete přetížit i metodu **''init(...)''** pro vlastní inicializaci hráče. V takovém případě je pak ale ve vaší metodě zavolat jako první příkaz ''super.init(...)'', aby došlo ke korektnímu nastavení vnitřních proměnných - JavaDoc dokumentace pro knihovnu reversi.jar dostupná {{:courses:a4b99rph:cviceni:reversi:javadoc.zip|ZDE}} - Pro návod jak ve Vašem oblíbeném IDE k JAR knihovně připojit její Javadoc dokumentaci použijte Google - **Zdrojový kód ke knihovně reversi.jar bude dodán po odevzdání hráče schopného hrát korektní tahy** - Spuštění jedné Reversi hry provedete spuštěním třídy ''cz.cvut.agents.rph.reversi.main.ReversiCreator'' - Při spuštění máte možnost nadefinovat, kteři hráči spolu budou hrát. Hráče předáte přes argumenty metody **main(args)** jako názvy třídy. - Jako testovacího oponenta můžete použít hráče DummyPlayer, t.j. hráče, který hraje náhodné validní tahy. - Tj. náš hypotetický student novakja1 by třídu ReversiCreator spustil s parametry ''cz.cvut.agents.rph.reversi.players.novakja1.MyPlayer cz.cvut.agents.rph.reversi.players.DummyPlayer'' ===== Tips & Tricks ===== Časový limit, kterým omezujeme délku "přemýšlení" Vašeho hráče si můžete nastavit pomocí parametru timeout. Tento parametr nastavíte pomocí přepínače %%--timeout=XXX%% u třídy ''ReversiCreator'', kde XXX udává maximální dobu v milisekundách, kterou může Váš hráč strávit v metodě ''makeNextMove()''. Při ladění může být užitečné nastavit tento parametr na vysokou hodnotu, tj. třídu ''ReversiCreator'' spustíte např. s parametry ''%%cz.cvut.agents.rph.reversi.players.novakja1.MyPlayer cz.cvut.agents.rph.reversi.players.DummyPlayer --timeout=99000000%%''. ==== Zdrojový kód ==== Zdrojový kód frameworku: {{:courses:a4b99rph:cviceni:reversi:reversi-src.zip|}} . > {{page>courses:a4b99rph:internal:cviceni:tyden08#NetBeans}} Když si budete chtít proti svému hráči zahrát sami, využijte následující ReversiCreator a implementujte u Vašeho hráče rozhraní java.awt.MouseListener. {{:courses:a4b99rph:cviceni:reversi:mouseenabledreversicreator.java|}} ===== Odkazy ===== * [[http://www.online-game.tv/play/reversi|Zahrajte si proti počítači]] * [[http://www.flyordie.com/board-games/reversi.html|Zahrajte si reversi proti jiným hráčům]] >{{page>courses:a4b99rph:internal:cviceni:reversi}}