JOGOS - Jogo da velha em C

Este código é de um jogo da velha bem clássico para duas pessoas jogarem, criado em C.

#include <stdio.h>
int njogada;
//guarda o n° da jogada
int tabuleiro[3][3];
//matriz que contém as posições das jogadas
int inicio(){
int result;
printf("0000000000000\t\tXXXXXXXXXXXXX\n");
printf("\t ");
printf("JOGO DA VELHA\n");
printf("XXXXXXXXXXXXX\t\t0000000000000\n");
printf("\n");
printf("\n");
printf("Para jogar você deverá informar a linha.coluna da casa desejada.\n");
printf("Como por exemplo 1.3(linha 1, coluna 3)\n");
printf("\n");
printf("\n");
printf(".............\n");
printf("Pressione algum número para começar a jogar.\n");
scanf("%d",&result);
return result;
}

//...............FUNÇÕES PARA IMPRESSÃO DAS CASAS........................
void inicioCasa(){
// Imprime o corpo do ínicio de uma casa
printf(" ----- ");
}

void casaVazia(){
// Imprime o corpo de uma casa vazia
printf("| |");
}
void fimCasa(){
// Imprime o corpo do fim de uma casa
printf(" ----- ");
}
void casaX(int line){
// Imprime o corpo de uma casa que possuirá X
switch(line){
case 0:
printf("|X X|");
break;
case 1:
printf("| X X |");
break;
case 2:
printf("| X |");
break;
case 3:
printf("| X X |");
break;
case 4:
printf("|X X|");
break;
}
}
void casa0(int line){
// Imprime o corpo de uma casa que possuirá bolinha
switch(line){
case 0:
printf("| *** |");
break;
case 1:
printf("|* *|");
break;
case 2:
printf("|* *|");
break;
case 3:
printf("|* *|");
break;
case 4:
printf("| *** |");
break;
}
}
//...............FUNÇÕES PARA IMPRESSÃO DAS CASAS........................

void imprimeTabuleiro(){
// Desenha o tabuleiro e as casas preenchidas com suas respectivas jogadas
int i=0;
int j=0;
int z=0;
printf("\n");
for( z=0; z <= 2; z++){
printf("\t ");
for( i=0; i <= 2; i++ )
inicioCasa();
printf("\n");

for( j=0; j < 5; j++ ){
printf("\t ");
for( i=0; i <= 2; i++ ){

if(tabuleiro[z][i] == 0)
casaVazia();
if(tabuleiro[z][i] == 1)
casaX(j);
if(tabuleiro[z][i] == -1)
casa0(j);
}
printf("\n");
}

printf("\t ");
for( i=0; i <= 2; i++ )
fimCasa();
printf("\n");
}
}
void zeraTabuleiro(){
// Zera as variáveis que contém as posições das casas preenchidas
int i,j;
for(i=0; i <=2; i++){
for(j=0; j <=2; j++){
tabuleiro[i][j]=0;
}
}
}
int verificaVitoria(){
/*
Verifica se algum jogador conseguiu condição de vitória

Condições:

*se a soma de toda uma linha, coluna ou diagonal resultar em 3 o jogador 1
venceu.
*se resultar em -3 o jogador 2 venceu.

*caso contrario ninguém venceu ainda

*se todas as casas tiverem ocupadas ( 9 jogadas ) e nenhuma soma igualar os
casos acima patida empatou

*/
int i,j;
int somaA,somaB;
somaA = 0;
somaB = 0;
for(j=0; j<3; j++){
somaA = 0;
somaB = 0;
for(i=0; i<3; i++){
somaA = somaA + tabuleiro[i][j];
somaB = somaB + tabuleiro[j][i];
}
if (somaA == 3 || somaB == 3 )
return 1;
if (somaA == -3 || somaB == -3)
return 2;
}
somaA = tabuleiro[0][0] + tabuleiro[1][1] + tabuleiro [2][2];
somaB = tabuleiro[0][2] + tabuleiro[1][1] + tabuleiro [2][0];
if (somaA == 3 || somaB == 3 )
return 1;
if (somaA == -3 || somaB == -3)
return 2;
if (njogada == 9)
return 3;
return 0;
}
int verificaJogada(int jogadax,int jogaday, int donoJogada){
/*
Verifica se a jogada é válida
Caso sim:
Verifica se a casa está vazia e então a preenche com o dono da Jogada
Caso não:
1 - Desenha de novo o tabuleiro com as posições sem a jogada inválida
2 - Informa uma mensagem de jogada Inválida com possivel erro a casa ja ter
sido preenchida
*/
if ((jogadax == int(1)) && (jogaday == int(2)) && (tabuleiro[0][0] == 0)){
tabuleiro[0][0] = donoJogada;
return 1;
}
if ((jogadax == int(1)) && (jogaday == int(2)) && (tabuleiro[0][1] == 0)){
tabuleiro[0][1] = donoJogada;
return 1;
}
if ((jogadax == int(1)) && (jogaday == int(3)) && (tabuleiro[0][2] == 0)){
tabuleiro[0][2] = donoJogada;
return 1;
}
if ((jogadax == int(2)) && (jogaday == int(1)) && (tabuleiro[1][0] == 0)){
tabuleiro[1][0] = donoJogada;
return 1;
}
if ((jogadax == int(2)) && (jogaday == int(2)) && (tabuleiro[1][1] == 0)){
tabuleiro[1][1] = donoJogada;
return 1;
}
if ((jogadax == int(2)) && (jogaday == int(3)) && (tabuleiro[1][2] == 0)){
tabuleiro[1][2] = donoJogada;
return 1;
}
if ((jogadax == int(3)) && (jogaday == int(1)) && (tabuleiro[2][0] == 0)){
tabuleiro[2][0] = donoJogada;
return 1;
}
if ((jogadax == int(3)) && (jogaday == int(2)) && (tabuleiro[2][1] == 0)){
tabuleiro[2][1] = donoJogada;
return 1;
}
if ((jogadax == int(3)) && (jogaday == int(3)) && (tabuleiro[2][2] == 0)){
tabuleiro[2][2] = donoJogada;
return 1;
}
imprimeTabuleiro();
printf("\n**Jogada Invalida \n(Nota: A jogada ja pode ter sido feita)");
return 0;
}
int verificaDonoJogada(){
/*
método que verifica o dono da jogada baseado no lance da jogada
Condições
1 = jogador 1 (X)
-1 = jogador 2 (O)
*/
if((njogada % 2) == 0 )
return 1;
else
return -1;
}
void leJogada(){
/*
Verifica o dono da jogada, lê a jogada , caso jogada válida aumenta contador
de jogadas e desenha o tabuleiro, caso não continua a ler jogadas até a
existência de uma válida.
*/
int jogadax, jogaday;
int continuar=0;
int donoJogada = verificaDonoJogada();
int jogadaCorreta=0;


while( continuar == 0){
printf("\nInforme a jogada:\n");
scanf("%d %d", &jogadax, &jogaday);
continuar = verificaJogada(jogadax,jogaday,donoJogada);
}
njogada= njogada + 1;

imprimeTabuleiro();
}
void jogar(){
/*
Fica verificando a condição de vitória, caso não tenha acontecido, continua
a ler as jogadas.Apos condição de vitória ter sido resolvida imprime resultado
da partida.
*/
int vitoria=0;
while( verificaVitoria() == 0)
{
leJogada();
}

vitoria = verificaVitoria();
if(vitoria == 1){
printf("......................");
printf("PARABENS,VOCÊ GANHOU!1!");
printf("......................");
}
}

void montaTabuleiro(){
/*
Zera as posições das jogadas do tabuleiro
Zera o numero de jogadas feitas
Desenha o tabuleiro
Começa o jogo
*/
zeraTabuleiro();
njogada = 0;
imprimeTabuleiro();
jogar();
}

int main(){
inicio();
montaTabuleiro();
}
Por favor não retirar os créditos do autor do código fonte.