Você está visualizando atualmente Jogo da velha com a linguagem de programação C – Parte VI

Jogo da velha com a linguagem de programação C – Parte VI

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.

Este post tem 7 comentários

  1. Alex

    alguém tem um codigo onde o jogador joga contra o PC?

  2. Martim Veiga

    Boas tardes tenho uma dúvida como faço para fazer opcao para jogador vs computador e jogador vs jogador em c ?

    1. Wagner Gaspar

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

  3. Erick Cordeiro Freitas

    Você teria algum telefone de contato para assim conversarmos por lá e você sanar todas as minhas dúvidas ? Por obséquio.

    1. Wagner Gaspar

      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?

  4. Erick Cordeiro Freitas

    Gostaria muito de saber se há a possibilidade de implementar um ranking dentro desse código ? Por favor

    1. Wagner Gaspar

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

Deixe um comentário

seis + seis =

Wagner Gaspar

Capixaba de São Gabriel da Palha, Espírito Santo. Bacharel em Ciência da Computação pela Universidade Federal do Amazonas e mestre em informática pela Universidade Federal do Espírito Santo.