Anglická verze
logolink

< Zpět na seznam lekcí

Hra pexeso i (analýza)

AlgortimyObsah lekce:

  • Princip hry
  • Hlavní kroky programu
  • Definice datových typů (kartička, pexeso, hráči)
  • Program s definovanými datovými typy

Princip hry

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]

Hlavní kroky programu

  • Inicializace pexesa (nastavení hodnot (obrázků) kartiček) a jejich zamíchání
  • Inicializace hráčů (zadání počtu hráčů a jejich jmen)
  • Algoritmus hry - opakující se tahy hráčů dokud není konec hry

Definice datových typů

Náš program musí udržovat po celou dobu běhu hry následující informace:

  • Informace o kartičkách pexesa (Jaké informace o každé kartičce jsou potřeba?).
  • Informace o hráčích (Jaké informace o každém hráči jsou potřeba?).

Kartička pexesa

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ů:

  • otočená tak, že vidíme obrázek (tomuto stavu budeme říkat "otočená"),
  • otočená tak, že vidíme druhou stranu kartičky (nevidíme obrázek, ale stranu kartičky, která je pro všechny kartičky stejná) - (tomuto stavu budeme říkat "neotočená"),
  • některý z hráčů již otočil dvojici stejných kartiček a kartičky jsou tedy ze hry odstraněny mimo hrací pole (tomuto stavu budeme říkat "odebraná").

O každé kartičce musíme mít následující údaje:

  • Kde se kartička nachází (v rámci pole 6x6 kartiček).
  • Jaký obrázek obsahuje (obrázek 1-18).
  • V jakém ze tří stavů (otočená/neotočená/odebraná) kartička je.

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é:

  • obrazek - proměnná, která bude obsahovat informaci o tom, jaký obrázek je na dané kartičce pexesa. Bude se jednat o číslo z intervalu 1..18 - každý obrázek bude jednoznačně reprezentován číslem. Vzhledem k tomu, že obrázků nebude více než 18, pak vystačíme s datovým typem int.
  • viditelna - proměnná typu int. Pokud bude proměnná nabývat hodnoty 1, pak vidíme obrázek na kartičce (je ve hře otočena tak, že hráči vidí obrázek). V opačném případě (pokud bude mít hodnotu 0) je kartička otočena naopak - tzn. hráči vidí její odvrácenou stranu bez obrázku.
  • odebrana - tato proměnná je opět typu int, neboť má buď hodnotu 1 (v případě, že je ze hry již nějakým hráčem odebrána) nebo 0 v opačném případě.
Deklarace datového typu karticka
typedef struct {
int obrazek;
int viditelna;
int odebrana;
} karticka;

Pexeso

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.

Deklarace konstanty n rozměru pole pexeso
#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.

Deklarace proměnné p datového typu pexeso
karticka p[n][n];

Hráči

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:

  • Jméno - jednoznačný identifikátor hráče. Bude se jednat o pole datového typu char s rozměrem 255 (umožní tedy uložit až 255 znaků).
  • Skóre - počet uhodnutých dvojic kartiček. Bude datového typu int (skóre bude nabývat hodnot z intervalu 0-18).

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.

Deklarace datového typu hrac
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].

Deklarace konstanty maxhracu rozměru pole hraci
#define maxhracu 4

Využijeme datového typu pole a jeho jednorozměrné varianty.

Deklarace proměnné ph datového typu hrac
hrac ph[maxhracu];

Nyní máme všechny datové typy deklarovány a můžeme začít s psaním samotného programu.

Program s definovanými datovými typy

Vytvořme novou řádkovou aplikaci a do zdrojového kódu programu vložme všechny potřebné dekladarace datových typů.

První verze programu (jen datové typy)

#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;
}

webdesign, xhtml, css, php - Mgr. Michal Mikláš