Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.


Info

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

  • Práca s 2R poľom



Info

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

[1] KPI-FEI-TUKE: 

[2] KPI-FEI-TUKE: 

[3]  

[4]  


Úloha 1

Naprogramujte hru "piškvorky" . 

Vstupné predpoklady: 

  • Veľkosť hracieho poľa je statická 5 x 5 prvkov
  • Informácie o polohe piškôriek 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á nulamy!
  • 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 


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

Code Block
languagecpp
#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 bude funkcia pre krok 1. alebo 2. hráča player_move()
 }
return 0;
}

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

Vykreslenie hracieho poľa môžete skúšať na takto inicializovanom hracom poli 

Code Block
languagecpp
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, 1 },
                    {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:

Code Block
languagebash
+-------------------+
|   |   | X |   |   |
+-------------------+
| O |   |   |   |   |
+-------------------+
| X | O |   |   |   |
+-------------------+
|   |   | X |   | X |
+-------------------+
|   |   | O | O |   |
+-------------------+



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

Code Block
languagecpp
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 pozícia je z rozsahu hracej plochy           
            //  a či už nie je obsadená alebo aj či je zadané číslo a podobne ... 
    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:

Code Block
languagebash
+-------------------+
|   |   | X |   |   |
+-------------------+
| O |   |   |   |   |
+-------------------+
| X | O |   |   |   |
+-------------------+
|   |   | X |   | X |
+-------------------+
|   |   | O | O |   |
+-------------------+

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

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

Next position (i j) for Player_2 >>




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

Code Block
languagecpp
// 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 *** P%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:

Code Block
languagebash
Next position (i j) for Player_1 >> 1 1

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

 *** P1 - WON ***