Hra 2048 spočívá v postupném spojování čísel stejné hodnoty, dokud nevznikne číslo 2048. Na haracím poli 4x4 začíná hráč se dvěma čísly hodnoty 2 na náhodné pozici. Při každém tahu hráč zvolí jeden ze 4 směrů a všechna čísla se posunou v daném směru o maximální možnou vzdálenost. Následně se na náhodnou volnou pozici vloží další číslo s hodnotou 2 nebo 4. Pokud do sebe narazí dvě stejná čísla, dojde k jejich spojení. Hra končí pokud dojde k dosažení hodnoty 2048, nebo jsou plně obsazeny všechny pozice a nelze se již dále pohnout.
- při spuštění se v konzoli vykreslí menu kde si bude možné:
- zvolit si obtížnost
- číslo které je po třeba složit
- velikost hrací plochy
- zvolit si ovládání (arrow keys / wasd)
- začít novou hru
- sledovat hru hranou solverem
- ukončit program
- zvolit si obtížnost
- při zvolení nové hry se v konzoli vykreslí hrací plocha a pomcí zvolených kláves se bude volit směr tahu
- při dosasžení potřebné hodnoty nebo zaplnění celé hrací plochy (bez možnosti dalšího pohybu) se v konzoli vykreslí win/lose obrazovka ke bude možné:
- restartovat hru
- vrátit se do úvodního menu
- ukončit program
- Gcc
- Cmake
- Make
- Ncurses
nebo
- Docker
mkdir build && cd build
cmake ../
make && ./2048
nebo
sudo docker build -t cpp_2048 .
sudo docker run -it cpp_2048
V celé aplikaci je ovládání řešeno pomocí klávesnice. Konkrétně jsou využity následující klávesy.
- Pohyb: ↑←↓→ nebo WASD
- Potvrzení: ⏎ Enter
- Ukončení: Q,X
- Krokování: N
V libovolné chvíli lze aplikaci ukončit stlačením Q.
V každém menu je pohyb mezi možnostmi vertikální. Mezi možnostmi se tak lze pohybovat pomocí dvojice ↑↓ nebo WS (obojí funguje po celou dobu) a aktuálně zvýrazněnou možnost potvrdit ⏎ Enter.
Pro volbu směru, kterým se mají dlaždice posunout, slouží ↑←↓→ nebo WASD. Aktivní je vždy pouze jedna kombinace dle volby v hlavním menu. Ukončit aktuální stav hry a vrátit se do hlavního menu lze stlačením X.
V režimu solveru probíhá krokování jednotlivých tahů stlačením N. Ukončit aktuální stav hry a vrátit se do hlavního menu lze opět stlačením X.
Aplikace je rozdělena do čtyř hlavních čáští: Control, States, Engine, Solver.
Třída Control
slouží jako entry point celé aplikace. Uchovává globální informace (Aktuální stav, nastavení, poslední input...). Zároveň zpracovává uživatelský vstup a spravuje jednotlivé stavy aplikace.
Třídy jednotlivých stavů vychází ze základní virtuální třídy State
. State
požaduje implementaci následujících metod:
render
- vykreslování stavuuser_input
- zpracování uživatelkého vstuputoggle
- přepínání na následující staventer
- inicializace stavu při přepunutí
Pro všechny menu stavy je definována zákaldní třída Menu : State
, která definuje motody render
a user_input
. Jednotlivá menu jsou pak třídy XY : Menu
.
Posledním stavem je Game
, který interaguje s Enginem a Solverem.
Třída Engine
definuje chování samotné hrací plochy. Udržuje aktuální stav hrací plochy a poskytuje metody pro její manipulaci.
Solver je složen ze čtyř funkcí:
find_score_left
- vypočítá skóre pohybu vlevofind_score_up
- vypočítá skóre pohybu vpravofind_score_right
- vypočítá skóre pohybu dolůsolve
- vyhodnotí skóre a provede tah pomocíEngine
Skóre je počítáno jako součet volných polí daným směrem (1 bod za každé) a počtu dlaždic které lze spojit s tím, že dlaždice vyšší hodnoty mají větší váhu (konkrétně za spojení dlaždice je solve
se pak snaží preferovat pouze tahy vlevo a nahoru, pokud ani jeden nelze provést dojde k tahu vpravo, až v případě že nelze provést ani ten táhne dolů.