Ir para conteúdo
Fórum Script Brasil
  • 0

Jogo da Velha C++


Carine Reis

Pergunta

Estou construindo este jogo da velha, no entanto, gostaria de uma ajuda! Como faço para que a maquina sempre ganhe do jogador. (Resumindo, sempre dará velha ou a maquina sempre ira ganhar! O jogador nunca pode vencer!).

 

#include<iostream>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include <windows.h>//necessário para usar SetConsoleTitle
#include <locale.h> //necessário para usar setlocale

//area de declaracao de constantes
#define lim 3
#define Jogador 'J'
#define Maquina 'M'

    /*variáveis globais utilizadas no programa*/

    int c;    //variável de controle para laços
    char op;    //opção do jogador utilizado no programa principal
    int vezde;    //variável que define de quem é a vez para jogar
    int jogo;    //recebe o retorno das funções que define o fim do jogo
    char jv[3][3];    //matriz jogo 3 X 3


//procedimento utilizado para limpeza da matriz, colocando '0' em toda a matriz

void limpeza()
{
     //printf("Em construção........");
     
//O codigo abaixo percorre linhas e colunas da matriz. Cada posição é atribuido o caractere '0' para retirar o "lixo".
     for (int w=0;w<lim;w++)
     for (int j=0;j<lim;j++)
     jv[w][j] = '0';
}

//Procedimento utilizado para visualizar o conteúdo da matriz.

void visualizar()
{

//Faz com que a estrutura da matriz apareça uma unica vez.
    system("cls");

//Comando usado para colocar titulo no console.    
    SetConsoleTitle(TEXT("JOGO DA VELHA"));

//Permite suporte a língua portuguesa. Garante que caracteres como “ç” e acentuação sejam exibidos normalmente no programa.
    setlocale(LC_ALL,"Portuguese");
    
    int w,k;
    printf("\n");
    printf("\n\t\t\t\t   JOGO DA VELHA \n\n\n\n");
 
 
           printf("\t\t\t\t     C0   C1  C2   \n\n");
           printf("\t\t\t\t L0   %c | %c | %c \n",jv[0][0],jv[0][1],jv[0][2]);
           printf("\t\t\t\t     ---|---|--- \n ");
           printf("\t\t\t\t L1   %c | %c | %c \n",jv[1][0],jv[1][1],jv[1][2]);
           printf("\t\t\t\t     ---|---|--- \n ");
           printf("\t\t\t\t L2   %c | %c | %c \n",jv[2][0],jv[2][1],jv[2][2]);

   printf("\n\n");
}

//Esta função verifica se houve ou não ganhador, retornando true (verdadeiro) se houver,ou false (falso) se não tiver ganhador para cada jogada
int velha(char jog)
{
    //printf("Em construção........");

//O codigo abaixo pecorre as LINHAS 1, 2, 3 em seguida verifica que foi o ganhador
    if(jv[0][0] == jog && jv[0][1] == jog && jv[0][2] == jog)
         return 1;
        
    else if(jv[1][0] == jog && jv[1][1] == jog && jv[1][2] == jog)
         return 1;
        
    else if(jv[2][0] == jog && jv[2][1] == jog && jv[2][2] == jog)
         return 1;

//O codigo abaixo percorre as COLUNAS 1,2,3 em seguida verifica quem foi o ganhador.
    else if(jv[0][0] == jog &&
            jv[1][0] == jog &&
            jv[2][0] == jog)
         return 1;
         
    else if(jv[0][1] == jog &&
            jv[1][1] == jog &&
            jv[2][1] == jog)
         return 1;
         
    else if(jv[0][2] == jog &&
            jv[1][2] == jog &&
            jv[2][2] == jog)
         return 1;
        
//O codigo abaixo percorre as diagonais (principal,secundaria) e verifica se um dos jogadores venceu
       else if(jv[0][0] == jog && jv[1][1] == jog && jv[2][2] == jog)
         return 1;
        
    else if(jv[0][2] == jog && jv[1][1] == jog && jv[2][0] == jog)
         return 1;
        
    else return 0;
}

//Esta função recebe uma posição da matriz e verifica se esta posição já foi selecionada, retornando true (verdadeiro) se já tiver sido selecionada ou false (falso) caso contrário
int posicao( int l, int c)
{
    //printf("Em construção........");
    
//O laço abaixo ira percorrer toda a matriz
    for(int i = 0; i < 9; i++)
    {
        for(int j = 0; j < 9; j++)
           {
// Os valores passados na função ('l','c') sao comparados com as posições; se ela for igual entra e faz uma outra comparação.               
               if(i == l && c == j)
               {
// Apos validar as posições da matriz ele ainda verifica se aquela posição ja foi ocupada por um valor. Se esta posição estiver com caractere diferente de '0' o e porque ela ja foi usada. logo a função irá retornar 1 'true';                
                   if(jv[j] == '0')
                {
                    return 1;
                }
                // Caso contrario a função irá retornar 0 'false' pois aquela posição ainda pode ser usada.
                else
                {
                    return 0;
                }
               }            
        }
    }    
}

//Esta função utiliza a função random (rand) para selecionar uma nova jogada da máquina, retornando true se a jogada resultou em vitória ou false caso contrário.
int maquinajoga()
{
    int l,c,rposicao,v;

  rposicao = 1;
  do
  {
    l = rand()%3;
    c = rand()%3;
    rposicao = posicao(l,c);
    if (rposicao == 1)
        jv[l][c] = Maquina;
  }while (! rposicao == 1);
  visualizar();
  v = velha(Maquina);
  if ( v == 1)
  {
 
//Este bloco de comando faz com que o printf fique piscando na tela.    
        int i = 10;
   
               while (i)
               {
                  printf(" \n\n\n\t\t\t   A MAQUINA VENCEU O JOGO! \n");
                   Sleep (1000);  
                system ("cls");
                Sleep (100);
            }
      return 1;
  }
  else return 0;
}

//Esta função faz a jogada do jogador, que seleciona uma nova jogada válida, retornando true se a jogada resultou em vitória ou false caso contrário.
int jogadorjoga()
{
    //printf("Em construção........");
    
// Este codigo e utilizado para a maquina. No entanto o usuario deve informar o caracter ('J') para linha e coluna.
    int l,c,rposicao,v;
    rposicao = 1;
        
//Este laço e utilizado quando o jogador nao informa uma posicao valida ele fica repetindo as mesmas perguntas.
      do
      {      
//Solicita ao usuario que informe a linha e a coluna.
          printf("\n  Informe a linha: ");
          scanf("%d",&l);          
        printf("\n  Informe a coluna: ");
        scanf("%d",&c);
        
//Faz verificação da linha e da coluna. Se caso ja tenha sido utilizada independente se a jogada foi da maquina ou do jogador, este trecho informa se esta valido ou não.
        rposicao = posicao(l,c);    

//O codigo abaixo informa se a posiçao e igual a 1. caso seja ele atribui o caracter 'J' a matriz conforme a posição que o usuario informou.  
         if (rposicao == 1)
            jv[l][c] = Jogador;
            
      }
      while (! rposicao == 1);
      
//Visualiza a matriz apos a nova inserção            
      visualizar();
      
//Faz o retorno da validação verifica quem venceu o jogo ou não (caso tenha dado velha).
      v = velha(Jogador);
      
//Informa se o jogador venceu.
      if ( v == 1)
      {
         
//Este bloco de comando faz com que o printf fique piscando na tela.        
         int i = 10;
         
            while (i)
            {
                 printf(" \n\n\n\t\t\t    O JOGADOR VENCEU O JOGO! \n");
                  Sleep (2000);
               system ("cls");
               Sleep (100);
             
             }     
         return 1;
      }
    
      else return 0;
}

//programa principal. Jogo da Velha, esta parte do programa é a mais importante, controla de quem é a vez de jogar, chamando as funções e procedimentos necessários
//para cada execução do programa.

int main()
{
    c = 1;
    limpeza();    //chama a função para limpeza da matriz
    visualizar();    //visualiza a matriz 3 X 3 com '0'
    //Controle para selecionar de quem é a primeira jogada MAQUINA ou JOGADOR
    
    
    do
    {   
        printf(" Opção para início do jogo...\n\n");
        printf(" M = Máquina\n");
        printf(" J = Jogador\n\n");
        printf(" Informe a opção desejada: ");
        op = getchar();
        
    }while ( ( op != 'm' ) && ( op != 'M' ) && ( op != 'j' ) && ( op = 'J' ) );

system("cls");
    if ( ( op == 'm' ) || ( op == 'M' ) )
    {
        jogo = maquinajoga();
        vezde = 1;        // está variável é muito importante no programa,
        //fazendo com que após a máquina jogar ela sede a vez para o jogador.
    }
    else
    {
        jogo = jogadorjoga();
        vezde = 0;    //esta variável é muito importante no programa,
        //fazendo com que após o jogador jogar ele sede a vez para a maquina
    }

//Este laço controla as jogadas e só termina quando alguém ganha ou quando der empate: OBS.: uma ótima modificação neste programa seria o jogador
//selecionar se quer parar ou começar um novo jogo

    do
    {
        if ( vezde == 1)
        {
            jogo = jogadorjoga();            
            vezde = 0;
        }
        else
        {
            jogo = maquinajoga();            
            vezde = 1;
        }
//Mudança na verificação sendo que se igualar a 9 jogadas e ninguem vencer dara velha.
        if(c == 8 && jogo == 0)
               printf("\n\n\t\t\t\t Deu velha! :( \n");
        c++;
        
//Mudança do laço de '!jogo' para 'jogo == 0'.
    }while (( c <= 8 ) && ( jogo == 0 ));

    getch();
        
        return 0;
}

 

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Olá, amigo. Fiz isso, até poderia te passar as várias jogadas q o pc deve fazer para se tornar "imbatível". Não quer dizer que vai ganhar. Ou ganha ou empata. Mas antes de postar sugiro q tente você mesmo fazer essas jogadas do pc.

As dicas q eu daria é criar uma função com o tipo de retorno int passando como parâmetro dessa função o char simbolo.

O retorno ficaria assim: 

return matriz[0][1] = simbolo; // esse é um exemplo de uma jogada

Esse "simbolo" que aparece acima é o parâmetro, q pode ser "X" ou "O". A assinatura da função ficaria assim:

int isComputerTurn(char simbolo)
{

}

É só um exemplo

Como disse: Tenho o código aqui, mas é mais gratificante tentar fazer sozinho o exercício, até mesmo p você praticar e assim aprimorar seu aprendizado. Fika a dica 

Aqui uma colher de chá para facilitar na sua implementação das jogadas do pc:

int isComputerTurn(char simbolo)
{
	char x = 'X';
	char o = 'O';
	int random;

	// vitoria linhas 1
	if (matriz[0][0] == o && matriz[0][1] == o)
	{
		if (podeJogar(0, 2))
		{
			return matriz[0][2] = simbolo;
		}
	}

Com essa dica fica fácil até demais ao meu ver.

Se ajudei em alguma coisa avisa, ok?

Aqui uma colher de chá para facilitar na sua implementação das jogadas do pc:

int isComputerTurn(char simbolo)
{
	char x = 'X';
	char o = 'O';
	int random;

	// vitoria linhas 1
	if (matriz[0][0] == o && matriz[0][1] == o)
	{
		if (podeJogar(0, 2))
		{
			return matriz[0][2] = simbolo;
		}
	}

Com essa dica fica fácil até demais ao meu ver.

Se ajudei em alguma coisa avisa, ok?

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,9k
×
×
  • Criar Novo...