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 record 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 byte.
  • viditelna - proměnná typu boolean. Pokud bude proměnná nabývat hodnoty true, 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ě 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 boolean, neboť má buď hodnotu true (v případě, že je ze hry již nějakým hráčem odebrána) nebo false v opačném případě.
Deklarace datového typu karticka
karticka = record
obrazek:byte;
viditelna:boolean;
odebrana:boolean;
end;

Pexeso

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 datového typu pole pexeso
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.

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

Deklarace proměnné p datového typu pexeso
var p:pexeso;

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 datového typu string (umožní tedy uložit až 255 znaků).
  • Skóre - počet uhodnutých dvojic kartiček. Bude datového typu byte (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 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é:

Deklarace datového typu hrac
hrac = record
jmeno:string;
skore:byte;
end;

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
const maxhracu=4;

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

Deklarace datového typu pole hraci
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áčů).

Deklarace proměnné ph datového typu hraci
var ph:hraci;

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 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).

První verze programu (jen datové typy)

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.

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