Jogo da Velha com IA invencivel

Publicado por Hunz 10/05/2005

[ Hits: 52.597 ]

Homepage: http://tnegri.com/

Download main.cpp




Criei uma IA invencivel (até agora é o que parece...) para o jogo da velha.
Se alguém conseguir derrotar o computador, por favor poste como fez para derrota-lo. Afinal, quero construir uma IA invencivel mesmo. :)
Fiz um jogo da Velha em C++ com 2 opções de jogo.
· Jogador contra Jogador (mesmo computador...)
ou
· Jogador contra Computador
Divirtam-se!
Quero ver quem vence o computador hein... :P

  



Esconder código-fonte

#include <iostream.h>
#include <stdlib.h>

#define LIMPAR_TELA "clear"

class Casa 
{
public:
   int dominado_por;

   Casa(void) {
      dominado_por = 0;
   }
};

class Linha 
{
public:
   Casa casa1;
   Casa casa2;
   Casa casa3;
};

Linha linha1;
Linha linha2;
Linha linha3;

void domina_casa(int i, int j, int dominador)
{
   Linha *aux;

   if (j == 1)
      aux = &linha1;
   else if (j == 2)
      aux = &linha2;
   else if (j == 3)
      aux = &linha3;

   if (i == 1)
      aux->casa1.dominado_por = dominador;
   else if (i == 2)
      aux->casa2.dominado_por = dominador;
   else if (i == 3)
      aux->casa3.dominado_por = dominador;
}

int checa_casa(int i, int j)
{
   Linha *aux;

   if (j == 1)
      aux = &linha1;
   else if (j == 2)
      aux = &linha2;
   else if (j == 3)
      aux = &linha3;

   if (i == 1)
      return aux->casa1.dominado_por;
   else if (i == 2)
      return aux->casa2.dominado_por;
   else if (i == 3)
      return aux->casa3.dominado_por;
}

void desenhar_jogo()
{
   int j, i;
   int aux;

   cout << "+---+---+---+\n";
   for (j = 1; j <= 3; j++)
   {
      cout << "|";
      for (i = 1; i <= 3; i++)
      {
         aux = checa_casa(i,j);
         if (aux == 0)
            cout << "   ";
         else if (aux == 1)
            cout << " X ";
         else if (aux == 2)
            cout << " O ";
         cout << "|";
      }
      cout << "\n+---+---+---+\n";
   }
}

int checa_win()
{
   int aux1, aux2, aux3;
   int i;
   
   for (i = 1; i <= 3; i++)
   {
      aux1 = checa_casa(1,i);
      aux2 = checa_casa(2,i);
      aux3 = checa_casa(3,i);
      if ((aux1 == aux2) && (aux2 == aux3) && (aux3 != 0))
         return aux1;
      aux1 = checa_casa(i,1);
      aux2 = checa_casa(i,2);
      aux3 = checa_casa(i,3);
      if ((aux1 == aux2) && (aux2 == aux3) && (aux3 != 0))
         return aux1;
   }

   aux1 = checa_casa(1,1);
   aux2 = checa_casa(2,2);
   aux3 = checa_casa(3,3);
   if ((aux1 == aux2) && (aux2 == aux3) && (aux3 != 0))
      return aux1;

   aux1 = checa_casa(1,3);
   aux3 = checa_casa(3,1);
   if ((aux1 == aux2) && (aux2 == aux3) && (aux3 != 0))
      return aux1;

   return 0;
}

void loop_jogo(int jogador)
{
   int aux;
   int tmp_coluna, tmp_linha;
   int confirma;

   aux = 5;
   while (aux != 0)
   {
      system(LIMPAR_TELA);
      desenhar_jogo();

      confirma = 5;
      while (confirma != 1)
      {
         tmp_linha = 5;
         while ((tmp_linha < 1) || (tmp_linha > 3))
         {
            cout << "Jogador " << jogador << ". Em que linha deseja jogar? ";
            if ((scanf("%d",&tmp_linha)) == 0)
            {
               cout << "Huh?\n";
               getchar();
            }
         }

         tmp_coluna = 5;
         while ((tmp_coluna < 1) || (tmp_coluna > 3))
         {
            cout << "Jogador " << jogador << ". Em que coluna deseja jogar? ";
            if ((scanf("%d",&tmp_coluna)) == 0)
            {
               cout << "Huh?\n";
               getchar();
            }
         }

         confirma = 5;
         while ((confirma < 1) || (confirma > 2))
         {
            cout << "Jogador " << jogador << ". Confirma? (1 Sim / 2 Nao) ";
            if ((scanf("%d",&confirma)) == 0)
            {
               cout << "Huh?\n";
               getchar();
            }
         }
      }

      aux = checa_casa(tmp_coluna,tmp_linha);
      if (aux != 0)
      {
         cout << "Casa em uso. Escolha outra.";
         getchar(); getchar();
      } 
   }

   domina_casa(tmp_coluna,tmp_linha,jogador);
}

int joga_computador()
{
   int aux, aux1, aux2, aux3;
   int i, j;
   
   /* Level 1 AI */
   aux1 = checa_casa(2,2);
   if (aux1 == 0)
   {
      domina_casa(2,2,2);
      return 0;
    }
    
   for (j = 2; j >= 1; j--)
   {
      for (i = 1; i <= 3; i++)
      {
         /* Horizontais */
         aux1 = checa_casa(1,i);
         aux2 = checa_casa(2,i);
         aux3 = checa_casa(3,i);
         if ((aux1 == aux3) && (aux2 == 0) && (aux1 == j))
         {
            aux = checa_casa(2,i);
            if (aux == 0)
            {
                domina_casa(2,i,2);
                return 0;
              }
            }
         else if ((aux1 == aux2) && (aux3 == 0) && (aux1 == j))
         {
               aux = checa_casa(3,i);
            if (aux == 0)
            {
                   domina_casa(3,i,2);
               return 0;
                }
            }
         else if ((aux2 == aux3) && (aux1 == 0) && (aux2 == j))
         {
               aux = checa_casa(1,i);
               if (aux == 0)
               {
                domina_casa(1,i,2);
               return 0;
               }
            }

         /* Verticais */
         aux1 = checa_casa(i,1);
         aux2 = checa_casa(i,2);
         aux3 = checa_casa(i,3);
         if ((aux1 == aux3) && (aux2 == 0) && (aux1 == j))
         {
               aux = checa_casa(i,2);
               if (aux == 0)
               {
               domina_casa(i,2,2);
               return 0;
               }
            }
         else if ((aux1 == aux2) && (aux3 == 0) && (aux1 == j))
         {
               aux = checa_casa(i,3);
               if (aux == 0)
               {
               domina_casa(i,3,2);
               return 0;
               }
            }
          else if ((aux2 == aux3) && (aux1 == 0) && (aux2 == j))
          {
               aux = checa_casa(i,1);
               if (aux == 0)
               {
               domina_casa(i,1,2);
               return 0;
               }
            }
      }
   
      /* Diagonal Principal */
      aux1 = checa_casa(1,1);
      aux2 = checa_casa(2,2);
      aux3 = checa_casa(3,3);
       if ((aux1 == aux3) && (aux2 == 0) && (aux1 == j))
       {
           aux = checa_casa(2,2);
           if (aux == 0)
           {
            domina_casa(2,2,2);
            return 0;
           }
        }
      else if ((aux1 == aux2) && (aux3 == 0) && (aux1 == j))
      {
          aux = checa_casa(3,3);
          if (aux == 0)
          {
             domina_casa(3,3,2);
             return 0;
           }
        }
      else if ((aux2 == aux3) && (aux1 == 0) && (aux2 == j))
      {
           aux = checa_casa(1,1);
           if (aux == 0)
           {
            domina_casa(1,1,2);
            return 0;
           }
        }
      
      /* Diagonal Secundaria */
      aux1 = checa_casa(3,1);
      aux3 = checa_casa(1,3);
      if ((aux1 == aux3) && (aux2 == 0) && (aux1 == j))
      {
           aux = checa_casa(2,2);
           if (aux == 0)
           {
            domina_casa(2,2,2);
            return 0;
          }   
        }
      else if ((aux1 == aux2) && (aux3 == 0) && (aux1 == j))
      {
           aux = checa_casa(1,3);
           if (aux == 0)
           {
             domina_casa(1,3,2);
             return 0;
            }
        }
      else if ((aux2 == aux3) && (aux1 == 0) && (aux2 == j))
      {
           aux = checa_casa(3,1);
           if (aux == 0)
           {
            domina_casa(3,1,2);
            return 0;
            }
        }
   }
      
   /* Level 2 AI */
   
   /* Defesa */
   aux1 = checa_casa(1,1);
   aux2 = checa_casa(3,3);
   if ((aux1 == 1) && (aux2 == 1))
   {
       aux = checa_casa(2,1);
       if (aux == 0)
       {
         domina_casa(2,1,2);
         return 0;
        }
    }
   
    aux1 = checa_casa(3,1);
    aux2 = checa_casa(1,3);
    if ((aux1 == 1) && (aux2 == 1))
    {
       aux = checa_casa(2,1);
       if (aux == 0)
       {
          domina_casa(2,1,2);
          return 0;
        }
    }
    
    aux1 = checa_casa(2,1);
    aux2 = checa_casa(3,2);
    aux3 = checa_casa(1,2);
    if ((aux1 == 1) && (aux2 == 1))
    {
       aux = checa_casa(3,1);
       if (aux == 0)
       {
           domina_casa(3,1,2);
           return 0;
        }
    }
    if ((aux1 == 1) && (aux3 == 1))
    {
       aux = checa_casa(1,1);
       if (aux == 0)
       {
            domina_casa(1,1,2);
            return 0;
        }
    }
    if ((aux3 == 1) && (aux2 == 1))
    {
       aux = checa_casa(1,1);
       if (aux == 0)
       {
            domina_casa(1,1,2);
            return 0;
        }
    }
    
    aux1 = checa_casa(2,3);
    if ((aux1 == 1) && (aux2 == 1))
    {
       aux = checa_casa(3,3);
       if (aux == 0)
       {
            domina_casa(3,3,2);
            return 0;
        }
    }
    if ((aux1 == 1) && (aux3 == 1))
    {
       aux = checa_casa(1,3);
       if (aux == 0)
       {
            domina_casa(1,3,2);
            return 0;
        }
    }
    
    aux1 = checa_casa(1,1);
    aux2 = checa_casa(2,2);
    aux3 = checa_casa(3,3);
    if ((aux1 == 2) && (aux2 == 1) && (aux3 == 1))
    {
       aux = checa_casa(3,1);
       if (aux == 0)
       {
            domina_casa(3,1,2);
            return 0;
        }
    }
    
      /* Ataque */
      for (i = 1; i <= 3; i++)
      {
        aux1 = checa_casa(1,i);
        aux2 = checa_casa(2,i);
        aux3 = checa_casa(3,i);
        if ((aux1 == 2) && (aux2 == 0) && (aux3 == 0))
        {
             aux = checa_casa(2,i);
           if (aux == 0)
           {
                  domina_casa(2,i,2);
                  return 0;
            }
        }
        if ((aux2 == 2) && (aux1 == 0) && (aux3 == 0))
        {
             aux = checa_casa(1,i);
           if (aux == 0)
           {
                  domina_casa(1,i,2);
                  return 0;
            }
        }
        if ((aux3 == 2) && (aux1 == 0) && (aux2 == 0))
        {
             aux = checa_casa(1,i);
           if (aux == 0)
           {
                  domina_casa(1,i,2);
                  return 0;
            }
        }
        
        aux1 = checa_casa(i,1);
        aux2 = checa_casa(i,2);
        aux3 = checa_casa(i,3);
        if ((aux1 == 2) && (aux2 == 0) && (aux3 == 0))
        {
             aux = checa_casa(i,2);
           if (aux == 0)
           {
                  domina_casa(i,2,2);
                  return 0;
            }
        }
        if ((aux2 == 2) && (aux1 == 0) && (aux3 == 0))
        {
             aux = checa_casa(i,1);
           if (aux == 0)
           {
                  domina_casa(i,1,2);
                  return 0;
            }
        }
        if ((aux3 == 2) && (aux1 == 0) && (aux2 == 0))
        {
             aux = checa_casa(i,1);
           if (aux == 0)
           {
                  domina_casa(i,1,2);
                  return 0;
            }
        }
    }
    aux1 = checa_casa(1,1);
    aux2 = checa_casa(2,2);
    aux3 = checa_casa(3,3);
    if ((aux2 == 2) && (aux1 == 0) && (aux3 == 0))
    {
        aux = checa_casa(1,1);
       if (aux == 0)
       {
              domina_casa(1,1,2);
              return 0;
        }
    }
    
    aux1 = checa_casa(3,1);
    aux3 = checa_casa(1,3);
    if ((aux2 == 2) && (aux1 == 0) && (aux3 == 0))
    {
        aux = checa_casa(1,3);
       if (aux == 0)
       {
              domina_casa(1,3,2);
              return 0;
        }
    }
     
   aux1 = checa_casa(1,1);
   if (aux1 == 2)
   {
      aux2 = checa_casa(2,2);
      aux3 = checa_casa(3,3);
      if ((aux3 == 0) && (aux2 == 0))
      {
         aux1 = checa_casa(3,2);
         aux2 = checa_casa(1,2);
         if ((aux1 != 1) && (aux2 != 1))
         {
            aux1 = checa_casa(2,1);
            aux2 = checa_casa(2,3);
            if ((aux1 != 1) && (aux2 != 1))
            {
                    aux = checa_casa(3,3);
                      if (aux == 0)
                    {
                        domina_casa(3,3,2);
                   return 0;
                    }
                }
         }
        }
   }
   
    for (i = 1; i <= 3; i++)
    {
        aux1 = checa_casa(1,i);
        aux2 = checa_casa(2,i);
        aux3 = checa_casa(3,i);
        if (aux1 == 0)
        {
            domina_casa(1,i,2);
            return 0;
        }
        else if (aux2 == 0)
        {
            domina_casa(2,i,2);
            return 0;
        } 
        else if (aux3 == 0)
        {
            domina_casa(3,i,2);
            return 0;
        }
            
        aux1 = checa_casa(i,1);
        aux2 = checa_casa(i,2);
        aux3 = checa_casa(i,3);
        if (aux1 == 0)
        {
            domina_casa(i,1,2);
            return 0;
        }
        else if (aux2 == 0)
        {
            domina_casa(i,2,2);
            return 0;
        }
        else if (aux3 == 0)
        {
            domina_casa(i,3,2);
            return 0;
        } 
    }
}

int main() 
{
   int i;
   int tipo_de_jogo = 5;
   int jogador = 0;
   int aux;

   while ((tipo_de_jogo < 0) || (tipo_de_jogo > 2))
   {
      system(LIMPAR_TELA);

      cout << "[1] Jogador contra Jogador\n";
      cout << "[2] Jogador contra Computador\n";
      cout << "[0] Sair\n";

      if ((scanf("%d",&tipo_de_jogo)) == 0)
      {
         cout << "Huh?\n";
         getchar();
      }
   }

   if (tipo_de_jogo == 0)
      return 0;

   else if (tipo_de_jogo == 1)
   {
      for (i = 0; i < 9; i++)
      {
         jogador++;
         if (jogador > 2)
            jogador = 1;

         loop_jogo(jogador);

         aux = checa_win();
         if (aux != 0)
         {
            system(LIMPAR_TELA);
            desenhar_jogo();

            cout << "Vencedor: Jogador " << aux << "!";
            getchar(); getchar();
            return 0;
         }
      }
   }

   else if (tipo_de_jogo == 2)
   {
      for (i = 0; i < 9; i++)
      {
         jogador++;
         if (jogador > 2)
            jogador = 1;

         if (jogador == 1)
            loop_jogo(jogador);
         else if (jogador == 2)
            joga_computador();

         aux = checa_win();
         if (aux != 0)
         {
            system(LIMPAR_TELA);
            desenhar_jogo();

            if (aux == 1)
               cout << "Vencedor: Jogador!";
            else if (aux == 2)
               cout << "Vencedor: Computador!";

            getchar(); getchar();
            return 0;
         }
      }
   }

   if (tipo_de_jogo != 0) 
   {
      system(LIMPAR_TELA);
      desenhar_jogo();

      cout << "Empate!";
      getchar(); getchar();
      return 0;
   }
}

Scripts recomendados

Função split()

AGENDA DE COMPROMISSO

Google Code Jam 2010 - Africa Classification Round A

Jogo Final Fight - Haggar (com gráficos)

1o. joguinho Labirinto (com graficos).c


  

Comentários
[1] Comentário enviado por birilo em 12/05/2005 - 08:52h

Fala cara....

Eu fiz uma vez um algoritmo pra jogo da velha com uma IAzinha vagabunda (tem até um script no site)...
To fazendo outro um pouco melhor... realmente invencível

Olha a idéia, trabalha-se com árvores.

Inicialmente tem-se 9 nós, simbolizando as 9 casas livres do jogador. Ou seja, as 9 posições onde o computador possa marcar, e ainda vencer. Cada um desses 9 nós, terá 8 nós filhos, que serão as 8 jogadas aonde o Jogador pode marcar. Desses 8 nós, cada um terá 7 filhos, que será as posições que o computador pode marcar, e que poderá ganhar ou empatar.... e assim vai. O importante é que a arvore só contenha caminhos das posições aonde poderá ocorrer a vitória/empate da IA

Deste modo, o computador irá conhecer todas as jogadas possíveis, e no pior caso, a árvore terá 9! nós.

O interessante dessa inteligência (na verdade é um brute-force) é que é realmente impossível do jogador ganhar, visto que aquelas jogadas que se fazem nos 2 cantos, e depois no meio, para ter duas possibilidades de vitória, é inicialmente barrada pela IA. E qualquer outro tipo de jogada, é barrada mais facilmente ainda...

Ainda não coloquei o algoritmo aqui, porque está com problema pra calcular a árvore. Mas breve estará disponível... Mas fica a idéia pra quem quiser "filosofar" no assunto...

ë isso!
Abraços, Danilo

[2] Comentário enviado por hunz em 12/05/2005 - 12:56h

Na verdade, a IA que eu desenvolvi, checa as jogadas conhecidas para ocorrer a vitória e bloqueia elas. Tornando-se uma IA invencível. Heh.

Porém, desenvolver uma IA no estilo que eu desenvolvi para um jogo mais complexo (ex: Xadrez), seria muito mais dificil e complicado.

Então seu metódo seria mais aconselhado para um jogo com inumeras possibilidades estratégicas.

Como o jogo da velha só tem 9 casas e as estratégias possiveis são poucas, fiz esse IA bem fraco (porém, invencível).

Não entendi muito bem seu metódo para desenvolver a IA, se for possível me contatar e me explicar um pouco mais sobre ela, ficarei muito feliz e agradecido.

Me interesso bastante pelo conhecimento, seja ele qual for, e IA realmente chama minha atenção, se você quiser desenvolver algum projeto baseado no assunto, ficaria feliz em ajuda-lo.

Podes me contatar por MSN e por e-mail.
Meu MSN: tn_negri@hotmail.com
Meu e-mail: hunzinho@gmail.com

Ah! E o que seria um "brute-force"? Hehehe..

Abraços,
Fiquem com Deus.

[3] Comentário enviado por birilo em 12/05/2005 - 16:49h

Então cara....

Na verdade a minha idéia original era fazer um algoritmo para xadrez. Não deu. Tipo, ficou algo como 64 elevado a N, onde n é o número de jogadas necessárias para acabar o jogo....Incrívelmente grande o número de nós necessários.

Tentei com damas, mas ficou algo muito grande também, dae reduzi para um jogo da velha.....

Então, ser brute-force significa que ela é inteligente por força bruta, ou seja: Não existe bem uma IA. Por exemplo, os nossos algoritmos precisam verificar todas as jogadas possíveis, para achar uma solução. Um algoritmo com IA não iria verificar posições "inúteis".

Tem um código fonte q um cara fez de monografia sobre IA no xadrez, usando algoritmos genéticos... Eu não intendo nda disso, mas a idéia do cara dá pra pegar no artigo... dê uma procurada no google.

Qdo tiver mais informações te contato... Não cheguei a testar seu código, pq to sem linux aqui, mas essa semana ainda eu testo e te digo oq achei...

Abraços, Danilo

[4] Comentário enviado por hunz em 15/05/2005 - 12:34h

Update:
http://www.vivaolinux.com.br/scripts/verScript.php?codigo=1102

Esta IA está com defeito, tem várias brechas para ganhar do computador.
No update tem a IA arrumada e está em SDL (modo gráfico) utilizando Mouse e tudo mais. Está bem melhor..

Abraços,
Fiquem com Deus.

[5] Comentário enviado por fredwind em 01/10/2005 - 11:32h

pow kra eu ja percbi q c gosta de um joguinho da velha!!!! ja vi alguns códigos q vc posta por aqui!! kra eu sou iniciante em linguagem C, mas sou louquinho pra criar um jogo desses, acho q c pode me ajudar. Num pode? eu qria umas diks, qria começar com um código pequeno!!! me da uma mã kra!!! me manda um email faloww!!! valeuuuu!!

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

eai cara blz...olha só to super apertado no curso velho!!!

e meu professor pediu um trabalho sobre um jogo da velha em linguagem c... só q ele disse q nao pode ser em c++

seria grato parceiro!!! c tu me quebrasse esse galho...

felipe_19@brturbo.com.br

[7] Comentário enviado por coelhinho_19 em 06/01/2006 - 22:22h

valeu cara!!!

[8] Comentário enviado por vinicius.nsilva em 01/10/2006 - 11:04h

E ai cara beleza????
to precisando fazer um jogo da velha tb com o uso de IA,
porem eu não consigo entender a medar do algoritimo
que faz a busca pela melhor escolha! vc teria algo para colaborar
no meu programa???

vinicius.nsilva@gmail.com

[9] Comentário enviado por gustavofiorese em 23/04/2009 - 19:51h

E ai Beleza galera!!

Galera to precisando muito do codigo fonte do jogo da velha em fortran, Trabalho de faculdade é foda, a UFES ainda utiliza FORTRAN, nos cursos de engenharia civil.

Eu gostei muito do seu jogo brohter, com o cumputador invencivel, se vcs puderem me ajudar agraço muito, o nivel do seu jogo é otimo!

Da uma ajuda a galera, desde ja agradeço!

mais contato: gustavofiorese@hotmail.com


[10] Comentário enviado por gustavofiorese em 23/04/2009 - 19:57h

E ai Beleza galera!!

Galera to precisando muito do codigo fonte do jogo da velha em fortran, Trabalho de faculdade é foda, a UFES ainda utiliza FORTRAN, nos cursos de engenharia civil.

Eu gostei muito do seu jogo brohter, com o cumputador invencivel, se vcs puderem me ajudar agraço muito, o nivel do seu jogo é otimo!

Da uma ajuda a galera, desde ja agradeço!

mais contato: gustavofiorese@hotmail.com

[11] Comentário enviado por jomarumu em 03/01/2010 - 17:05h

KKKKKKKKK
Só empate.
É bem chato não perder e nem ganhar, mas é um ótimo software, mostra a capacidade de um simples código ser tão bom (ou melhor) quanto um humano.
O código funciona perfeitamente.
Parabéns.

[12] Comentário enviado por xoshy em 20/06/2010 - 20:30h

Eu sempre achei que o mais difícil de uma IA é torná-la VENCÍVEL (exceto para jogos muito complexos, como o xadrez), pois é fácil para um computador analisar todas as possibilidades e avaliar qual é a melhor, mas em que momento ele não irá escolher a melhor e deixar o pobre humano ganhar? Isto ser aleatório não tem graça, tem que ser possível escolher a "força" da IA. E isso eu não tenho ideia ainda de como fazer.

[13] Comentário enviado por matheusftboy em 05/01/2011 - 22:35h

estou trabalhando num projeto semelhante, porém em python, e estou pensando em fazer algo usando árvores minimax como estrutura principal de decisão, e queria saber se alguém já fez isso em python e se tem como simular (ou implementar de fato) uma minimax em python

[14] Comentário enviado por heldercarvalho em 19/12/2014 - 20:05h

Sei vai ser dificil alguém me responder, pois estes postes são de muito tempo atrás. Mas preciso dar AI a este código do jogo da velha abaixo para meu projeto para meu projeto. Por favor se alguém quebrar essa pra estarei super grato.

e-mail: helder7x@gmail.com

Código ( ele está apenas jogando aleatóriamente):


char tabuleiro[9] = {'-', '-', '-', '-', '-', '-', '-', '-', '-'};
int contamarcacao = 0; //conta quantas marcacoes foram realizadas
void setup() {
Serial.begin(9600);
randomSeed(analogRead(0));
}

// the loop routine runs over and over again forever:
void loop()
{ char comando;
int conta;
if (Serial.available() > 0) //verifica se algo foi enviado para a porta serial
{ comando = Serial.read(); //ler a porta serial
if (comando == 'N') //verifica ser foi enviado 'N' para inciar novo jogo
{ for (conta=0;conta<9;conta++) tabuleiro[conta] = '-'; // incializa tabuleiro
contamarcacao = 0; //zera contador de marcacao
Serial.print('n'); //envia 'n' indicando que inicia novo jogo
}
if ((comando == '#') & (contamarcacao == 0)) joga(); //verifica se eh para iniciar o jogo
if ((comando >= 48) & (comando <= 56) & (tabuleiro[comando-48] == '-')) //verifica se recebeu uma marcaco valida e vazia
{ tabuleiro[comando-48] = 'o'; // adversario devera ser 'o'
contamarcacao = contamarcacao + 1;
if (contamarcacao < 9) joga(); // testa para verificar se ainda nao tiveram 9 marcacoes
}
if (contamarcacao == 9) Serial.print("E"); // testa se tiveram 9 marcacoes, se sim, considera empate
}
}

void joga (void) // realiza uma jogada atraves de sorteio de um numero
{ char marcacao;
do
{ marcacao = random(0,9); //sorteia um numero
} while (tabuleiro[marcacao] != '-'); //repete sorteio ate ter uma marcacao valida
tabuleiro[marcacao] = 'x'; //marca tabuleiro com 'x'
marcacao = marcacao + 48; //marcacao recebe valor em ascii
Serial.print(marcacao); //envia valor pela serial
contamarcacao = contamarcacao + 1;
};


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts