Acerte a carta

Publicado por Xerxes (última atualização em 01/06/2016)

[ Hits: 3.465 ]

Homepage: -

Download 6408.cartas.sh




Na sua frente há três cartas viradas. Duas delas tem estrelas brancas e apenas uma tem estrela preta.

Você deve adivinhar onde está a carta com a estrela preta.

Após escolher sua carta, uma carta de estrela branca será revelada.  Cabe a você, então, escolher se continua com a sua primeira escolha ou se troca de carta.

Sim, esta é uma variação do problema de Monty Hall. Mostra na prática se é mais vantajoso, ou não, trocar de carta.

  



Esconder código-fonte

#!/bin/bash
#
# ----------------------------------------------------------------------
# Na sua frente há três cartas viradas. Duas delas tem estrelas brancas e
# apenas uma tem estrela preta.
#
# Você deve adivinhar onde está a carta com a estrela preta.
#
# Após escolher sua carta, uma carta de estrela branca será revelada.
# Cabe a você, então, escolher se continua com a sua primeira escolha ou
# Se troca de carta.
#
# Sim, esta é uma variação do problema de Monty Hall.
# Mostra na prática se é mais vantajoso, ou não, trocar de carta.
#
# ----------------------------------------------------------------------
#
# Autor: Xerxes Lins (xerxeslins@gmail.com) vivaolinux.com.br/~xerxeslins
#
# Versão 1.0b - 25/04/2016
#
# ----------------------------------------------------------------------
#

# Define qual das três é a carta certa
function _certa {
   CERTA=$(( ( RANDOM % 3 )  + 1 ))
}

# "Redesenha" as cartas
function _atualiza_cartas {
   DESENHO="  $FIG_CARTA1 $FIG_CARTA2 $FIG_CARTA3"
}

# Vira todas as cartas para baixo
function _vira_cartas {
   FIG_CARTA1="🂠"
   FIG_CARTA2="🂠"
   FIG_CARTA3="🂠"
}

# Vira todas as cartas para cima
function _vira_cartas2 {
   FIG_CARTA1="🃟"
   FIG_CARTA2="🃟"
   FIG_CARTA3="🃟"
}

# Ao final do jogo exibe sua taxa de sucesso
function _stats {
   
   # Com contribuição do Lcavalheiro para obter casas decimais
   VIT_PERCENT=$(bc -l <<< "scale=2 ; $WIN_TROCA / $TOTAL_ROLLS  * 100 ")
   #LOS_PERCENT=$(( ( $LOSE_TROCA / $LOSE ) * 100 ))
   clear
   echo "De todas as suas tentativas ($TOTAL_ROLLS), $VIT_PERCENT% dos acertos ocorreram quando você trocou de carta."
   #echo "De todas os seus erros, $LOS_PERCENT% ocorreram quando você trocou de carta."
}

# Fim do jogo
function _finalizou {
   clear
   echo ""
   echo "$FRASE_FINAL"
   echo ""
   echo "A carta certa era a de número $CERTA!"
   _atualiza_cartas
   echo ""
   echo "$DESENHO"
   echo ""
   ERRADA=0
   echo "Continuar? (S/*)"
   read CONT
   case $CONT in
   s|S) NOVO_JOGO=0 && TROCA=0 && _vira_cartas && _jogo ;;
   *) _stats && exit;;
   esac
}

# Verifica se a carta escolhida é a certa
function _checa {
   
   # Contador de tentativas
   TOTAL_ROLLS=$(( $TOTAL_ROLLS + 1 ))
   
   # Verifica se houve troca
   if [ $OLD_CARD != $ESCOLHIDA ]
      then
         TROCA=yes
   fi
   
   # Desvira todas e "pinta" a certa
   _vira_cartas2
   if [ $CERTA = 1 ]
      then
         FIG_CARTA1="&#127183;"
      elif [ $CERTA = 2 ]
         then
            FIG_CARTA2="&#127183;"
      else
         FIG_CARTA3="&#127183;"
   fi
   
   # Acertou ou errou?
   if [ $ESCOLHIDA -eq $CERTA ]
      then
         FRASE_FINAL="Você acertou!!!"
         WIN=$(( $WIN + 1 ))
         
         # Se teve troca, lembra disso
         if [ $TROCA == yes ]
            then
               WIN_TROCA=$(( $WIN_TROCA + 1 ))
         fi
      else
         FRASE_FINAL="Você errou!!!"
         LOSE=$(( $LOSE + 1 ))
         
         # Se teve troca, lembra disso
         if [ $TROCA == yes ]
            then
               LOSE_TROCA=$(( $LOSE_TROCA + 1 ))
         fi
   fi
   _finalizou
}

# Após escolher a carta, pergunta se quer trocar
function _escolha1() {
   clear
   _vira_cartas
   
   # Se o jogo for "novo" então lembra se houve troca
   if [ $NOVO_JOGO -eq 1 ]
      then OLD_CARD=$1
   fi
   
   # carta escolhida pelo jogador
   ESCOLHIDA=$1
   
   # Carta errada
   ERRADA=1
   while [ "$ERRADA" = "$ESCOLHIDA" ] || [ "$ERRADA" = "$CERTA" ]; do
    ERRADA=$(( ( RANDOM % 3 )  + 1 ))
    done
    
    # Carta que "sobra"
    SOBRA=1
   while [ "$SOBRA" = "$ESCOLHIDA" ] || [ "$SOBRA" = "$ERRADA" ]; do
    SOBRA=$(( ( RANDOM % 3 )  + 1 ))
    done   
    
    # Desvira a carta errada
    if [ $ERRADA = 1 ]
      then
         FIG_CARTA1="&#127199;"
      elif [ $ERRADA = 2 ]
         then
            FIG_CARTA2="&#127199;"
      else
         FIG_CARTA3="&#127199;"
   fi
   
   _atualiza_cartas
   echo "
Você escolheu a carta $ESCOLHIDA.

Revelação:
   
A carta certa NÃO É a carta $ERRADA

$DESENHO
   
Gostaria de trocar para a carta $SOBRA? (S/N)"
   read RESPOSTA
   case $RESPOSTA in
   s|S) ESCOLHIDA=$SOBRA && _checa ;;
   n|N) _checa ;;
   *) clear && echo "Opção inválida. Saindo..." && exit ;;
   esac
   
}

# Jogo principal
function _jogo {
   
   # Contador para saber se é novo
   NOVO_JOGO=$(( $NOVO_JOGO + 1 ))
   clear
   _atualiza_cartas
   echo "
   
Onde está a carta certa (&#127183;)?
   
Cartas (1, 2 e 3):
   
$DESENHO
   
Escolha uma carta...

________________________________

Acertos
totais       $WIN
   
Acertos 
após trocar
de carta     $WIN_TROCA
   
Erros
totais       $LOSE
   
Erros 
após trocar
de carta     $LOSE_TROCA


(X e Enter para sair)"
   
   read CARD
   case $CARD in
   1|2|3) _escolha1 $CARD ;;
   x|X) _stats && exit ;;
   *) clear && echo "Opção inválida. Escolha 1, 2 ou 3." && sleep 2 && _jogo ;;
   esac
}

# Função do começo
function _start {
   _vira_cartas
   NOVO_JOGO=0
   TOTAL_ROLLS=0
   ERRADA=0
   ESCOLHIDA=0
   WIN=0
   LOSE=0
   WIN_TROCA=0
   LOSE_TROCA=0
   _certa
   _jogo
}

# Começa o jogo
_start

Scripts recomendados

Instalador de Minecraft

Baixar Naruto Shippuden

usando a lixeira em modo texto

Shell Script para Guia Foca Linux

Migrar de MySQL 3.x e 4.x para 5.0 no Debian


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts