Pac-Man

Kategorie programování

21. až 23. června 2019

Soutěž v programování — 33. ročník

Celostátní kolo 2018/2019

Naprogramujte upravenou hru Pac-Man, ve které hráč sbírá jídlo, obchází zdi, vyhýbá se bombám a snaží se dojít do cíle dříve, než mu dojde všechna energie. Můžete také naprogramovat umělou inteligenci, která Pac-Mana sama dovede bezpečnou cestou až do cíle.

Oproti klasické hře zde nejde o čas a navíc všichni duchové zmizeli! Hra se tím ovšem nestala lehčí, protože duchové za sebou zanechali bomby. Ba co hůř, v naší variantě hry musí Pac-Man na každý krok vynaložit energii — a pokud mu dojde energie dřív, než dojde do cíle, je to game over. Dokážete Pac-Mana přesto provést bludištěm?

Pravidla hry

Upravený Pac-Man je tahová hra. Pac-Man začíná na své počáteční pozici s počátečním množstvím energetických jednotek a jeho úkolem je projít bludištěm do cíle. V každém tahu se pohne vodorovně nebo svisle o jedno políčko, což ho stojí 1 energetickou jednotku a pak se provede efekt políčka, na které Pac-Man vstoupil. Pokud i poté má Pac-Man stále alespoň 1 energii, tak následuje další tah. Pokud ale má Pac-Man poté 0 nebo méně energie, není-li v cíli, hra končí neúspěchem.

Efekty políček:

Počáteční a cílové políčko jsou vždy volná políčka — není na nich jídlo, zeď ani bomba.

Skladba tahu tedy je:

  1. Pac-Man se pohne o 1 políčko doleva, doprava, nahoru nebo dolů.
  2. Pac-Man ztratí 1 energetickou jednotku za pohyb (a to i tehdy, když vylézá na zeď).
  3. Provede se efekt políčka, kam Pac-Man vstoupil. Pokud je Pac-Man v cíli, hra končí jeho výhrou.
  4. Pokud má nyní Pac-Man 0 nebo méně energie, hra končí.
  5. Jinak pokračujeme dalším tahem.

Povinná část (70 bodů)

Dovolte uživateli vybrat soubor s hracím plánem, načtěte ho a zobrazte ho na obrazovce. Váš program musí podporovat textový formát nebo formát JSON. Nemusí podporovat oba formáty, ale získáte více bodů, pokud budete podporovat formát JSON. Připomínáme, že máte právo stáhnout z internetu knihovnu pro práci s JSON soubory. Pokud podporujete JSON, je pak už zbytečné podporovat i textový formát.

V textovém formátu je na prvním řádku šířka a výška hracího plánu, na druhém řádku počáteční stav Pac-Mana, na třetím řádku souřadnice cíle a na dalších N řádkách popis řádků hracího plánu:

M,N
x0,y0,e
x1,y1
řádek1
řádek2
...
řádekN

Ve formátu JSON má vstupní soubor tuto strukturu (může mít jiné množství bílých znaků):

{
    "SIRKA": M,
    "VYSKA": N,
    "START": { "X": x0, "Y": y0, "E": e },
    "CIL":   { "X": x1, "Y": y1 },
    "PLAN": [
        "řádek1",
        "řádek2",
        ...
        "řádekN"
    ]
}

V obou formátech:

Máte zaručeno, že validní vstupní soubor nebude mít nikdy větší pole než 20×20 políček.

Pokud byste například načetli tento soubor v textovém formátu:

4,3
1,2,10
4,3
V,J3,J4,B2
V,V,Z7,J1
V,V,Z4,V

tak výsledek bude vypadat nějak takto:

a Pac-Man začne s 10 energetickými jednotkami.

Hrací plán můžete znázornit podle vlastního uvážení, ale dodržte prosím tyto pokyny:

Umožněte uživateli také načíst další soubor znovu bez nutnosti restartovat program.

Počítačová hra (100 bodů)

Umožněte hráči hrát tuto hru tak, že bude ovládat Pac-Mana skrz bludiště. Hra by měla zobrazovat aktuální energii Pac-Mana a aktualizovat jeho pozici a stav hracího plánu po každém tahu. Hráč by se měl dozvědět, když hru prohraje nebo vyhraje.

Ovládání by mělo být intuitivní, přijemné a dokumentované.

Funkce navíc: Restart. Umožněte taky hráči hru snadno restartovat, a to i poté, co prohrál. Restartování vrátí hru do stavu těsně po načtení mapy.

Funkce navíc: Ochrana před smrtelným pohybem. Dovolte hráči v uživatelském rozhraní zapnout bezpečný režim. Pokud by se hráč v tomto režimu snažil s Pac-Manem vstoupit na políčko se zdí nebo bombou, ale zeď je nekonečně vysoká, bomba je smrtící nebo by energie Pac-Mana tímto pohybem klesla na -1 nebo méně, zabraňte tomuto pohybu — do takového políčka se hráči nepodaří vstoupit.

Pohyb Pac-Mana může být skokový, není ho třeba animovat.

Nezapomeňte, že programujete počítačovou hru. Hodnotí se i přívětivost ovládání, grafické zpracování a funkčnost uživatelského rozhraní. Nezapomeňte na uživatelskou dokumentaci.

Umělá inteligence (170 bodů)

Naprogramujte umělou inteligenci, která najde cestu do cíle, při které ale Pac-Man přežije. Pokud se vám to podaří, vykreslete cestu z počátečního políčka do cíle na obrazovku a zobrazte délku cesty. Pokud ne, upozorněte uživatele, že se do cíle dojít nedá.

Stupňovaná obtížnost. Naprogramovat umělou inteligenci, která by si dobře poradila s bombami a jídlem i na větších mapách není úplně snadné. Dostanete body i tehdy, pokud zvládnete jen menší mapy, kde jsou jako překážky jen zdi.

Bonus za nejkratší cestu. Dostanete body navíc, pokud Pac-Man dojde do cíle nejkratší možnou cestou.

Pokročilá varianta: Sběrač energie. Kromě toho navíc můžete uživateli dát možnost vybrat, jestli chce najít nejkratší cestu do cíle, anebo jestli by raději došel do cíle s největším možným množstvím energie. V této variantě Pac-Man vyhraje jen tehdy, když se nebylo možné do cíle dostat s vyšším množstvím energie. V této variantě zobrazte kromě cesty také množství energie, které má Pac-Man po pohybu do cíle.

Dokumentace a přehlednost kódu (10 bodů)

Váš program by měl být intuitivní a dokumentovaný. Váš zdrojový kód by měl být přehledný a jeho složitější místa by měla být okomentována.

Poznámky

Můžete použít standardní knihovnu vašeho programovací jazyka. Můžete také stáhnout a použít libovolné knihovny kromě knihoven algoritmů a datových struktur. Pokud si nejste jistí, externí knihovnu nepoužívejte nebo se zeptejte poroty.

Po skončení soutěže svoje řešení nahrajte do cloudu. Adresa je https://svp.proed.cz/, přihlašovací údaje jste obdrželi na proužku papíru.

Data ukládejte do již vytvořeného adresáře s vaším startovním číslem – jinam porota nevidí. Pokud vaše řešení sestává z několika málo souborů, můžete je uploadovat přímo. V opačné případě je prosím zabalte do formátu .zip.


Hodnocení

Body Za co
Parsování 20
30 Zobrazení hracího plánu
30 Počítačová hra: Ovládání a herní smyčka
30 Počítačová hra: Fungování políček
20 Počítačová hra: Nenarážení do zdi
20 Počítačová hra: Vychytávky a absence bugů
50 Umělá inteligence: Nalezení cesty a její zobrazení
10 Umělá inteligence: +najde nejkratší cestu
20 Umělá inteligence: +bomby
30 Umělá inteligence: +jídlo
30 Umělá inteligence: Mód "sběrač energie"
10 Umělá inteligence: Neexistující cesta