Anglická verze
logolink

< Zpět na seznam lekcí

Hra piškvorky I

AlgortimyObsah lekce:

  • Princip hry
  • Algoritmus - Hlavní kroky programu
  • Inicializace pole
  • Zobrazení stavu hry
  • Zadání délky posloupnosti pro výhru
  • Zadání jmen hráčů

Princip hry

Piškvorky jsou strategická hra, ve které spolu soupeří dva hráči. Nejčastěji se hraje na čtverečkovaném papíře, na kterém se hráči střídají v kreslení křížku/kolečka. Vyhrává hráč, který jako první vytvoří nepřerušenou řadu pěti svých značek. [http://cs.wikipedia.org/wiki/Piškvorky]

Algoritmus - hlavní kroky programu

  • Inicializace hrací plochy (nalezněte na Internetu význam slova inicializace).
  • Zadání délky výherní posloupnosti.
  • Zadání jmen hráčů.
  • Opakující se tahy hráčů dokud není konec hry. Ty by se daly popsat takto:
  • Hráč 1 zvolí řádek a sloupec pro svůj znak a ten se umístí.
  • Hráč 2 zvolí řádek a sloupec pro svůj znak a ten se umístí.
  • Hráč 1 zvolí řádek a sloupec pro svůj znak a ten se umístí.
  • ...
  • Tahy hráčů se opakují, dokud není konec hry (ten nastane v případě, že hráč vytvoří posloupnost kamenů dané délky nebo...?).

Proměnné a datové typy

Náš program potřebuje pro svůj běh uchovávat informace. K tomuto účelu slouží proměnné. Zvažme nejprve vše, co potřebujeme mít v programu uloženo.

Hrací plochu (náš imaginární čtverečkovaný papír) - tato plocha bude reprezentována dvojrozměrným polem mxn polí (pokud bychom hráli hru pouze ve standardním textovém režimu v konzoli Windows, tak musíme uvažovat +- standardně zobrazený počet řádků a sloupců - zjistěte, kolik řádků a sloupců má standardně konzolové okno po spuštění programu). K zadání pevného a v programu neměnného rozměru pole poslouží konstanty radku a sloupcu. Poslední otázka, kterou zbývá zodpovědět je: "Jakého datového typu naše pole bude?". Abychom dokázali odpovědět, tak musíme uvážit, co přesně potřebujeme do pole uložit. V jakém stavu se může jedno políčko hrací plochy nacházet?

  • 1. Na hracím poli nic není (je prázdné).
  • 2. Na hracím poli je umístěn symbol prvního hráče (zpravidla kolečko).
  • 1. Na hracím poli je umístěn symbol druhého hráče (zpravidla křížek).

Potřebujeme tedy takový datový typ, do které jsme schopni uložit tři různé znaky (křížek - například velké písmeno X, kolečko - například velké písmeno O a nakonec znak pro označení prázdného políčka - zvolte a vyzkoušejte nějaký alfanumerický znak označující prázdné políčko hrací plochy). Pro tyto účely se nejlépe hodí datový typ char (umožňuje uložit právě jeden alfanumerický znak).

V následujícím rámečku vidíme deklaraci dvou konstant, datového typu pole a proměnné p datového typu piskvorky.

Deklarace proměnných a datových typů
#include "stdafx.h"
#define radku 20
#define sloupcu 70

int _tmain(int argc, _TCHAR* argv[])
{
    char p[radku][sloupcu];

    ...

    return 0;
}

Inicializace hrací plochy

Pro naši hru uvažujme plochu o rozměrech radkuxsloupcu (celkem mxn políček). Inicializaci hrací plochy provedeme nastavením všech hodnot ve všech jejich políčcích na znak tečka ´.´, který znamená prázdné políčko. Proměnná radek obsahuje číslo aktualního řádku a proměnná sloupec číslo aktualního sloupce.

Inicializace hrací plochy
for (radek = 0; radek < radku; radek++)
{
  for (sloupec = 0; sloupec < sloupcu)
  {
    p[radek][sloupec]='.';
  }
}

Zobrazení stavu hry

Ke zobrazení stavu hry stačí vypsat pole na obrazovku.

Zobrazení stavu hry
for (radek = 0; radek < radku; radek++)
{
  for (sloupec = 0; sloupec < sloupcu)
  {
    printf("%c",p[radek][sloupec]);
  }
  printf("\n");
}

Zadání délky posloupnosti pro výhru

Ve hře piškvorky vítězí ten, kdo jako první vytvoří na hrací ploše v libovolném ze čtyř směrů posloupnost svých symbolů. Otázkou zůstává jak dlouhá taková posloupnost musí být (zpravidla se hraje na posloupnost o délce 5, ale my hráčům umožníme zvolit 5, 4 nebo 3). Tento parametr si uživatel zvolí ještě před začátkem hry. K tomuto účelu vytvoříme proměnnou, která bude uchovávat jedno ze tří povolených čísel. Jaký datový typ pro proměnnou zvolíme a jak zajistíme, aby se v ní nacházela jedna z povolených hodnot? Jak se bude proměnná jmenovat (říká se, že vhodné pojmenování proměnné je mnohdy těžší úkol než napsat část programu, která ji využívá:).

Až odpovíme na všechny otázky z předhozího odstavce, tak se podívejme na jedno z možných řešení níže.

Zadání proměnné pro délku výherní posloupnosti
int vyhra;
...
vyhra=0;
while ((vyhra < 3) || (vyhra > 5))
{
  fprintf("Zadejte pocet kamenu pro vyhru (3, 4 nebo 5) :");
  fscanf("%d",&vyhra);
  if ((vyhra < 3) || (vyhra > 5)) printf("Nezadal jste spravny pocet kamenu!");
}

Program

Podívejme se nyní, jak by vypadal náš program jako celek. Program je obohacen o možnost, že si uživatel může sám zadat počet políček hrací plochy (pocetradku, pocetsloupcu).

Celý program
#include "stdafx.h"
#define radku 20
#define sloupcu 70

int _tmain(int argc, _TCHAR* argv[])
{
  char p[radku][sloupcu];
  int radek, sloupec, pocetradku, pocetsloupcu, vyhra;
  char hrac1[50], hrac2[50];

  pocetradku=0;
  pocetsloupcu=0;

  while ((pocetradku) < 1) || ((pocetradku) > (radku))
  {
    printf("Zadejte pocet radku hraci plochy 1 - %d:",radku);
    scanf("%d",&pocetradku);
    if ((pocetradku) < 1) || ((pocetradku) > (radku)) printf("Zadali jste spatny pocet radku!");
  }

  while ((pocetsloupcu) < 1) || ((pocetsloupcu) > (sloupcu))
  {
    printf("Zadejte pocet sloupcu hraci plochy 1 - ',sloupcu,':');
    scanf("%d",&pocetsloupcu);
    if ((pocetsloupcu) < 1) || ((pocetsloupcu) > (sloupcu)) printf("Zadali jste spatny pocet sloupcu.");
  }

  vyhra=0;

  while ((vyhra < 3) || (vyhra > 5))
  {
    fprintf("Zadejte pocet kamenu pro vyhru (3, 4 nebo 5) :");
    fscanf("%d",&vyhra);
    if ((vyhra < 3) || (vyhra > 5)) printf("Nezadal jste spravny pocet kamenu!");
  }

  for (radek = 0; radek < radku; radek++)
  {
    for (sloupec = 0; sloupec < sloupcu)
    {
      p[radek][sloupec]='.';
    }
  }

  printf("Zadejte prosim jmeno hrace c.1:");
  scanf("%s",&hrac1);
  printf("\n");
  printf("Zadejte prosim jmeno hrace c.2:");
  scanf("%s",&hrac2);

  for (radek = 0; radek < radku; radek++)
  {
    for (sloupec = 0; sloupec < sloupcu)
    {
      printf("%c",p[radek][sloupec]);
    }
    printf("\n");
  }
  fflush(stdin);
  getchar();
}

Domácí úkol

Ošetřete zadání jmen hráčů tak, aby uživatel musel zadat jména hráčů tak, aby byla jména různá a měla délku alespoň dva znaky (nápověda: pokuste se využít funkce strlen z hlavičkového souboru string.h).

Další čtení

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