Olá programadores, programadoras e curiosos de plantão. Vamos dar continuidade ao desenvolvimento do nosso jogo da velha com a linguagem de programação C?
Se você perdeu o início de nossa série, você pode acessar cada uma das partes pelos links abaixo. Corre lá:
Parte I
Parte II
Parte III
Parte IV
Parte V
Hoje finalizaremos nosso jogo implementando a função main (função principal por onde se inicia a execução de nosso programa).
A primeira coisa que faremos é pedir o nome dos dois jogadores e salvar nos vetores globais que criamos lá na parte 1 deste tutorial.
Em seguida iremos inicializar nosso jogo, chamando o procedimento que preenche nossa matriz com o caractere ‘a’, ou seja, todas as posições de nossa matriz estão livres. Por fim, chamamos o procedimento jogar, que irá pedir coordenadas até que um dos jogadores vença ou até que o jogo termine sem vencedor.
Para tornar o jogo mais interativo, damos a opção para jogar novamente assim que uma partida terminar, colocando os dois procedimentos mencionados anteriormente dentro de uma estrutura do tipo faça{}enquanto (do{}while). Assim, enquanto os jogadores escolherem a opção 1 (sim), o jogo será inicializado e o procedimento jogar será chamado, iniciando uma nova partida.
O código da função main é apresentado abaixo:
int main() {
int op;
printf("Jogador 1 digite seu nome: ");
fgets(jogador1, 50, stdin);
printf("Jogador 2 digite seu nome: ");
fgets(jogador2, 50, stdin);
do {
inicializarJogo();
jogar();
printf("Jogar novamente?\n1 - Sim\t2 - Nao\n");
scanf("%d", &op);
} while(op == 1);
return 0;
}
A seguir, apresentamos o código completo do jogo da velha com algumas melhorias. A inicialização da matriz é feita com o caractere espaço e não mais com o caractere ‘a’, tornando o processo de impressão da matriz mais simples:
#include <stdio.h>
#include <stdlib.h>
char jogo[3][3];
char jogador1[50], jogador2[50];
void inicializarMatriz() {
int i,j;
for(i = 0; i < 3; i++) {
for(j = 0; j < 3; j++) {
jogo[i][j] = ' ';
}
}
}
int eValido(char letra) {
if(letra == 'x' || letra == '0')
return 1;
else
return 0;
}
int coordenadaEhValida(int x, int y) {
if(x >= 0 && x < 3) {
if(y >= 0 && y < 3)
return 1;
}
return 0;
}
int posicaVazia(int x, int y) {
if(jogo[x][y] != 'x' && jogo[x][y] != '0')
return 1;
return 0;
}
int ganhouLinhas() {
int i, j, igual = 1;
for(i = 0; i < 3; i++) {
for(j = 0; j < 2; j++) {
if(eValido(jogo[i][j]) && jogo[i][j] == jogo[i][j+1])
igual++;
}
if(igual == 3)
return 1;
igual = 1;
}
return 0;
}
int ganhouColunas() {
int i, j, igual = 1;
for(i = 0; i < 3; i++) {
for(j = 0; j < 2; j++) {
if(eValido(jogo[j][i]) && jogo[j][i] == jogo[j+1][i])
igual++;
}
if(igual == 3)
return 1;
igual = 1;
}
return 0;
}
int ganhoudiagPrincipal() {
int i, igual = 1;
for(i = 0; i < 2; i++) {
if(eValido(jogo[i][i]) && jogo[i][i] == jogo[i+1][i+1])
igual++;
}
if(igual == 3)
return 1;
else
return 0;
}
int ganhoudiagSecundaria() {
int i, igual = 1;
for(i = 0; i < 2; i++) {
if(eValido(jogo[i][3-i-1]) && jogo[i][3-i-1] == jogo[i+1][3-i-2])
igual++;
}
if(igual == 3)
return 1;
else
return 0;
}
void imprimir() {
int lin, col;
printf("\n\t 0 1 2\n");
for(lin = 0; lin < 3; lin++) {
printf("\t%d ", lin);
for(col = 0; col < 3; col++) {
if(col < 2)
printf(" %c |", jogo[lin][col]);
else
printf(" %c ", jogo[lin][col]);
}
if(lin < 2)
printf("\n\t ---------\n");
}
}
void jogar() {
int x, y, valida, jogadas = 0, ganhou = 0, ordem = 1;
do {
do {
imprimir();
printf("\nDigite a coordenada que deseja jogar: ");
scanf("%d%d", &x, &y);
valida = coordenadaEhValida(x, y);
if(valida == 1)
valida += posicaVazia(x, y);
} while(valida != 2);
if(ordem == 1)
jogo[x][y] = 'x';
else
jogo[x][y] = '0';
jogadas++;
ordem++;
if(ordem == 3)
ordem = 1;
ganhou += ganhouLinhas();
ganhou += ganhouColunas();
ganhou += ganhoudiagPrincipal();
ganhou += ganhoudiagSecundaria();
} while(ganhou == 0 && jogadas < 9);
if(ganhou != 0) {
imprimir();
if(ordem - 1 == 1)
printf("\nParabens. Voce venceu %s\n", jogador1);
else
printf("\nParabens. Voce venceu %s\n", jogador2);
} else
printf("\nQue feio. Ninguem venceu!\n\n");
}
int main() {
int op;
printf("Jogar 1 digite seu nome: ");
fgets(jogador1, 50, stdin);
printf("Jogar 2 digite seu nome: ");
fgets(jogador2, 50, stdin);
do {
inicializarMatriz();
jogar();
printf("Deseja jogar novamente?\n1 - Sim\n2 - Nao\n");
scanf("%d", &op);
} while(op == 1);
return 0;
}
Se ficou alguma dúvida, compartilhe nos comentários que faremos o possível para esclarecer. Um grande abraço, bons estudos e até o próximo.

alguém tem um codigo onde o jogador joga contra o PC?
Boas tardes tenho uma dúvida como faço para fazer opcao para jogador vs computador e jogador vs jogador em c ?
Olá Martim.
Para escolher entre duas opções basta usar uma estrutura de seleção if, perguntando para o jogador se ele deseja jogar com outro jogador humano ou contra o computador. Baseado na escolha do jogador você então executa o código apropriado para dois humanos ou para humano versus máquina.
Para fazer o jogador jogar contra o computador é algo bem mais complexo. Você precisa programar praticamente todas as análises que você faz enquanto está jogador, ou seja, avaliar quais as opções disponíveis, se o oponente está prestes ganhar e você precisa bloquear ele, se há alguma opção onde você pode ganhar, etc. É praticamente desenvolver uma pequena IA (Inteligência Artificial).
Você teria algum telefone de contato para assim conversarmos por lá e você sanar todas as minhas dúvidas ? Por obséquio.
Se for apenas algumas dúvidas poste elas aqui, é bom que ajuda aos outros leitores que até aqui chegarem.
O você está a procura de aulas particulares?
Gostaria muito de saber se há a possibilidade de implementar um ranking dentro desse código ? Por favor
Olá Erick.
Sim, há como implementar um ranking nesse código sim e isso pode ser feito de diversas maneiras.
A mais simples é utilizar alguns vetores para armazenar a pontuação e o nome dos vencedores. O problema é que ao finalizar o jogo todo o ranking seria perdido e estaria zerado ao iniciar o programa novamente.
Outra forma interessante é fazer uso de arquivos para salvar o ranking, dessa maneira você pode programar o jogo para ler o arquivo ao iniciar, obtendo o ranking já salvo, e salvar novamente ao finalizar.
Caso tenha interesse em aprender como trabalhar com arquivo eu fiz um tutorial mostrando um exemplo com arquivo texto aqui (https://wagnergaspar.com/arquivos-texto-com-a-linguagem-de-programacao-c/) e com arquivo binário aqui (https://wagnergaspar.com/arquivo-binario-com-a-linguagem-de-programacao-c/).