pvjc22/final/game.c

200 lines
8.6 KiB
C
Raw Normal View History

2022-06-05 14:02:35 +00:00
#include <curses.h> //pripoj<6F>m potrebn<62> kni<6E>nice
#include <stdlib.h>
#include <string.h>
#include "world.h"
#include "game.h"
#define DLZKA_HLASENIA 500 //zadefinujem maxim<69>lnu d<><64>ku hl<68>senia
void* inicializaciaHry() { //vytvor<6F>m funkciu pre prvotn<74> inicializ<69>ciu hry
struct hra* hra = (struct hra*) malloc(sizeof(struct hra)); //nainicializujem riadiacu <20>trukt<6B>ru pre cel<65> hru
hra->vyskaPolicka = (LINES / 10); //nainicializujem jednotliv<69> prvky <20>trukt<6B>ry
hra->sirkaPolicka = (COLS / 10);
hra->pocetPolicokX = 4;
hra->pocetPolicokY = 6;
hra->poslednePolickoX = (COLS / 10) * hra->pocetPolicokX; //vypo<70><6F>tam koncov<6F> s<>radnice hracieho po<70>a v osi X a Y
hra->poslednePolickoY = (LINES / 10) * hra->pocetPolicokY;
hra->celkovyPocetPolicok = hra->pocetPolicokX * hra->pocetPolicokY;
hra->hraciePole = dvojrozmernePole(hra->pocetPolicokY, hra->pocetPolicokX);
hra->hrac1 = 'X';
hra->hrac2 = 'O';
hra->aktualnyHrac = hra->hrac1;
hra->nasledujuciHrac = hra->hrac2;
int cisloPolicka = 1, i, j;
for (i = 0; i < hra->pocetPolicokY; i++) {
for (j = 0; j < hra->pocetPolicokX; j++) {
hra->hraciePole[i][j] = cisloPolicka; //nainicializujem hracie poli pozi<7A>n<EFBFBD>mi <20><>slami
cisloPolicka++;
}
}
return hra;
}
void vykreslenieHry(struct hra* hra) { //funkcia vykresl<73> aktu<74>lny stav hry
int i, j;
clear(); //vy<76>ist<73>m predch<63>dzaj<61>ci pl<70>n hry
for (i = 0; i < hra->poslednePolickoY + hra->vyskaPolicka; i += hra->vyskaPolicka) {
for (j = 0; j < hra->poslednePolickoX; j++) set_cell('-', j, i); //nakresl<73>m hranice pl<70>nu na osi X
}
for (i = 0; i < hra->poslednePolickoX + hra->sirkaPolicka; i += hra->sirkaPolicka) {
for (j = 0; j < hra->poslednePolickoY; j++) set_cell('|', i, j); //nakresl<73>m hranice pl<70>nu na osi Y
}
int k, l; //zadeklarujem premenn<6E> pre riadenie v<>pisu z hern<72>ho po<70>a
for (j = 0, l = 0; j < hra->poslednePolickoY; j += hra->vyskaPolicka, l++) { //v r<>mci hern<72>ho pl<70>nu je potrebn<62> pos<6F>va<76> sa aj v r<>mci osi Y, za<7A>iatok je v prvej polovici pol<6F><6C>ka a pos<6F>va sa o jedno pol<6F><6C>ko
for (i = 0, k = 0; i < hra->poslednePolickoX; i += hra->sirkaPolicka, k++) { // po<70>iatok vykres<65>ovania je v polovici prv<72>ho pol<6F><6C>ka hern<72>ho pl<70>nu v osi X, pl<70>n sa pos<6F>va o jedno pol<6F><6C>ko
/*index prv<72>ho hr<68><72>a: -5
index druh<EFBFBD>ho hr<EFBFBD><EFBFBD>a: -6*/
if (hra->hraciePole[l][k] == -5) mvprintw(j + hra->vyskaPolicka / 2, i + hra->sirkaPolicka / 2, "%c", hra->hrac1); //ak sa namiesto p<>sla pol<6F><6C>ka nach<63>dza na pr<70>slu<6C>nej poz<6F>cii index prv<72>ho hr<68><72>a, tak na jeho miesto vykresl<73>m znak prv<72>ho hr<68><72>a
else if (hra->hraciePole[l][k] == -6) mvprintw(j + hra->vyskaPolicka / 2, i + hra->sirkaPolicka / 2, "%c", hra->hrac2); //ak sa namiesto p<>sla pol<6F><6C>ka nach<63>dza na pr<70>slu<6C>nej poz<6F>cii index druh<75>ho hr<68><72>a, tak na jeho miesto vykresl<73>m znak druh<75>ho hr<68><72>a
else mvprintw(j + hra->vyskaPolicka / 2, i + hra->sirkaPolicka / 2, "%d", hra->hraciePole[l][k]);
}
}
mvprintw(LINES - (2 * (LINES / 10)), 10, "Aktualny hrac: %c", hra->aktualnyHrac); //zobraz<61>m aktu<74>lneho hr<68><72>a
mvprintw(LINES - (2 * (LINES / 10)) + 1, 10, "Zadajte cislo neobsadeneho policka: "); //hl<68><6C>kou vyzvem hr<68><72>a na zadanie <20><>sla pol<6F><6C>ka
refresh(); //vyobraz<61>m novovygenerovan<61> pl<70>n hry
}
int hernaSlucka(struct event* udalost, void* hra) { //funkcia je riadiaca <20>trukt<6B>ra pre kni<6E>nicu world
struct hra* vstupneData = (struct hra*) hra; //vstupn<70> <20>trukt<6B>ru pre hru prevediem na pr<70>slu<6C>n<EFBFBD> d<>tov<6F> typ
stavPolicka(vstupneData, udalost->key); //zmen<65>m stav hern<72>ho pl<70>nu
zmenaHraca(vstupneData); //zmen<65>m hr<68><72>a
vykreslenieHry(vstupneData); //a nakoniec vykresl<73>m aktu<74>lny stav hry
vertikalneVytvoreniePiskvorky(hra); //skontrolujem, <20>i je pi<70>kvorka vytvoren<65>
horizontalneVytvoreniePiskvorky(hra);
krizoveVytvoreniePiskvorkyZlava(hra);
krizoveVytvoreniePiskvorkySprava(hra);
return 0;
}
int** dvojrozmernePole(int prvyRozmer, int druhyRozmer) { //funkcia vytvor<6F> dvojrozmern<72> pole typu int
int i;
int **pole = (int**) malloc(prvyRozmer * sizeof(int*)); //nainicializujem prv<72> rozmer po<70>a
for (i = 0; i < prvyRozmer; i++) pole[i] = (int*) malloc(druhyRozmer * sizeof(int)); //nainicializujem druh<75> rozmer po<70>a
return pole;
}
void stavPolicka(struct hra* hra, int vstup) { //funkcia skontroluje, <20>i bolo zadan<61> platn<74> <20><>slo pol<6F><6C>ka, prirad<61> ho pr<70>slu<6C>n<EFBFBD>mu hr<68><72>ovi a pr<70>slu<6C>ne zmen<65> hern<72> pl<70>n
int i, j;
for (i = 0; i < hra->pocetPolicokY; i++) { //postupne prejdem cel<65> pole
for (j = 0; j < hra->pocetPolicokX; j++) {
if (hra->hraciePole[i][j] <= 0 && hra->hraciePole[i][j] > hra->celkovyPocetPolicok) break; //ak hr<68><72> zadal neplatn<74> <20><>slo pol<6F><6C>ka, tak sa v hernom pl<70>ne nevykon<6F> <20>iadna zmena
if (hra->hraciePole[i][j] == vstup) { //ak sa zadan<61> <20><>slo zhoduje s kontrolovan<61>m <20><>slom, tak zmen<65>m hern<72> pl<70>n
if (hra->aktualnyHrac == hra->hrac1) hra->hraciePole[i][j] = -5; //zmen<65>m <20><>slo pol<6F><6C>ka na pr<70>slu<6C>n<EFBFBD> index
else hra->hraciePole[i][j] = -6;
}
}
}
}
void zmenaHraca(struct hra* hra) { //funkcia zmen<65> hr<68><72>a po vykonan<61> jednej hernej slu<6C>ky
if (hra->aktualnyHrac == hra->hrac1) { //zmena z 1. hr<68><72>a na druh<75>ho
hra->aktualnyHrac = hra->nasledujuciHrac;
hra->nasledujuciHrac = hra->hrac1;
} else { //a naopak
hra->aktualnyHrac = hra->nasledujuciHrac;
hra->nasledujuciHrac = hra->hrac2;
}
}
/*nasleduj<75>ce funkcie kontroluj<75> vytvorenie pi<70>kvorky (jednotliv<69> funkcie sa l<><6C>ia matematick<63>mi v<>po<70>tami pre ur<75>enie,
<EFBFBD>i sa pi<EFBFBD>kvorka vytvorila), koment<EFBFBD>re bud<EFBFBD> uveden<EFBFBD> len pri prvej funkcii a na za<EFBFBD>iatku ka<EFBFBD>dej funkcie*/
void vertikalneVytvoreniePiskvorky(struct hra* hra) { //funkcia kontroluje vytvorenie pi<70>kvorky vo vertik<69>lnom smere
int i, j;
char sprava[DLZKA_HLASENIA]; //v spr<70>ve ozn<7A>mim hr<68><72>a, ktor<6F> vyhral
for (i = 0; i < hra->pocetPolicokX; i++) {
for (j = 0; j + 2 < hra->pocetPolicokY; j++) {
if ((hra->hraciePole[j][i] == -5 && hra->hraciePole[j + 1][i] == -5 && hra->hraciePole[j + 2][i] == -5)) { //kontrolujem, <20>i vyhral hr<68><72> <20>. 1
sprintf(sprava, "Hru vyhral hrac %c.\n", hra->hrac1);
koniecHry(sprava); //hru ukon<6F><6E>m
}
else if (hra->hraciePole[j][i] == -6 && hra->hraciePole[j + 1][i] == -6 && hra->hraciePole[j + 2][i] == -6) { //kontrolujem, <20>i vyhral hr<68><72> <20>. 1
sprintf(sprava, "Hru vyhral hrac %c.\n", hra->hrac2);
koniecHry(sprava); //hru ukon<6F><6E>m
}
}
}
}
void horizontalneVytvoreniePiskvorky(struct hra* hra) { //funkcia kontroluje vytvorenie pi<70>kvorky vo horizont<6E>lnom smere
int i, j;
char sprava[DLZKA_HLASENIA];
for (i = 0; i < hra->pocetPolicokY; i++) {
for (j = 0; j + 2 < hra->pocetPolicokX; j++) {
if ((hra->hraciePole[i][j] == -5 && hra->hraciePole[i][j + 1] == -5 && hra->hraciePole[i][j + 2] == -5)) {
sprintf(sprava, "Hru vyhral hrac %c.\n", hra->hrac1);
koniecHry(sprava);
}
else if (hra->hraciePole[i][j] == -6 && hra->hraciePole[i][j + 1] == -6 && hra->hraciePole[i][j + 2] == -6) {
sprintf(sprava, "Hru vyhral hrac %c.\n", hra->hrac2);
koniecHry(sprava);
}
}
}
}
void krizoveVytvoreniePiskvorkyZlava(struct hra* hra) { //funkcia kontroluje vytvorenie pi<70>kvorky kr<6B><72>om z <20>avej strany
int i, j;
char sprava[DLZKA_HLASENIA];
for (i = 0; i < hra->pocetPolicokX; i++) {
for (j = 0; j < hra->pocetPolicokY; j++) {
if ((hra->hraciePole[i][j] == -5 && hra->hraciePole[i + 1][j + 1] == -5 && hra->hraciePole[i + 2][j + 2] == -5)) {
sprintf(sprava, "Hru vyhral hrac %c.\n", hra->hrac1);
koniecHry(sprava);
}
else if (hra->hraciePole[i][j] == -6 && hra->hraciePole[i + 1][j + 1] == -6 && hra->hraciePole[i + 2][j + 2] == -6) {
sprintf(sprava, "Hru vyhral hrac %c.\n", hra->hrac2);
koniecHry(sprava);
}
}
}
}
void krizoveVytvoreniePiskvorkySprava(struct hra* hra) { //funkcia kontroluje vytvorenie pi<70>kvorky kr<6B><72>om spravej strany
int i, j;
char sprava[DLZKA_HLASENIA];
for (i = 0; i < hra->pocetPolicokX; i++) {
for (j = hra->pocetPolicokY - 1; j - 2 >= 0; j--) {
if ((hra->hraciePole[i + 2][j - 2] == -5 && hra->hraciePole[i + 1][j - 1] == -5 && hra->hraciePole[i][j] == -5)) {
sprintf(sprava, "Hru vyhral hrac %c.\n", hra->hrac1);
koniecHry(sprava);
}
else if (hra->hraciePole[i + 2][j - 2] == -6 && hra->hraciePole[i + 1][j - 1] == -6 && hra->hraciePole[i][j] == -6) {
sprintf(sprava, "Hru vyhral hrac %c.\n", hra->hrac2);
koniecHry(sprava);
}
}
}
}
//tu kon<6F>ia funkcie kontroluj<75>ce vytvorenie pi<70>kvorky
void koniecHry(char* sprava) { //funkcia vykon<6F> pr<70>kazy potrebn<62> pre ukon<6F>enie hry
//zma<6D>em riadiace hl<68><6C>ky
move(LINES - (2 * (LINES / 10)), 0); //nastav<61>m kurzor na pr<70>slu<6C>n<EFBFBD> riadok
clrtoeol(); //a zma<6D>em ho
move(LINES - (2 * (LINES / 10)) + 1, 0); //rovnako aj tu
clrtoeol();
mvprintw(LINES - (2 * (LINES / 10)), 10, "Koniec hry."); //hr<68><72>om ozn<7A>mim koniec hry
refresh(); //vyobraz<61>m hru
napms(2000); //zobraz<61>m koncov<6F> stav hry
abort_game(sprava); //a hru ukon<6F><6E>m
}