Obsah lekce:
Pexeso je karetní hra pro nejméně dva hráče zaměřená na paměť a soustředění. Její původní název je Memory, název PEXESO je české zkratkové slovo vzniklé ze sousloví PEKELNĚ SE SOUSTŘEĎ. Hraje se speciální sadou karet. Balíček se skládá ze sudého počtu, nejčastěji 64 karet, které tvoří dvojice. Cílem hry je nalézt co nejvíce dvojic.
Předchůdce Pexesa bychom mohli najít v tradiční japonské hře se škeblemi zvané Kai awase (Nejedná se přímo o karetní hru, ale určitě se dá považovat za její předchůdkyni. Při této hře, bylo úkolem účastníků, vyhledávat z hromádky škeblí dvě poloviny, které patřily k sobě. Později se na vnitřní stranu malovaly obrázky. Takže takové pexeso ze škeblí.).
Karty se zamíchají a rozloží lícem dolů tak, aby žádný z hráčů neznal rozložení karet. Hráči postupně otáčí dvojici karet lícem vzhůru, aby je viděli i ostatní hráči. Pokud karty patří k sobě, hráč je odebere a otáčí další dvojici (lze hrát i variantu, ve které i po nalezení shodné dvojice pokračuje další hráč v pořadí). Pokud karty k sobě nepatří, otočí je zpět lícem dolů a pokračuje další hráč v pořadí. Hraje se tak dlouho, dokud nejsou všechny karty rozebrány. Vítězem se stane hráč s největším počtem nalezených dvojic. [http://cs.wikipedia.org/wiki/Pexeso]
Náš program musí udržovat po celou dobu běhu hry následující informace:
Shrňme si základní informace o kartičkách pexesa. Kartiček je zpravidla 36 a tvoří čtvercové schéma 6x6 kartiček. Jak takové kartičky reprezentovat? Ideální obdélníkovou strukturou poskytuje datový typ pole velikosti 6x6 polí.
Každá kartička pexesa obsahuje obrázek (vždy právě dvě kartičky mají stejný obrázek). Celkem máme 18 různých obrázků. V jakých situacích se může kartička nacházet? Každá z kartiček se může nacházet v jednom ze tří stavů:
O každé kartičce musíme mít následující údaje:
Otázkou tedy je: Jaký datový typ zvolíme pro každý prvek pole (kartičku), abychom do něj mohli uložit všechny potřebné informace o každé kartičce pexesa. Existuje nějaký datový typ, který dovoluje uložit tři různé údaje o každé kartičce?
Datovým typem naší kartičky bude datový typ record, který může obsahovat jedné proměnné několik dalších proměnných. V rámci proměnné karticka typu record nadeklarujeme následující proměnné:
karticka = record
obrazek:byte;
viditelna:boolean;
odebrana:boolean;
end;
Celé pexeso se skládá ze 36 kartiček. Potřebujeme tedy datovou strukturu, do které bude možné všech 36 kartiček uložit. Využijeme datového typu pole a jeho dvourozměrné varianty.
pexeso = array[1..n,1..n] of karticka;
Není vyloučeno, že bychom chtěli v budoucnu rozměr pexesa měnit. Je proto lépe nadefinovat v hlavičce programu konstantu n. To nám v případě potřeby umožní změnit velikost celého pole na jinou hodnotou jedinou úpravou programu (na jediném místě). V dalším textu budeme předpokládat, že n bude vždy menší nebo rovno 6.
const n=6;
Abychom mohli tento definovaný datový typ pexeso používat v našem programu, pak je ještě nutno deklarovat proměnnou datového typu pexeso. Tuto proměnnou nazveme například p.
var p:pexeso;
Pexeso hrají zpravidla 2-4 hráči. Program tedy musí umožňovat uchovat informace o libovolném počtu hráčů z tohoto intervalu. Opět se nejprve zamysleme nad tím jaké informace potřebujeme o každém hráči uchovat:
Protože nevíme, kolik přesně hráčů bude hrát, tak opět využijeme datové struktury pole. Do takového pole budeme moci uložit informace až o 4 hráčích. Každý prvek pole bude opět typu record vzhledem k tomu, že jeden hráč je reprezentován pomocí dvou hodnot.
Datovým typem každého hráče bude record, který může obsahovat jedné proměnné několik dalších proměnných. V rámci proměnné hrac typu record nadeklarujeme následující proměnné:
V hlavičce nadefinujeme konstantu maxhracu. To nám v případě potřeby umožní změnit velikost celého pole na jinou hodnotou jedinou úpravou programu (na jediném místě). V dalším textu budeme předpokládat, že maxhracu bude vždy z intervalu [2-4].
const maxhracu=4;
Využijeme datového typu pole a jeho jednorozměrné varianty.
hraci=array[1..maxhracu]of hrac;
Abychom mohli tento definovaný datový typ hrac používat v našem programu, pak je ještě nutno deklarovat proměnnou datového typu hraci. Tuto proměnnou nazveme například ph (pole hráčů).
var ph:hraci;
Nyní máme všechny datové typy deklarovány a můžeme začít s psaním samotného programu.
Vytvořme v Delphi novou řádkovou aplikaci a do zdrojového kódu programu vložme všechny potřebné dekladarace datových typů (nezapomeňte na fakt, že název programu musí být odlišný od libovolného jména proměnné - nesmí tedy být například "pexeso", protože tak je pojmenován datový typ pole s pexesem).
program pexeso3po;
{$APPTYPE CONSOLE}
uses
SysUtils;
const
n=6;
maxhracu=4;
type
karticka = record
obrazek:byte;
viditelna:boolean;
odebrana:boolean;
end;
hrac = record
jmeno:string;
skore:byte;
end;
hraci=array[1..maxhracu]of hrac;
pexeso=array[1..n,1..n]of karticka;
var p:pexeso;
ph:hraci;
begin
{ TODO -oUser -cConsole Main : Insert code here }
readln;
end.