Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ulfreitas

[Resolvido] jogo da velha contra comp.

Recommended Posts

Bom dia

To fazendo um jogo da velha, e to com dificuldade na parte em que o computador faz a jogada dele.

 

Eu pretendia fazer o seguinte:

Pessoa faz a jogada dela;

1ª jogada do computador é randomica;

Pessoa faz a segunda jogada;

Computador lê a matriz e procura dois 'X' ou dois 'O' juntos separados por um espaço;

Se ele encontrou vê se o espaço está vazio;

Se estiver vazio ele preenche com 'O', finalizando o jogo caso 'O'|'O'|'O', ou evitando perder caso 'X'|'X'|'O';

E caso ele nao encontre nada preenche um espaço randomico;

 

Mas nao ta dando certo, abaixo segue o código:

void get_computer_move(void)
{
   int i,j,marcou;

   marcou=0;

  /*----- RANDOMICO -----*/
   if(jogadas<2){
       do{
           randomico();
           if(matrix[a][b]==' '){
               matrix[a][b]='O';
               marcou++;
           }
       }while(marcou==0);
   }
   else{
        /*-------- CONTROLA HORIZONTAIS ---------*/
       if(!marcou)
           for(i=0;i<3;i++)
               if(matrix[i][0] == matrix[i][1])
                   if(matrix[i][2]==' ')
                   {
                       matrix[i][2]=='O';
                       marcou++;
                       break;
                   }
       if(!marcou)
           for(i=0;i<3;i++)
               if(matrix[i][1] == matrix[i][2])
                   if(matrix[i][0]==' ')
                   {
                       matrix[i][0]='O';
                       marcou++;
                       break;
                   }
       if(!marcou)
           for(i=0;i<3;i++)
               if(matrix[i][0] == matrix[i][2])
                   if(matrix[i][1]==' ')
                   {
                       matrix[i][1]='O';
                       marcou++;
                       break;
                   }
   /*------- CONTROLA VERTICAIS ---------*/
       if(!marcou)
           for(i=0;i<3;i++)
               if(matrix[0][i] == matrix[1][i])
                   if(matrix[2][i]==' ')
                   {
                       matrix[2][i]='O';
                       marcou++;
                       break;
                   }
       if(!marcou)
           for(i=0;i<3;i++)
               if(matrix[0][i] == matrix[2][i])
                   if(matrix[1][i]==' ')
                   {
                       matrix[1][i]='O';
                       marcou++;
                       break;
                   }
       if(!marcou)
           for(i=0;i<3;i++)
               if(matrix[1][i] == matrix[2][i])
                   if(matrix[0][i]==' ')
                   {
                       matrix[0][i]='O';
                       marcou++;
                       break;
                   }
   /*------ CONTROLA DIAGONAIS -----------*/
       if(!marcou)
           if(matrix[0][0] == matrix[1][1])
               if(matrix[2][2]==' ')
               {
                   matrix[2][2]='O';
                   marcou++;
               }
       if(!marcou)
           if(matrix[1][1] == matrix[2][2])
               if(matrix[0][0]==' ')
               {
                   matrix[0][0]='O';
                   marcou++;
               }
       if(!marcou)
           if(matrix[0][0] == matrix[2][2])
               if(matrix[1][1]==' ')
               {
                   matrix[1][1]='O';
                   marcou++;
               }
       if(!marcou)
           if(matrix[0][2] == matrix[1][1])
               if(matrix[2][0]==' ')
               {
                   matrix[2][0]='O';
                   marcou++;
               }                        
       if(!marcou)
           if(matrix[1][1] == matrix[2][0])
               if(matrix[0][2]==' ')
               {
                   matrix[0][2]='O';
                   marcou++;
               }   
       if(!marcou)
          if(matrix[0][2] == matrix[2][0])
              if(matrix[1][1]==' ')
              {
                   matrix[1][1]='O';
                   marcou++;
               } 
    /*------ Randomico --------*/
       if(!marcou)
           do{
               randomico();
               if(matrix[a][b]==' '){
                   matrix[a][b]='O';
                   marcou++;
               }
           }while(marcou==0);
   }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ow pessoal consegui fazer funcionar.

Eu usei duas estruturas condicionais umar pra testar as jogadas do computador pra ele ganhar e outra pra testar as jogadas do jogador pra evitar que ele ganhe, achei que ficou muito grande, pelo menos o dobro dessa que eu postei, mas ta funcionando :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu fiz isso em DarkBasic, 10x mais simples ^^

Sério kra? nem sei o q é darkbasic, você pode postar o código pra eu dar uma olhada na logica que você usou?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ulysses Freitas, se interessar eu tinha feito esse código hoje:

 

#include <stdio.h>
#include <stdlib.h>

char matrix[3][3];

char check(void);
void init(void);
void get_player(void);
void get_computer(void);
void display(void);
void get_radom(void);

int main()
{
   char done;
   printf("Este é o jogo da velha\n");
   printf("Você jogara contra o computador.\n");

   done = ' ';
   init();

   do {
       display();
       get_player();
       done = check();
       if (done != ' ') break;
       get_computer();
       done = check();
       } while (done == ' ');
       if (done == 'X') printf("Você Ganhou!\n");
           else printf("Você Perdeu!\n");

       display();
       return 0;
}

void init(void)
{
   int x, y;

   for(x=0; x<3; ++x)
       for(y=0; y<3; ++y) matrix[x][y] = ' ';
}

void get_player(void)
{
   int x, y;

   printf("Digite as cordenadas para o X:\n");
   scanf("%d%d", &x, &y);

   x--; y--;

   if (matrix[x][y] != ' ') {
       printf("Posição inválida, tente novamente. \n");
       get_player();
   }
   else matrix[x][y] = 'X';
}

void get_computer(void)
{
register int x;
int ver = 0;

/*verifica linhas*/
for (x=0; x<3; ++x)
   if (ver !=1 && matrix[x][0] != ' ' && matrix[x][0] == matrix[x][1]) {
       if (matrix[x][2] == ' ') {
           matrix[x][2] = 'O';
           ver = 1;
           break;
       }
   }
for (x=0; x<3;++x)
   if (ver !=1 && matrix[x][1] != ' ' && matrix[x][1] == matrix[x][2]) {
       if (matrix[x][0] == ' ') {
       matrix[x][0] = 'O';
       ver = 1;
       break;
       }
   }
for (x=0; x<3;++x)
   if (ver !=1 && matrix[x][0] != ' ' && matrix[x][0] == matrix[x][2]) {
       if (matrix[x][1] == ' ') {
           matrix[x][1] = 'O';
           ver = 1;
           break;
       }
   }

/*verifica colunas*/
for (x=0; x<3; ++x)
   if (ver !=1 && matrix[0][x] != ' ' && matrix[0][x] == matrix[1][x]) {
       if (matrix[2][x] == ' ') {
           matrix[2][x] = 'O';
           ver = 1;
           break;
       }
   }
for (x=0; x<3;++x)
   if (ver !=1 && matrix[1][x] != ' ' && matrix[1][x] == matrix[2][x]) {
       if (matrix[0][x] == ' ') {
           matrix[0][x] = 'O';
           ver = 1;
           break;
       }
   }
for (x=0; x<3;++x)
   if (ver !=1 && matrix[0][x] != ' ' && matrix[0][x] == matrix[2][x]) {
       if (matrix[1][x] == ' ') {
           matrix[1][x] = 'O';
           ver = 1;
           break;
       }
   }

/*Não achei uma relação matematica entre as diagonais, então não usarei um lago para verificalas*/

/*Verifica a diagonal principal*/
if (ver !=1 && matrix[0][0] != ' ' && matrix[0][0] == matrix[1][1])
   if (matrix[2][2] == ' ') {
       matrix[2][2] = 'O';
       ver = 1;
   }

if (ver !=1 && matrix[0][0] != ' ' && matrix[0][0] == matrix[2][2])
   if (matrix[1][1] == ' ') {
       matrix[1][1] = 'O';
       ver = 1;
   }

if (ver !=1 && matrix[1][1] != ' ' && matrix[1][1] == matrix[2][2])
   if (matrix[0][0] == ' ') {
       matrix[0][0] = 'O';
       ver = 1;
   }

if (ver !=1 && matrix[0][0] != ' ' && matrix[0][0] == matrix[1][1])
   if (matrix[2][2] == ' ') {
       matrix[2][2] = 'O';
       ver = 1;
   }

/*Verifica a diagonal secundaria*/
if (ver !=1 && matrix[0][2] != ' ' && matrix[0][2] == matrix[1][1])
   if (matrix[2][0] == ' ') {
       matrix[2][0] = 'O';
       ver = 1;
   }

if (ver !=1 && matrix[0][2] != ' ' && matrix[0][2] == matrix[2][0])
   if (matrix[1][1] == ' ') {
       matrix[1][1] = 'O';
       ver = 1;
   }

if (ver !=1 && matrix[1][1] != ' ' && matrix[1][1] == matrix[2][0])
   if (matrix[0][2] == ' ') {
       matrix[0][2] = 'O';
       ver = 1;
   }

if (ver == 1)
   ver = 0;
else
   get_radom();
ver = 0; /*Não Remover ou Algumas vezes o Computador não irar jogar*/
}

void get_radom(void)
{
   int i, j;

   for(i=0; i<3; ++i) {
       for(j=0; j<3; ++j)
       if (matrix[i][j] == ' ') break;
   if (matrix[i][j] == ' ') break;
   }

   if (i*j == 9) {
       printf("Empate!");
       exit(0);
       }
   else matrix[i][j] = 'O';
}

void display(void)
{
   int t;

   for(t=0; t<3; ++t) {
       printf(" %c | %c | %c ", matrix[t][0], matrix[t][1], matrix[t][2]);
       if (t != 2) printf("\n---|---|---\n");
   }
   printf("\n");
}

char check(void)
{
int x;

for (x=0; x<3;++x)
   if (matrix[x][0] == matrix[x][1] && matrix[x][0] == matrix[x][2]) return matrix[x][0];

for (x=0; x<3;++x)
   if (matrix[0][x] == matrix[1][x] && matrix[0][x] == matrix[2][x]) return matrix[0][x];

/*Testa as diagonais*/
if (matrix[0][0] == matrix[1][1] && matrix[0][0] == matrix[2][2]) return matrix[0][0];
if (matrix[0][2] == matrix[1][1] && matrix[0][2] == matrix[2][0]) return matrix[0][2];

return ' ';
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ow yago fico chic cara, gostei da parte de comparar, eu fiz um código parecido com esse, porém testando a matriz duas vezes, a primeira tenta encontrar os 0 para ganhar, se não achar nenhuma possibilidade ele tenta encontrar os X para bloquear, adicionei outras coisas tambem, um placar, menu pra escolher se vai jogar contra computador ou outra pessoa ficou extenso mais ficou legal.

Agradeço por compartilhar teu código.

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu apenas verifiquei a matriz apenas uma vez, pq ai se ele achasse dois "O" ou dois "X", ele jogaria lá broqueando ou ganhando :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu apenas verifiquei a matriz apenas uma vez, pq ai se ele achasse dois "O" ou dois "X", ele jogaria lá broqueando ou ganhando :D

 

Entao eu tentei fazer isso tambem, mas eu percebi um problema, o jogo fica meio burro, por exemplo:

o que aconteceria, verificando uma vez só esse jogo?

X | X | 
----------
0 | 0 |
----------
 |   |

 

o computador iria jogar no X para bloquear, mas pq raios ele não joga direto no O e ganha o jogo de uma vez? Entendeu meu ponto de vista? pra isso eu nao consegui pensar em outra alternativa do que rodar a matriz duas vezes primeiro pra tentar ganhar segunda pra tentar bloquear.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entao eu tentei fazer isso tambem, mas eu percebi um problema, o jogo fica meio burro, por exemplo:

o que aconteceria, verificando uma vez só esse jogo?

X | X | 
----------
0 | 0 |
----------
 |   |

 

o computador iria jogar no X para bloquear, mas pq raios ele não joga direto no O e ganha o jogo de uma vez? Entendeu meu ponto de vista? pra isso eu nao consegui pensar em outra alternativa do que rodar a matriz duas vezes primeiro pra tentar ganhar segunda pra tentar bloquear.

 

Eu realmente não tinha pensado nisso :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.