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/).