20. 12. 2015

Sokoban

Jak nemám rád sudoku, původně japonská hra nazvaná Sokoban patří naopak mezi mé oblíbené hlavolamy (pokud ji neznáte, pomůže wikipedie). Přes svou zdánlivou jednoduchost je Sokoban jednou ze dnes stále řidších her, ve kterých člověk nad počítačem vítězí: složitou úroveň počítač nevyřeší, brutální výpočetní výkon se rozbíjí na sofistikovaném předivu vzájemných vazeb mezi objekty, které při řešení hlavolamu vznikají.


PMD 85 je pro implementaci Sokobanu téměř ideální platformou. Původně jsem chtěl zvolit podle velikosti úrovně tři různé velikosti základní mřížky, 6x6, 9x9 a 12x12 pixelů, avšak prostřední možnost jsem musel s lítostí opustit, protože bych se tím připravil o možnost používat polotony: PMD má pro každou šestici pixelů společné atributy. Vlastně je zvláštní, jak málo klasických her z 80. let s polotony péemdéčka pracuje, a to včetně takových, které jinak šestice bodů využívají. Autoři si buď neuvědomovali, že tuto možnost mají, nebo portovali tituly z jiných počítačů, vesměs s barevnou grafikou.

Po technické stránce nebylo téměř co řešit, s výjimkou komprese úrovní. Protože jsem chtěl uživateli nabídnout možnost nahrát do počítače desítky nebo i stovky úrovní najednou, bylo komprimované uložení nutností. Vyšel jsem z modifikovaného Huffmanova kodu, který používal stařičký program pro PC pusher.exe (zde je rozpitván); nebylo důvodu vymýšlet něco jiného, jestliže bych stejně dospěl k téměř nebo zcela identickému kompresnímu algorithmu.

Aby hráč mohl řešit úrovně, které jsou k disposici pro modernější počítače, připravil jsem mu konversní rutinu. Tu jsem vytvořil v Pythonu (sok2bin.py) a měla by být schopna přečíst všechny obvyklé formáty – ve kterých je tedy skutečný zmatek! – a vytvořit na výstupu binární soubor.

Pro jeho převod do formátu PTP pak stačí použít rutinu bratří Bórikových bin2ptp: typ souboru je 'S', tedy např. sok2bin.py mylevels.xsb -o mylevels.bin && bin2ptp -t S -n 77 -o mylevels.ptp mylevels.bin (utilita bin2ptp neumožňuje vstup ze stdin a nelze ji tedy připojit přímo rourou: ukázka zhoubného vlivu prostředí Windows na programátory!).

Určitou nevýhodou je, že tento program je distribuován v podobě binárního souboru pro Windows a zdrojových kodů v C a není tak snadno portovatelný jako skript v Pythonu, ale soudím, že většina uživatelů tuto potíž překoná, se starými počítači si většinou nehrají úplní začátečníci.

Po zavedení obsahuje můj program 60 klasických úrovní z původního pusher.exe, které zabírají cca 5 KiB. Nahrajeme-li si vlastní soubor z kasety, tyto původní úrovně se jím přepíší a nezabírají tak dál místo: pro úrovně zbývá cca 22 KiB.

U modelů s režimem AllRAM, tzn. PMD 85-2A a -3, by se dala využít celá paměť, tedy pro úrovně by zbylo cca 42 KiB (funkce původního monitoru vůbec nevolám, nahradil jsem je vlastní knihovnou a ROM mohu s klidem odpojit). Tuto úpravu ještě zvážím, faktem je, že jedna úroveň zabere jen několik desítek bytů a není proto možná nutné disponibilní paměť maximalisovat.

Program je jako obvykle distribuován ve třech jazykových mutacích, a až ho dokončím a odladím, opět ho na tomto místě vystavím pro beta-testery.

Aktualisováno.
sokoban-1.0-1.ptp

A něco úrovní odtud, cca 7700 (jsou baleny po stovkách): sokoban1.zip

Žádné komentáře:

Okomentovat