Jogo da Velha com IA - Usuário vs Máquina
Publicado por Perfil removido (última atualização em 27/10/2012)
[ Hits: 5.997 ]
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/
#!/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
Organização de pastas para trabalhos topográficos.
Script que calcula os End.Rede e Broadcast
Escolhendo os diretorios e fazendo backup com Logs
organização_topografia quarto arquivo
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
Warcraft II Remastered no Linux? (4)
O programa assinador digital (5)









