Info |
---|
Ciele cvičeniaCvič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í.
|
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
- Inicializácia hracieho poľa
- Vytvorenie funkcie pre vykreslenie hracieho poľa
- Vytvorenie funkcie pre načítanie kroku hráča
- Vytvorenie funkcie pre vyhodnotenie či niektorý z hráčov vyhral
1. míľnik - kostra programu
Code Block | ||
---|---|---|
| ||
#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 | ||
---|---|---|
| ||
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 | ||
---|---|---|
| ||
+-------------------+ | | | X | | | +-------------------+ | O | | | | | +-------------------+ | X | O | | | | +-------------------+ | | | X | | X | +-------------------+ | | | O | O | | +-------------------+ |
3. míľnik - Načítanie kroku hráča
Code Block | ||
---|---|---|
| ||
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 | ||
---|---|---|
| ||
+-------------------+ | | | 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 >> |
3. míľnik - Vyhodnotenie či niektorý z hráčov vyhral
Code Block | ||
---|---|---|
| ||
// 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 | ||
---|---|---|
| ||
Next position (i j) for Player_1 >> 1 1
+-------------------+
| | O | X | | |
+-------------------+
| O | X | | | |
+-------------------+
| X | O | X | | |
+-------------------+
| | | X | | X |
+-------------------+
| | | O | O | |
+-------------------+
*** P1 - WON ***
|