Rudolf Rosa Lóra - Dokumentace zápočtového programu
Program je textovým herním prostředím pro Kladenskou karetní hru Lóra. Umožňuje společnou hru jednoho lidského a tří počítačových hráčů s jistou dávkou umělé inteligence.
Program je napsán
v jazyce Pascal, ve Freepascalském dialektu. Celý
zdrojový text je umístěn v souboru LORA.pas
,
nedílnou součástí je soubor s pravidly Lóry
lora-pravidla.htm
, což je kopie souboru
http://www.volny.cz/petasites/Pravidla_Lory.htm
.
Program se striktně drží těchto oficiálních
pravidel (jedinou výjimkou je hra harakiri, která
pro své minimální využití nebyla
implementována).
Program je poskládán
z mnoha procedur a funkcí, hlavní program plní
roli zavaděče a hlavního cyklu (pro každou dílčí
hru). Předávání dat do procedur je typicky přes
globální proměnnou. (V tomto případě je to
vhodné z důvodu velkého množství informací,
které je potřeba předávat.) Globální
proměnné tak tvoří jakýsi globální
interface. Proměnné s pouze lokálním
významem pro danou proceduru jsou typicky deklarovány
lokálně. Veškeré výstupy do konzole jsou
zajišťovány procedurami vypisZpravu
,
vypisKarty
, writeKarta
a doplnMezerami
. Modifikací těchto
procedur a některých konstant je tedy možné upravit
všechny výstupy programu. Vstup od živého hráče
je přijímán přes konzoli, pomocí kláves 0
až 9
(resp. 0
až 8
) a je zpracováván
procedurou readNumberChar
(resp.
CekejNaStisk
).
Karty jsou
reprezentovány čísly od 0
do
31
, číslo
karty div 4
je "typ" karty (7, 8, 9, 10,
spodek, filek, král, eso – odpovídá
číslům 0
až 7
),
číslo
karty mod 4
je barva (červené, kule, zelené,
žaludy – odpovídá číslům 0
až 3
). Karty jsou ukládány
dvojmo - do polí a do množin (název množinové
konstanty nebo proměnné vždy končí M
),
protože se někdy víc hodí to a někdy zase ono. Množiny
jsou využívány zejména pro rozhodování,
zda karta nebo skupina karet někde je nebo není (např. zda má
hráč nějakou kartu dané barvy, zda daná karta
již byla vynesena či nikoli...), aby nebylo třeba stále
procházet různá pole. Reprezentace v poli se
využívá zejména pro manipulaci s jednotlivými
kartami a pro operace nad každou kartou (například obodování
v umělé inteligenci nebo posouzení
vynesitelnosti), neboť pascalská implementace množin není
na takové operace vhodná. Každopádně pokud dojde
k přesunu karty (typicky při jejím vynesení), jsou
upravena jak pole, tak množiny.
Během hry, když má dojít
k výnosu karty, počítač vždy podle
pravidel hry posoudí vynositelnost jednotlivých karet,
které má hráč v ruce (Rozdani[Hrac]
)
a karty, které smí hráč vynést, umístí
do pole KartyVynesitelne
. Poté je
proveden výběr karty (za počítač hraje procedura UI
)
a je provedeno přihození karty.
Skóre
(trestné body) se sčítá na několika úrovních.
Během hry se průběžně oboduje každý štych –
mohou být přiděleny body buď za karty ve štychu
obsažené (červené, filky, bedrník),
nebo může být trestný štych jako takový
(první-poslední, všechny). Body se
sčítají do proměnné SkoreStych
.
U her desítky a kvarty je to poněkud jinak (body
jsou za karty, které hráči zůstanou v ruce na
konci hry, u desítek navíc jeden bod za každou
situaci, kdy je hráč na řadě, ale nemůže zahrát žádnou
kartu). Pro jednotlivé hráče se v průběhu dílčí
hry nasčítává skóre za hráčem
sebrané štychy do pole SkoreHra
,
indexovaného číslem hráče (tedy 0
až 3
). Po každé dílčí
hře se pak toto skóre připočítá k hodnotám
v poli SkoreCelkove
(kromě případu,
kdy hráč nesloží maturitu – pak dostává
8 bodů a ostatní hráči žádný, bez ohledu
na průběh hry).
Umělá inteligence je řešena vyhodnocením herní situace a následným obodováním vynesitelných karet podle vhodnosti jejich vynesení. Například: je-li ve štychu trestná karta, snaží se hráč hrát tak, aby jej nemusel vzít. Pokud ale vidí, že je to již nevyhnutelné, pokusí se alespoň zároveň zbavit některé ze svých nepříjemných karet (na trestných, ale třeba příliš vysokých). Každá hra má více či méně odlišná pravidla vyhodnocování situace; hry desítky a kvarty se hrají zcela jinak a mají tedy UI zcela zvlášť (a také dle mého názoru nejkvalitněji provedenou, ať už soudě podle pravidel pro ohodnocení karet nebo podle úspěšnosti při testování). U umělé inteligence jsem vycházel především z vlastní herní zkušenosti, ovšem s tím, že počítač si (na rozdíl od běžného lidského hráče) pamatuje veškeré vynesené karty.
Zdrojový kód
i komentáře jsou psané česky v kódování
CP852
- tak aby na OS Windows typicky
fungovala správně diakritika. Zároveň přikládám
soubor LORAbd.pas
, což je zdrojový
kód bez diakritiky (jinak je zcela totožný s LORA.pas
).
Názvy identifikátorů jsou voleny tak, aby co nejlépe
vystihovaly jejich význam (i za cenu někdy velmi dlouhých
názvů), jen někdy jsou voleny názvy obecnější
(i
, temp
, …),
zejména v případě, kdy mají pouze lokální
význam. Komentáře se snaží popisovat funkci
každé procedury, funkce nebo bloku kódu; dále
popisují význam některých identifikátorů.
Zejména pro účely
ladění program během svého běhu
vytváří textový soubor lora.log
s kopií některých výpisů na obrazovku. Jeho
formátování není zcela ideální,
přesto umožňuje bez větších problémů zpětně
rekonstruovat průběh celé hry. Dále je k dispozici
konstanta LADENI
, která, je-li
nastavena na true
, poskytuje některé
zajímavé informace (zejména výpis karet
všech hráčů a bodové ohodnocení karet
procedurou UI
). Další
podobnou konstantou je ZIVYHRAC
-
umožňuje, aby za živého hráče hrál počítač
(náhodně nebo pomocí UI). Také je k
dispozici procedura ok
,
která nedělá nic jiného, než že na místě
zavolání vypíše do konzole text „ok“.
Hodí se pro zjištění cesty běhu programu,
případně pro zjištění, kam až se program dostal,
než zhavaroval (takže by již pravděpodobně neměla být
potřebná).
Program je koncipován jako opensource a jeho finální verze bude zveřejněna na internetu.
K tvorbě a ladění programu byl použit freeware textový editor PSPad a kompilátor Free Pascal Compiler. Pravdila Lóry jsem čerpal z oficiální stránky Klubu Petasites (organizátora Národního mistrovství v Lóře). Dokumentace byla napsána v programu OpenOffice.org Writer.
Hra se spustí spuštěním souboru LORA
(typicky LORA.exe
).
Program se ovládá klávesami s čísly
0
až 9
podle
pokynů na obrazovce. Pokud takové pokyny nejsou zobrazeny,
znamená to, že program čeká na Vaše potvrzení,
než bude pokračovat v běhu – pravděpodobně čeká, až
si prohlédnete informace o průběhu hry zobrazené na
obrazovce. V takovém případě můžete stisknout pro
pokračování (téměř) libovolnou klávesu –
např. Enter, mezerník, nebo některou z číslicových
kláves.
Program Vám vždy nabídne pouze takové možnosti, které jsou v souladu s pravidly.
Vítězem hry se stává hráč s nejnižším počtem získaných bodů. Pokud se některý z hráčů rozhodl nahlásit čistou stovku, stává se vítězem hry, pokud má na konci Lóry přesně 100 bodů; pokud má jiný počet bodů, stává se naopak hráčem posledním.
barva (zároveň vyznačena barvou písma)
č – červené (červená)
k – kule (fialová)
z – zelené (zelená)
ž – žaludy (hnědá)
hodnota
7 – sedma
8 – osma
9 – devítka
X – desítka
S – spodek
F – filek (jinak také zvaný svršek)
K – král
E – eso
Pro další informace o pravidlech Lóry dopručuji prostudovat přiložený dokument:
případně jeho potenciálně aktualizovaný originál na adrese:
http://www.volny.cz/petasites/Pravidla_Lory.htm
© 2008 Rudolf Rosa <rur@seznam.cz>, 1.
ročník, zimní semestr, programování
(IP), prezenční bakalářské
studium
Matematicko-fyzikální fakulta Univerzita
Karlova v Praze