Anglická verze
logolink

< Zpět na seznam lekcí

Hra piškvorky II

AlgortimyObsah lekce:

  • Zadání jmen hráčů
  • Tah hráče
  • Průběh hry (tahy hráčů)

Zadání jmen hráčů

Zadání jmen hráčů - pokuste se sami navrhnout potřebné datové struktury pro uložení potřebných informací o hráčích (budeme uvažovat standardní dva hráče). Tento krok je velmi jednoduchý. Stačí pouze vytvořit dvě pole (hrac1, hrac2) typu char pro uložení řetězce (velikost pole značí, kolik znaků můžeme v řetězci použít. Je však nutné zohlednit fakt, že poslední znak je vyhrazen pro ukončení řetěžce. Do řetězce o délce 50 znaků tedy můžeme uložit maximálně 49 vlastních znaků) - jména hráče. Uživatel do nich jen zadá požadovaná jména.

Inicializace hrací plochy
char hrac1[50], hrac2[50];
...
printf("Zadejte prosim jmeno hrace c.1:");
scanf("%s", &hrac1);
printf("\n");
printf("Zadejte prosim jmeno hrace c.2:");
scanf("%s", &hrac2);

Tah hráče

Tah hráče znamená, že zvolí pozici, kam chce umístit svůj kámen. Je tedy nutno zadat souřadnice r, s nějakého prvku pole. Souřadnice budou reprezentovány dvěma proměnnými r, s typu int (předpokládáme, že nám tento datový typ bude dostačovat).

Tah hráče
printf("Zadejte cislo radku: ");
scanf("%d, &r);
printf("Zadejte cislo sloupce: ");
scanf("%d, &s);

Je nutno myslet na to, že hráč může do r a do s zadat libovolné číslo typu int. Co to znamená?

Především musíme ošetřit situaci, kdy by hráč zadal pozici (r,s) mimo rozměr pole (hrací plochy). Měli bychom před zadáním zobrazit upozornění, aby hráč zadal správné souřadnice.

Tah hráče
printf("Souradnice radku musi byt od 1 do %d.",pocetradku);
printf("radek: ");
scanf("%d, &r);
printf("Souradnice sloupce musi byt od 1 do %d.\n",pocetsloupcu);
printf("sloupec: ");
scanf("%d, &s);

Uvědomme si, že k umístění kamene nestačí pouze to, že se kamenem "trefíme" na hrací plochu. Ještě je třeba zajistit to, že kámen vložíme do hrací plochy pouze, pokud je pole pro vložení volné (neobsazené jiným kamenem - pokusili bychom se vlastně "přepsat" existující kámen naším). Rozšíříme tedy upozornění pro uživatele a samostatně doplňte podmínku, která ověří, že je dané pole volné (a jen v tomto případě se kámen skutečně umístí).

Tah hráče
printf("Souradnice radku musi byt od 1 do %d a zadana pozice musi byt volna.",pocetradku);
printf("radek: ");
scanf("%d, &r);
printf("Souradnice sloupce musi byt od 1 do %d a zadana pozice musi byt volna.\n",pocetsloupcu);
printf("sloupec: ");
scanf("%d, &s);

Průběh hry (tahy hráčů)

Vzpomeňme si na to, co se bude během hry v krocích dít:

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

Vidíme, že se jedná o cyklus - opakující se kroky - dokud nenastane konec hry (tedy nastane stav, kdy bude splněna nějaká podmínka, která říká, že je konec hry). Pro tuto situaci se nejlépe hodí univerzální cyklus while (dokud je splněna nějaká podmínka, tak opakuj ... dokud není konec hry, tak opakuj tahy hráčů).

Podmínka pro konec hry může být složitá a bylo by nepraktické ji celou psát do hlavičky while cyklu. Pomůžeme si tím, že deklarujeme proměnnou konec datového typu int, kterou nastavíme na 0 (není konec hry) a změníme ji na 1 v případě, že program vyhodnotí, že konec hry nastal.

Přidání while cyklu
konec=0;
while (konec==0)
{

}

Poslední, co musíme vyřešit před testem na konec hry, je střídání hráčů. Během hry tedy musíme vědět zda hraje hráč 1 nebo hráč 2 a jaký typ kamene se tedy v případě položení kamene umístit (křížek nebo kolečko).

Deklarujeme proměnnou char typkamene, která bude obsahovat buď znak kolečko 'O' nebo křížek 'X'. Před začátkem cyklu while nastavíme tuto proměnnou například na hodnotu 'X'.

Přidání proměnné s typem kamene
konec=0;
typkamene='X';
while (konec==0)
{

}

Do cyklu dosadíme instrukce pro vložení kamene na zadanou pozici [r][s] kámen umístíme pomocí příkazu p[r][s]=typkamene. Na závěr si pole vypíšeme na obrazovku.

Zobrazení stavu hry
konec=0;
typkamene='X';
while (konec==0)
{
  printf("Zadej radek pro kamen: (1 - %d)",pocetradku);
  scanf("%d",&r);
  while ((r > pocetradku) || (r < 1))
  {
    if ((r > pocetradku) || (r < 1))
    {
      printf("Zadal jste radek mimo hraci plochu.\n");
      printf("Zadej radek pro kamen: (1 - %d)",pocetradku);
      scanf("%d", &r);
    }
  }

  printf("Zadej sloupec pro kamen: (1 - %d)",pocetrsloupcu);
  scanf("%d",&s);
  while ((s > pocetrsloupcu) || (s < 1))
  {
    if ((s > pocetrsloupcu) || (s < 1))
    {
      printf("Zadal jste sloupec mimo hraci plochu.\n");
      printf("Zadej sloupec pro kamen: (1 - %d)",pocetrsloupcu);
      scanf("%d", &s);
    }
  }

  p[r][s]=typkamene;

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

Na konec cyklu přidáme ještě příkaz na změnu typu kamene v důsledku vystřídání hráčů.

Tah hráče
if (typkamene=='X') typkamene='O';
  else typkamene='X';

Domácí úkol

Pokuste se napsat část programu pro vyhodnocení konce hry na jednoduché hrací ploše rozměru 3x3. Konec hry nastane v momentě, kdy budou někde v poli 3 stejné prvky vedle sebe (ať už horizontálně, vertikálně nebo diagonálně).

Další čtení

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