Ciele cvičenia

Cvičenie bude zamerané na prácu s dvojrozmerným (2R) poľom. Študenti si osvoja spôsob deklarácie a inicializácie 2R poľa a tiež si prehĺbia poznanie v problematike indexácie polí.  Druhá časť cvičenia sa zameriava na prácu s reťazcami.  

Odporúčaná literatúra a dôležité odkazy

[1] KPI-FEI-TUKE: Prednáška č. 7

[2] KPI-FEI-TUKE: Cvičenie č. 7


Úloha 1

Naprogramujte hru "piškvorky" . 

  • Veľkosť hracieho poľa je statická 5 x 5 prvkov
  • Informácie o polohe piškvoriek sú uložené v matici (2R pole) typu int takto:
    • 0 - prázdna bunka
    • 1 - Hráč č. 1 → X
    • 2 - Hráč č. 2 → O
  • Matica polohy piškvoriek je inicializovaná nulami!
  • Vykreslenie hracej plochy vykonáva samostatná funkcia, jej vstupným parametrom je matica polohy piškvoriek
  • Hra bude bežať v slučke while dovtedy, dokiaľ jeden z hráčov nevyhrá
  • Po každom ťahu hráča, sa vykreslí hracie pole 

Úloha 1.1 (Pre nadšencov)

  • Vytvorte algoritmus, ktorý bude simulovať jedného z hráčov tak, aby bol úctyhodným súperom.  

Dôležité míľniky v procese developmentu

  1. Inicializácia hracieho poľa
  2. Vytvorenie funkcie pre vykreslenie hracieho poľa
  3. Vytvorenie funkcie pre načítanie kroku hráča
  4. Vytvorenie funkcie pre vyhodnotenie či niektorý z hráčov vyhral 


1. míľnik  -  kostra programu

Nasledujúci kód predstavuje kostru programu. Vo vrchnej časti sú uvedené deklarácie funkcií, ktorých definície je potrebné naprogramovať. Slučku while je v začiatočnej fáze vývoja potrebné zakomentovať a vrátiť sa k nej až keď budú hotové všetky potrebné funkcie. 

#include <stdio.h>

// deklarácie funkcii
int is_won(const int size, const int player, const int grid[][size]);
void draw(const int size, const int grid[][size]);
void player_move(const int size, const int player, int grid[][size]);

int main()
{
  int size = 5;
  int player=1;

  int i, j;
  int grid[size][size];
  for(i=0; i<size; i++)
    for(j=0; j<size; j++)
    {
     grid[i][j] = 0;
    }
 draw(size, grid);
   
 while(1)
 { 

  if (is_won(5, 1, grid) ||  is_won(5, 2, grid)) // Ukončenie nekonečného cyklu. Funkciu is_won() je potrebné vyvinúť
     break;
  // tu sa bude volať funkcia pre vykreslenie hracieho poľa draw()
  // tu sa bude volať funkcia pre krok 1. alebo 2. hráča player_move()
 }
return 0;
}

2. míľnik  -  Vykreslenie hracieho poľa

Vykreslenie hracieho poľa je možné skúšať na takto inicializovanom hracom poli. Tato inicializácia je vhodná počas celého procesu vývoja programu. Ak bude všetko hotové, je potrebné nenulové prvky poľa nahradiť nulou.   

void draw(const int size, const int grid[][size]);
int main()
{
  int size = 5;
  int player=1;
  int grid[size][size] ={ 
                    {0 , 0, 1, 0, 0 },
                    {2 , 0, 0, 0, 0 },
                    {1 , 2, 0, 0, 0 },
                    {0 , 0, 1, 0, 0 },
                    {0 , 0, 2, 2, 0 },
                  };
  draw(size, grid);
  return 0;
}
void draw(const int size, const int grid[][size])
{
 // tu bude kód pre implementáciu funkcie
}


Výsledok funkcie draw(const int size, const int grid[][size]) môže vyzerať takto:

+-------------------+
|   |   | X |   |   |
+-------------------+
| O |   |   |   |   |
+-------------------+
| X | O |   |   |   |
+-------------------+
|   |   | X |   |   |
+-------------------+
|   |   | O | O |   |
+-------------------+


3. míľnik  -  Načítanie kroku hráča

void player_move(const int size, const int player, int grid[][size])
{
  int i, j;
  printf("\n\n Next position (i j) for Player_%d >> ", player);
  scanf("%d %d", &i, &j); // scanf-om môžeme načítať aj niekoľko hodnôt naraz
  if( ... ) // tu je potrebné overiť, či zadaná pozícia je z rozsahu hracej plochy           
            // a či už nie je obsadená
    grid[i][j] = player; // player - hráč 1 alebo 2
  else 
    printf("\nWrong Entry");
}

Výsledok funkcie player_move(const int size, const int player, int grid[][size]) môže vyzerať takto:

+-------------------+
|   |   | X |   |   |
+-------------------+
| O |   |   |   |   |
+-------------------+
| X | O |   |   |   |
+-------------------+
|   |   | X |   |   |
+-------------------+
|   |   | O | O |   |
+-------------------+

 Next position (i j) for Player_1 >> 2 2

+-------------------+
|   |   | X |   |   |
+-------------------+
| O |   |   |   |   |
+-------------------+
| X | O | X |   |   |
+-------------------+
|   |   | X |   |   |
+-------------------+
|   |   | O | O |   |
+-------------------+

Next position (i j) for Player_2 >>


4. míľnik  -  Vyhodnotenie či niektorý z hráčov vyhral

// funkcia vráti 0 ak nikto nevyhral a 1 ak vyhral jeden z hráčov
int is_won(const int size, const int player, const int grid[][size])
{
 int i, j;
 // Je potrebné prejsť celým hracím poľom a vyhodnotiť víťazné situácie 
 for(i=0; i<size; i++)
  {  
    for(j=0; j<size; j++)
    {
      if(grid[i][j] == player  && j<size-2)
       {       
         if( ... ) // Tu bude veľa podmienok. Overia sa okolité prvky, ktoré sú z rozsahu hracej plochy 
             {       
               printf("\n *** Player_%d - WON *** \n",player);  
               return 1; 
             }                
       }
     }
  } 
  return 0;
}

Výsledok funkcie is_won(const int size, const int player, const int grid[][size]) po úspešnom kroku hráča č. 1(X) môže vyzerať takto:

Next position (i j) for Player_1 >> 1 2

+-------------------+
|   | O | X |   |   |
+-------------------+
| O |   | X |   |   |
+-------------------+
| X | O | X |   |   |
+-------------------+
|   |   | X |   |   |
+-------------------+
|   |   | O | O |   |
+-------------------+

 *** Player_1 - WON ***

Wild tic-tac-toe - Wikipedia

  • No labels