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 struct nadeklarujeme následující proměnné:
typedef struct {
int obrazek;
int viditelna;
int odebrana;
} 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.
#define n 6
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.
karticka p[n][n];
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 struct vzhledem k tomu, že jeden hráč je reprezentován pomocí dvou hodnot.
typedef struct {
char jmeno[255];
int skore;
} hrac;
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].
#define maxhracu 4
Využijeme datového typu pole a jeho jednorozměrné varianty.
hrac ph[maxhracu];
Nyní máme všechny datové typy deklarovány a můžeme začít s psaním samotného programu.
Vytvořme novou řádkovou aplikaci a do zdrojového kódu programu vložme všechny potřebné dekladarace datových typů.
#include "stdafx.h"
#define n 6
#define maxhracu 4
typedef struct {
int obrazek;
int viditelna;
int odebrana;
} karticka;
typedef struct {
char jmeno[255];
int skore;
} hrac;
int _tmain(int argc, _TCHAR* argv[])
{
karticka p[n][n];
hrac ph[maxhracu];
fflush(stdin);
getchar();
return 0;
}