Jogo da Velha com IA - Usuário vs Máquina

Publicado por Perfil removido (última atualização em 27/10/2012)

[ Hits: 5.753 ]

Download jogo_da_velha_vs_pc.sh




Olá,

Sei que existem vários modelos de jogo da velha, mas gostaria de compartilhar o meu próprio script do Jogo da Velha, com inteligência artificial... ou quase isso.

Utilidade:

- Fins de estudos
- Testes
- Ampliar os conhecimentos de Shell Script

Claro, esse script não é nenhum belo exemplo de programação... mas já é um começo.

Instalação:

Baixe o script (ou copie o texto) e salve com o nome desejado, ex.: jogo_da_velha.sh

Dê permissões:

$ chmod 777 jogo_da_velha.sh

Execute:

$ bash ./jogo_da_velha.sh

Regras básicas do Jogo da Velha: o usuário terá que vencer seu adversário (computador) tentando fazer uma sequência de 3 casas na vertical, horizontal ou na diagonal, vencendo seu adversário.

O funcionamento é básico: O jogador inicia com a primeira jogada, o computador é o próximo, e assim sucessivamente.

- Quando a máquina detecta uma "possível jogada" do usuário, ou seja: quando o computador detecta que o usuário está tentando fazer uma sequencia de 3 "X", o computador tenta barrá-lo.
- Quando o computador detecta uma "possível jogada" de si mesmo, ele tenta fazer uma sequência de 3.
- Quando o computador não detecta nenhuma jogada aparente, ele lança um valor aleatório. Isso é muito comum em inícios de jogadas, onde há várias casas livres e quando não há mais sequências possíveis de serem feitas, inutilizando e encerrando o jogo atual.

Ao identificar um vencedor, o computador explode, ops, o script identificará a sequência de 3 casas e as sinalizará pela cor Verde-negrito*.

*Depende do terminal em execução.

Exemplo de jogada, onde o jogador X vence:

X | O | O
O | X | O
O | X | X

A matriz do jogo é constituída de 3x3 casas, sendo essas:

1 | 2 | 3
4 | 5 | 6
7 | 8 | 9

O jogador, por sua vez, deverá digitar o número da casa desejada, sendo o valor de 1 a 9, desde que esta casa não esteja ocupada.

Bugs atuais: nenhum identificado até agora...

*Não vale relatar bug caso você não consiga ganhar do computador, haha, isso depende muito da prática.

Mas caso você detecte algum bug, conte como reproduzi-lo que assim que possível irei postar uma correção.

Grande abraço, de Motomagx!

Quer mais uma dica de script? Aqui está: http://vivaolinux.com.br/dica/Kernel-for-Newbies-Facil-Assistente-de-Compilacao-do-Kernel/

  



Esconder código-fonte

#!/bin/bash

# By: Motomagx - facebook.com/motomagx

A=" "
B=" "
C=" "
D=" "
E=" "
F=" "
G=" "
H=" "
I=" "

ERROR=0
INITUSER=X

_table()
{
   clear
   echo -e "\n"
   echo -e "    $A | $B | $C "
   echo -e "   -----------"
   echo -e "    $D | $E | $F "
   echo -e "   -----------"
   echo -e "    $G | $H | $I "
   echo -e "\n"
}

_testfail()
{
   COUNTER=0
   if [ "$A" != " " ]
   then
      COUNTER=$(($COUNTER+1))
   fi
   if [ "$B" != " " ]
   then
      COUNTER=$(($COUNTER+1))
   fi
   if [ "$C" != " " ]
   then
      COUNTER=$(($COUNTER+1))
   fi
   if [ "$D" != " " ]
   then
      COUNTER=$(($COUNTER+1))
   fi
   if [ "$E" != " " ]
   then
      COUNTER=$(($COUNTER+1))
   fi
   if [ "$F" != " " ]
   then
      COUNTER=$(($COUNTER+1))
   fi
   if [ "$G" != " " ]
   then
      COUNTER=$(($COUNTER+1))
   fi
   if [ "$H" != " " ]
   then
      COUNTER=$(($COUNTER+1))
   fi
   if [ "$I" != " " ]
   then
      COUNTER=$(($COUNTER+1))
   fi
   
   if [ $COUNTER == 9 ]
   then
      echo -e " Nenhum vencedor.\n"
      exit
   fi 
}

_random()
{
   _testfail

   STOP1=0
   while [ $STOP1 != 1 ]
   do
      NUMBER=`echo $((RANDOM %8))`
      NUMBER=$(($NUMBER+1)) # Esta ação é necessária para previnir que o número 0 seja sorteado
      case $NUMBER in
         1) if [ "$A" == " " ]
            then
            A=O
            STOP1=1
            fi ;;
         2) if [ "$B" == " " ]
            then
            B=O
            STOP1=1
            fi ;;
         3) if [ "$C" == " " ]
            then
            C=O
            STOP1=1
            fi ;;
         4) if [ "$D" == " " ]
            then
            D=O
            STOP1=1
            fi ;;
         5) if [ "$E" == " " ]
            then
            E=O
            STOP1=1
            fi ;;
         6) if [ "$F" == " " ]
            then
            F=O
            STOP1=1
            fi ;;
         7) if [ "$G" == " " ]
            then
            G=O
            STOP1=1
            fi ;;
         8) if [ "$H" == " " ]
            then
            H=O
            STOP1=1
            fi ;;
         9) if [ "$I" == " " ]
            then
            I=O
            STOP1=1
            fi ;;
      esac
   done
}

_display()
{
   PLAYER=X
   _check_for_winner

   PLAYER=O
   _check_for_winner

   _table

   _testfail

   if [ $INITUSER == X ]
   then
      ERROR=0

      echo -e " Jogador $INITUSER, selecione uma peça:" 

      read SELECT
   else
      MOVED=0

   if [ $MOVED == 0 ]
   then
      if [ "$A $B $C" == "  O O" ]
      then
         A=O
         NUMBER=1
         MOVED=1
      fi
   fi
   if [ $MOVED == 0 ]
   then
      if [ "$A $B $C" == "O   O" ]
      then
         B=O
         NUMBER=2
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$A $B $C" == "O O  " ]
      then
         C=O
         NUMBER=3
         MOVED=1
      fi
   fi

################################################################################

   if [ $MOVED == 0 ]
   then
      if [ "$D $E $F" == "  O O" ]
      then
         D=O
         NUMBER=4
         MOVED=1
      fi
   fi
   if [ $MOVED == 0 ]
   then
      if [ "$D $E $F" == "O   O" ]
      then
         E=O
         NUMBER=5
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$D $E $F" == "O O  " ]
      then
         F=O
         NUMBER=6
         MOVED=1
      fi
   fi
   

################################################################################

   if [ $MOVED == 0 ]
   then
      if [ "$G $H $I" == "  O O" ]
      then
         G=O
         NUMBER=7
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$G $H $I" == "O   O" ]
      then
         H=O
         NUMBER=8
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$G $H $I" == "O O  " ]
      then
         I=O
         NUMBER=9
         MOVED=1
      fi
   fi
   

################################################################################

   if [ $MOVED == 0 ]
   then
      if [ "$A $D $G" == "  O O" ]
      then
         A=O
         NUMBER=1
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$A $D $G" == "O   O" ]
      then
         D=O
         NUMBER=4
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$A $D $G" == "O O  " ]
      then
         G=O
         NUMBER=7
         MOVED=1
      fi
   fi
   

################################################################################

   if [ $MOVED == 0 ]
   then
      if [ "$B $E $H" == "  O O" ]
      then
         B=O
         NUMBER=2
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$B $E $H" == "O   O" ]
      then
         E=O
         NUMBER=5
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$B $E $H" == "O O  " ]
      then
         H=O
         NUMBER=8
         MOVED=1
      fi
   fi
   

################################################################################

   if [ $MOVED == 0 ]
   then
      if [ "$C $F $I" == "  O O" ]
      then
         C=O
         NUMBER=3
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$C $F $I" == "O   O" ]
      then
         F=O
         NUMBER=6
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$C $F $I" == "O O  " ]
      then
         I=O
         NUMBER=9
         MOVED=1
      fi
   fi
   

################################################################################

   if [ $MOVED == 0 ]
   then
      if [ "$A $E $I" == "  O O" ]
      then
         A=O
         NUMBER=1
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$A $E $I" == "O   O" ]
      then
         E=O
         NUMBER=5
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$A $E $I" == "O O  " ]
      then
         I=O
         NUMBER=9
         MOVED=1
      fi
   fi
   

################################################################################

   if [ $MOVED == 0 ]
   then
      if [ "$C $E $G" == "  O O" ]
      then
         C=O
         NUMBER=3
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$C $E $G" == "O   O" ]
      then
         E=O
         NUMBER=5
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then

      if [ "$C $E $G" == "O O  " ]
      then
         G=O
         NUMBER=7
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$A $B $C" == "  X X" ]
      then
         A=O
         NUMBER=1
         MOVED=1
      fi
   fi
   if [ $MOVED == 0 ]
   then
      if [ "$A $B $C" == "X   X" ]
      then
         B=O
         NUMBER=2
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$A $B $C" == "X X  " ]
      then
         C=O
         NUMBER=3
         MOVED=1
      fi
   fi
   

################################################################################

   if [ $MOVED == 0 ]
   then
      if [ "$D $E $F" == "  X X" ]
      then
         D=O
         NUMBER=4
         MOVED=1
      fi
   fi
   if [ $MOVED == 0 ]
   then
      if [ "$D $E $F" == "X   X" ]
      then
         E=O
         NUMBER=5
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$D $E $F" == "X X  " ]
      then
         F=O
         NUMBER=6
         MOVED=1
      fi
   fi
   

################################################################################

   if [ $MOVED == 0 ]
   then
      if [ "$G $H $I" == "  X X" ]
      then
         G=O
         NUMBER=7
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$G $H $I" == "X   X" ]
      then
         H=O
         NUMBER=8
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$G $H $I" == "X X  " ]
      then
         I=O
         NUMBER=9
         MOVED=1
      fi
   fi
   

################################################################################

   if [ $MOVED == 0 ]
   then
      if [ "$A $D $G" == "  X X" ]
      then
         A=O
         NUMBER=1
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$A $D $G" == "X   X" ]
      then
         D=O
         NUMBER=4
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$A $D $G" == "X X  " ]
      then
         G=O
         NUMBER=7
         MOVED=1
      fi
   fi
   

################################################################################

   if [ $MOVED == 0 ]
   then
      if [ "$B $E $H" == "  X X" ]
      then
         B=O
         NUMBER=2
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$B $E $H" == "X   X" ]
      then
         E=O
         NUMBER=5
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$B $E $H" == "X X  " ]
      then
         H=O
         NUMBER=8
         MOVED=1
      fi
   fi
   

################################################################################

   if [ $MOVED == 0 ]
   then
      if [ "$C $F $I" == "  X X" ]
      then
         C=O
         NUMBER=3
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$C $F $I" == "X   X" ]
      then
         F=O
         NUMBER=6
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$C $F $I" == "X X  " ]
      then
         I=O
         NUMBER=9
         MOVED=1
      fi
   fi
   

################################################################################

   if [ $MOVED == 0 ]
   then
      if [ "$A $E $I" == "  X X" ]
      then
         A=O
         NUMBER=1
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$A $E $I" == "X   X" ]
      then
         E=O
         NUMBER=5
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$A $E $I" == "X X  " ]
      then
         I=O
         NUMBER=9
         MOVED=1
      fi
   fi
   

################################################################################

   if [ $MOVED == 0 ]
   then
      if [ "$C $E $G" == "  X X" ]
      then
         C=O
         NUMBER=3
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then
      if [ "$C $E $G" == "X   X" ]
      then
         E=O
         NUMBER=5
         MOVED=1
      fi
   fi
   
   if [ $MOVED == 0 ]
   then

      if [ "$C $E $G" == "X X  " ]
      then
         G=O
         NUMBER=7
         MOVED=1
      fi
   fi
   
################################################################################


      if [ $MOVED == 0 ]
      then
         _random
      fi

      echo " Peça selecionada: $NUMBER"
      sleep 1s
      INITUSER=X
   fi
}

_imput()
{
   case $SELECT in
      1) if [ "$A" == " " ]
         then
         A=$INITUSER
         STOP=1
         else
         ERROR=1
         fi ;;

      2) if [ "$B" == " " ]
         then
         B=$INITUSER
         STOP=1
         else
         ERROR=1
         fi ;;

      3) if [ "$C" == " " ]
         then
         C=$INITUSER
         STOP=1
         else
         ERROR=1
         fi ;;

      4) if [ "$D" == " " ]
         then
         D=$INITUSER
         STOP=1
         else
         ERROR=1
         fi ;;

      5) if [ "$E" == " " ]
         then
         E=$INITUSER
         STOP=1
         else
         ERROR=1
         fi ;;

      6) if [ "$F" == " " ]
         then
         F=$INITUSER
         STOP=1
         else
         ERROR=1
         fi ;;

      7) if [ "$G" == " " ]
         then
         G=$INITUSER
         STOP=1
         else
         ERROR=1
         fi ;;

      8) if [ "$H" == " " ]
         then
         H=$INITUSER
         STOP=1
         else
         ERROR=1
         fi ;;

      9) if [ "$I" == " " ]
         then
         I=$INITUSER
         STOP=1
         else
         ERROR=1
         fi ;;
   esac
}

_winner()
{
   if [ $PLAYER == X ]
   then
      echo -e "\n\n O jogador é o vencedor!\n"
   else
      echo -e "\n\n O computador é o vencedor!\n"
   fi

   exit
}

_check_for_winner()
{

# Linhas:

   if [ "$A $B $C" == "$PLAYER $PLAYER $PLAYER" ]
   then
      clear
      echo
      echo
      echo -e "    {FONTE}33[1;32m$A{FONTE}33[0m | {FONTE}33[1;32m$B{FONTE}33[0m | {FONTE}33[1;32m$C{FONTE}33[0m "
      echo -e "   -----------"
      echo -e "    $D | $E | $F "
      echo -e "   -----------"
      echo -e "    $G | $H | $I "

      _winner
   fi

   if [ "$D $E $F" == "$PLAYER $PLAYER $PLAYER" ]
   then
      clear
      echo
      echo
      echo -e "    $A | $B | $C "
      echo -e "   -----------"
      echo -e "    {FONTE}33[1;32m$D{FONTE}33[0m | {FONTE}33[1;32m$E{FONTE}33[0m | {FONTE}33[1;32m$F{FONTE}33[0m "
      echo -e "   -----------"
      echo -e "    $G | $H | $I "

      _winner
   fi

   if [ "$G $H $I" == "$PLAYER $PLAYER $PLAYER" ]
   then
      clear
      echo
      echo
      echo -e "    $A | $B | $C "
      echo -e "   -----------"
      echo -e "    $D | $E | $F "
      echo -e "   -----------"
      echo -e "    {FONTE}33[1;32m$G{FONTE}33[0m | {FONTE}33[1;32m$H{FONTE}33[0m | {FONTE}33[1;32m$I{FONTE}33[0m "

      _winner
   fi

# Colunas:

   if [ "$A $D $G" == "$PLAYER $PLAYER $PLAYER" ]
   then
      clear
      echo
      echo
      echo -e "    {FONTE}33[1;32m$A{FONTE}33[0m | $B | $C "
      echo -e "   -----------"
      echo -e "    {FONTE}33[1;32m$D{FONTE}33[0m | $E | $F "
      echo -e "   -----------"
      echo -e "    {FONTE}33[1;32m$G{FONTE}33[0m | $H | $I "

      _winner
   fi

   if [ "$B $E $H" == "$PLAYER $PLAYER $PLAYER" ]
   then
      clear
      echo
      echo
      echo -e "    $A | {FONTE}33[1;32m$B{FONTE}33[0m | $C "
      echo -e "   -----------"
      echo -e "    $D | {FONTE}33[1;32m$E{FONTE}33[0m | $F "
      echo -e "   -----------"
      echo -e "    $G | {FONTE}33[1;32m$H{FONTE}33[0m | $I "

      _winner
   fi

   if [ "$C $F $I" == "$PLAYER $PLAYER $PLAYER" ]
   then
      clear
      echo
      echo
      echo -e "    $A | $B | {FONTE}33[1;32m$C{FONTE}33[0m "
      echo -e "   -----------"
      echo -e "    $D | $E | {FONTE}33[1;32m$F{FONTE}33[0m "
      echo -e "   -----------"
      echo -e "    $G | $H | {FONTE}33[1;32m$I{FONTE}33[0m "

      _winner
   fi

# Diagonais:

   if [ "$A $E $I" == "$PLAYER $PLAYER $PLAYER" ]
   then
      clear
      echo
      echo
      echo -e "    {FONTE}33[1;32m$A{FONTE}33[0m | $B | $C "
      echo -e "   -----------"
      echo -e "    $D | {FONTE}33[1;32m$E{FONTE}33[0m | $F "
      echo -e "   -----------"
      echo -e "    $G | $H | {FONTE}33[1;32m$I{FONTE}33[0m "

      _winner
   fi

   if [ "$C $E $G" == "$PLAYER $PLAYER $PLAYER" ]
   then
      clear
      echo
      echo
      echo -e "    $A | $B | {FONTE}33[1;32m$C{FONTE}33[0m "
      echo -e "   -----------"
      echo -e "    $D | {FONTE}33[1;32m$E{FONTE}33[0m | $F "
      echo -e "   -----------"
      echo -e "    {FONTE}33[1;32m$G{FONTE}33[0m | $H | $I "

      _winner
   fi
}

while true
do
   STOP=0

   while [ $STOP != 1 ]
   do
      _display
      _imput
   done

   if [ $INITUSER == X ]
   then
      INITUSER=O
   else
      INITUSER=X
   fi
done



Scripts recomendados

Criar servidor, montar cliente e verificar montagens no NFS (Gentoo)

Um jogo "jokenpo" usando shell script

WPA-ELFaVirgin 0.1

Baixando Fotos de Qualquer Câmera Digital

Gerar lista de IPs em arquivo texto


  

Comentários
[1] Comentário enviado por fabio em 27/10/2012 - 12:56h

Muito bom, parabéns!

[2] Comentário enviado por 999mb em 27/10/2012 - 13:14h

isso é util pra quem quer aprender programar, boa ideia, e obrigado

[3] Comentário enviado por julio_hoffimann em 28/10/2012 - 14:21h

Parabéns!

O código é braçal, mas o resultado é interessante.

Abraço!

[4] Comentário enviado por albertguedes em 29/10/2012 - 15:26h

Muito interessante. Parabéns motomagx. :D


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts