Bilo mi dosadno u busu kad sam isao sa BarCamp-a, pa sam odradio ovo

Eto, igrajte se malo...
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char** napraviMatricu();
void obrisiMatricu(char**);
void stampajMatricu(char**);
void inicijalizujMatricu(char**);
void unesiX(char**);
void unesiO(char**);
int provjeriKrajX(char**, int);
int provjeriKrajO(char**, int);
int main() {
char** matrica;
int brojPoteza = 0;
matrica = napraviMatricu();
inicijalizujMatricu(matrica);
stampajMatricu(matrica);
while (1) {
unesiX(matrica);
stampajMatricu(matrica);
brojPoteza++;
if (provjeriKrajX(matrica, brojPoteza)) {
printf("Prvi igrac je pobjedio!\n");
break;
}
unesiO(matrica);
stampajMatricu(matrica);
brojPoteza++;
if (provjeriKrajO(matrica, brojPoteza)) {
printf("Prvi igrac je pobjedio!\n");
break;
}
}
obrisiMatricu(matrica);
return 0;
}
char** napraviMatricu() {
char** matrica;
int i;
matrica = (char**)malloc(3 * sizeof(char*));
for (i = 0; i < 3; i++) {
matrica[i] = (char*)malloc(3 * sizeof(char));
}
return matrica;
}
void obrisiMatricu(char** matrica) {
int i;
for (i = 0; i < 3; i++) {
free(matrica[i]);
}
free(matrica);
}
void stampajMatricu(char** matrica) {
int i, j;
for (i=0; i<3; i++) {
for (j=0; j<3; j++) {
printf("%c\t", matrica[i][j]);
}
printf("\n\n");
}
}
void inicijalizujMatricu(char** matrica) {
int i,j;
for (i=0; i<3; i++)
for (j=0; j<3; j++)
matrica[i][j] = '.';
}
void unesiX(char** matrica) {
char* s;
int x, y;
s = (char*)malloc(sizeof(char));
printf("=================\n");
while (1) {
printf("X: ");
gets(s);
x = s[0] - '0';
y = s[2] - '0';
if (strlen(s) != 3 || x < 1 || y < 1 || x > 3 || x > 3)
printf("Neispravna pozicija!\n");
else if (matrica[x-1][y-1] != '.')
printf("Mjesto je zauzeto!\n");
else break;
}
printf("=================\n");
matrica[x-1][y-1] = 'X';
free(s);
}
void unesiO(char** matrica) {
char* s;
int x, y;
s = (char*)malloc(sizeof(char));
printf("=================\n");
while (1) {
printf("O: ");
gets(s);
x = s[0] - '0';
y = s[2] - '0';
if (strlen(s) != 3 || x < 1 || y < 1 || x > 3 || x > 3)
printf("Neispravna pozicija!\n");
else if (matrica[x-1][y-1] != '.')
printf("Mjesto je zauzeto!\n");
else break;
}
printf("=================\n");
matrica[x-1][y-1] = 'O';
free(s);
}
int provjeriKrajX(char** matrica, int z) {
if (z == 9) return 1;
if (matrica[0][0] == 'X' && matrica[0][1] == 'X' && matrica[0][2] == 'X') return 1;
if (matrica[1][0] == 'X' && matrica[1][1] == 'X' && matrica[1][2] == 'X') return 1;
if (matrica[2][0] == 'X' && matrica[2][1] == 'X' && matrica[2][2] == 'X') return 1;
if (matrica[0][0] == 'X' && matrica[1][0] == 'X' && matrica[2][0] == 'X') return 1;
if (matrica[0][1] == 'X' && matrica[1][1] == 'X' && matrica[2][1] == 'X') return 1;
if (matrica[0][2] == 'X' && matrica[1][2] == 'X' && matrica[2][2] == 'X') return 1;
if (matrica[0][0] == 'X' && matrica[1][1] == 'X' && matrica[2][2] == 'X') return 1;
if (matrica[0][2] == 'X' && matrica[1][1] == 'X' && matrica[2][0] == 'X') return 1;
return 0;
}
int provjeriKrajO(char** matrica, int z) {
if (z == 9) return 1;
if (matrica[0][0] == 'O' && matrica[0][1] == 'O' && matrica[0][2] == 'O') return 1;
if (matrica[1][0] == 'O' && matrica[1][1] == 'O' && matrica[1][2] == 'O') return 1;
if (matrica[2][0] == 'O' && matrica[2][1] == 'O' && matrica[2][2] == 'O') return 1;
if (matrica[0][0] == 'O' && matrica[1][0] == 'O' && matrica[2][0] == 'O') return 1;
if (matrica[0][1] == 'O' && matrica[1][1] == 'O' && matrica[2][1] == 'O') return 1;
if (matrica[0][2] == 'O' && matrica[1][2] == 'O' && matrica[2][2] == 'O') return 1;
if (matrica[0][0] == 'O' && matrica[1][1] == 'O' && matrica[2][2] == 'O') return 1;
if (matrica[0][2] == 'O' && matrica[1][1] == 'O' && matrica[2][0] == 'O') return 1;
return 0;
}