200 lines
8.6 KiB
C
200 lines
8.6 KiB
C
|
#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
|
|||
|
}
|