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

Publicado por Marcos Melo 24/02/2005

[ Hits: 18.384 ]

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

Tabuada de número real

Adivinhar um número

Calculadora de equações de 2º grau versão 2 (com funções)

Decremento e incremento

Comando goto


  

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




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts