A máquina nao perdoa (jogo da velha em c -arquivo correto, agora)

Publicado por Marcos Melo 24/02/2005

[ Hits: 18.628 ]

Download jogo_da_velha.c




Demorou, mas consegui fazer a máquina analisar o jogo satisfatoriamente.
O programa, Às vezes, "se distrai", mas na maoir parte do tempo joga corretamente.
eu já havia postado esse programa antes, mas cometi um erro no upload, e postei o arquivo de outro cara, que eu havia baixado. Era um jogo da velha, tambem, mas diferente do meu.

  



Esconder código-fonte

#include <stdio.h>
int jogarx = 0;
int jogary = 0;
struct jogada {
   int x;
   int y;
   long jogador;
};

struct jogo {
   int casa[3][3];
   int valor[3][3];
} pou;
long contador = 0;

main()
{
   int pontos_maq = 0;
   int pontos_hom = 0;
   long decr = 1024;
   int falso;
   int x, y;
   struct jogada teste;
   struct jogada *pega = &teste;
   
   
   int verifica;
   int jogador = -1;
   int primeiro = -1;
   pega->jogador = 0;
        pega->x = 0;
        pega->y = 0;
           
   while (1 > 0) {
      verifica = ver_se_ganhou(pou, 0);
      if (verifica == (1))
         pontos_maq++;
      if (verifica == -1)
         pontos_hom++;
      primeiro = primeiro * (-1);
      jogador = primeiro;
      for (x = 0; x < 3; x++)
         for (y = 0; y < 3; y++)
            pou.casa[x][y] = 0;
      while (ver_se_ganhou(pou, 0) == 0 && empate(pou) == 0) {
         imprime(pou, 0);
         printf("---\n");
         if (jogador == 1) {
//            printf("maquina\n");
            escolhe(pou, 0, decr);
            x = jogarx;
            y = jogary;
            pou.casa[x][y] = 1;
            imprime(pou, 0);
            sleep(1);
            jogador = (-1);
         } else {
            falso = 0;
            while (falso == 0) {
               printf("maquina: %i\nhomem:   %i\n",
                      pontos_maq, pontos_hom);
               printf("faça sua jogada:");
               scanf("%1d%1d", &x, &y);
               if (pou.casa[x][y] == 0)
                  falso = 1;
            }
            printf("x: %i  y: %i\n", x, y);
            pou.casa[x][y] = -1;
            imprime(pou, 0);
            jogador = 1;
         }
      }
   }
   printf("asfdas");
}

int
empate(struct jogo tab)
{
   int x, y;
   for (x = 0; x < 3; x++) {
      for (y = 0; y < 3; y++) {
         if (tab.casa[x][y] == 0) {
            return (0);
         }
      }
   }
   return (1);
}
//struct jogo
//zerar()
//{
//   int x, y;
//   struct jogo tab;
//   for (x = 0; x < 3; x++)
//      for (y = 0; y < 3; y++)
//         tab.casa[x][y] = 0;
//   return tab;
//}

escolhe(struct jogo tabula, int decr)
{
   int dee = 2000;
   struct jogo tabe = tabula;
   struct jogada maior;
   
   long valor = 0;
   int x, y;
   maior.jogador=-123456789;
   for (x = 0; x < 3; x++) {
      for (y = 0; y < 3; y++) {
         if (tabe.casa[x][y] == 0) {
            if (contador == 0) {
            }
            contador = 0;
            rodar(tabe, x, y, 1, 2000, 3);
            valor = contador;
      //      printf
      //          ("(valor %i)\t(contador %i)\t(%i,%i)\t(maior:%i)",
      //           valor, contador, x, y, maior.jogador);
            if (valor >= maior.jogador) {
               maior.jogador = valor;
               jogarx = x;
               jogary = y;
      //         printf("\t(%i,%i)", jogarx, jogary);
            }
      //      putchar('\n');
         }
      }
   }
}

rodar(struct jogo tabula, int x, int y, int player, int decr, int rr)
{
   int valor = 0;
   struct jogo tab = tabula;
   int resultado;
   
   int ddd = decr;
   int a, b;
   tab.casa[x][y] = player;
   player = player * (-1);
   resultado = ver_se_ganhou(tab, ddd);
   if (ddd > 0) {
      ddd = (ddd - 1000);
   }
   if (resultado != 0)
      return resultado;
   for (a = 0; a < 3; a++) {
      for (b = 0; b < 3; b++) {
         if (tab.casa[a][b] == 0) {
            rodar(tab, a, b, player, ddd, 2);
         }
      }
   }
   return valor;
}

imprime(struct jogo taba, double valor)
{
   struct jogo tab = taba;

   int x, y;
   system("clear");
   printf("  0 1 2\n");
//   printf("  _____\n");
   for (x = 0; x < 3; x++) {
      putchar(x + '0');
      putchar('|');
      for (y = 0; y < 3; y++) {
         int aa;
         switch (tab.casa[y][x]) {
         case -1:
            aa = 'X';
            break;
         case 1:
            aa = 'O';
            break;
         case 0:
            aa = ' ';
            break;
         }
         putchar(aa);
         putchar('|');
      }
      printf("\n");
   }
   printf(" ---\n");
   printf("contador: %i\n", contador);
   if (ver_se_ganhou(tab, 9) != 0) {
   }
}

int
ver_se_ganhou(struct jogo tab, long decr)
{
   /*ver vertical */
   int x, y;
   int casinha;
   for (x = 0; x < 3; x++) {
      casinha = tab.casa[x][0];
      for (y = 0; casinha != 0 && tab.casa[x][y] == casinha; y++)
         if (y == 2) {
            contador += casinha;
            contador = contador + (casinha * decr);
            return casinha;
         }
   }
   /* ver horiaontal*/
   for (y = 0; y < 3; y++) {
      casinha = tab.casa[0][y];
      for (x = 0; casinha != 0 && tab.casa[x][y] == casinha; x++)
         if (x == 2) {
            contador += casinha;
            contador = contador + (casinha * decr);
            return casinha;
         }
   }
   /*ver primeira diagonal*/
   if (tab.casa[0][0] != 0 && (tab.casa[0][0] == tab.casa[1][1])
       && (tab.casa[1][1] == tab.casa[2][2])) {
      contador += tab.casa[0][0];
      contador = contador + (tab.casa[0][0] * decr);
      return tab.casa[0][0];
   }
   /*ver segunda diagonal*/
   if (tab.casa[2][0] != 0 && (tab.casa[2][0] == tab.casa[1][1])
       && (tab.casa[1][1] == tab.casa[0][2])) {
      contador += tab.casa[2][0];
      contador = contador + (tab.casa[0][0] * decr);
      return tab.casa[2][0];
   }
   return 0;
}

Scripts recomendados

Validador de Cartão de Credito

vetor01.c (programa que envolve vetor, simples)

Joguinho de labirinto

Hello world 1

Função de hash simples em C


  

Comentários
[1] Comentário enviado por acefalo em 24/02/2005 - 18:25h

- ------ desculpem ------

o upload foi errado novamente.
o código válido está disponivel no link [ código-fonte ]
visualizem na pagina, compiem e compilem
gcc sem parametros
gcc arquivo.c -o programa
---------
reforçando:
o arquivo para download está errado, é o programa de outro usuário do vivaolinux

[2] Comentário enviado por Gruger em 17/11/2005 - 15:50h

o link "codigo fonte" nao funcionou colando o codigo no devcpp...

o arquivo do "download" funcionou mas contem alguns bugs:
1. caso uma jogada se repita ele sobrepoe a jogada... exemplo:
Jogador 1, linha 1 e coluna 1;
Jogador 2, linha 1 e coluna 1;
Ele ira sobrepor a ultima jogada sobre a primeira.

2. ele nao exibe os resultados na tela... houve algum erro na pausa do programa pois ele fecha assim que algum jogador ganha.

3. eh possivel 2 jogadores ganhar.

teh mais !

[3] Comentário enviado por jochan em 14/12/2005 - 14:36h

Muito legal, vai me ajudar bastente no meu projeto de C++ ... =)

[4] Comentário enviado por coelhinho_19 em 06/01/2006 - 09:27h

eai cara beleza..to super apertado aqui no curso, e meu professor ta pedindo um trabalho em linguagem c 3

um jogo da velha igual a esse cara!!! só que em turbo c 3!

se pudesse me ajudar cara ficaria grato!!! to no maior aperto! preciso urgente!!!!

[5] Comentário enviado por coelhinho_19 em 06/01/2006 - 09:47h

olha só cara c tu puder mandar p meu email

felipe_19@brturbo.com.br

valeu!!!

[6] Comentário enviado por coelhinho_19 em 06/01/2006 - 10:11h

olha só cara pode ser em linguagem c !!!!


valeu cara!!!!

[7] Comentário enviado por lazaro91 em 27/10/2007 - 09:08h

cara que louco. Mas realmente tem uns probleminhas nele. Ele sobrescreve as jogadas. Mas mesmo assim tá muito bom


Contribuir com comentário