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/
#!/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
Criar servidor, montar cliente e verificar montagens no NFS (Gentoo)
Um jogo "jokenpo" usando shell script
Baixando Fotos de Qualquer Câmera Digital
Gerar lista de IPs em arquivo texto
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Desempenho abaixo do esperado - travadas e congelamento do sistema ope... (4)
Bash ao invés de Fish no CachyOS (1)
Linux rodando do hd externo ou ssd? (4)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta