Acerte a carta

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

[ Hits: 3.463 ]

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

Script de logon

Utilitario de montagem

Testar link

Script para obter informações do tempo

Script de backup para banco Firebird


  

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