Ve třetí úloze bude Vaším úkolem naprogramovat hráče (původně deskové) dvouhráčové hry Reversi.
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ř.
Naprogramujte hráče, který bude hrát korektně a lépe než hráči všech ostatních.
Na úloze si ukážeme následující vlastnosti této skupiny problémů:
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.
Odevzdání se dělí na dvě části:
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.
Reversi
$$$”, kde místo $$$ doplňte název Vašeho oblíbeného IDE (NetBeans, Eclipse, Intellij Idea, …)
cz.cvut.agents.rph.reversi.players.xxxxxxxx, kde místo xxxxxxxx doplníte Vaše uživatelské jméno.
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ží!)
ReversiPlayer
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.
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
cz.cvut.agents.rph.reversi.main.ReversiCreator
cz.cvut.agents.rph.reversi.players.novakja1.MyPlayer cz.cvut.agents.rph.reversi.players.DummyPlayer
Č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 frameworku: reversi-src.zip .
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. mouseenabledreversicreator.java