Jogo: racha-cuca

Publicado por Xerxes (última atualização em 12/04/2017)

[ Hits: 2.468 ]

Homepage: -

Download racha_cuca-v1b.sh




Jogo da minha infância recriado em shell script.

Quem não conhece o jogo racha-cuca? Veja imagem: http://bit.ly/2mlvanM

Veja no cabeçalho do script como jogar.

  



Esconder código-fonte

#!/bin/bash

# RACHA CUCA v1.0
# Criado em 05/03/2017
# Xerxes Lins (www.vivaolinux.com.br/~xerxeslins)
# GPL

#   COMO JOGAR:
#
#   Objetivo: colocar os números na ordem de 01 até 15. Assim:
#
#   +----+----+----+----+
#   | 01 | 02 | 03 | 04 |
#   +----+----+----+----+
#   | 05 | 06 | 07 | 08 |
#   +----+----+----+----+
#   | 09 | 10 | 11 | 12 |
#   +----+----+----+----+
#   | 13 | 14 | 15 | __ |
#   +----+----+----+----+
#
#   Para mover um NÚMERO para o espaço vazio você deve usar as setas 
#   direcionais (cima, baixo, direita e esquerda). Para que não haja confusão:
#   as setas movem os NÚMEROS e não o espaço vazio (__).
#   
#   Para fechar o jogo use Ctrl+c.
#
#   Obs.: aleatoriamente nem toda configuração inicial permite a resolução
#   do problema, mas o script só cria problemas solúveis.
#
########################################################################

bold=$(tput bold)
normal=$(tput sgr0)

function _embaralha_tudo () {
   #Embaralha uma lista de números consecutivos (01 a 15)
   X=$( shuf -e $(seq -w 01 15))

   #Adiciona os números embaralhados ao vetor Y
   for i in {0..14}; do
      Y[$i]=$(echo $X | cut -d " " -f $(( $i + 1 )) )
   done

   #Atribui o espaço vazio
   VAZIO=15
   Y[$VAZIO]="__"
   
   #Checa se o jogo tem solução. Se não tiver, refaz o jogo.
   #Para mais informações:
   #http://www.geeksforgeeks.org/check-instance-15-puzzle-solvable/
   _inversoes
   if [ $(( $INVERSAO % 2)) -eq 0 ]
      then
         _desenha
      else
         _embaralha_tudo
   fi
}

#Conta o número de inversões
function _inversoes () {
   INVERSAO=0
   for i in {0..13}; do
      N1=$(echo ${Y[$i]})
      x=$(( $i + 1 ))
      while [ $x -lt 15 ]
      do
         N2=$(echo ${Y[$x]})
         if [ $N1 -gt $N2 ]
            then
               INVERSAO=$(( $INVERSAO + 1 ))
         fi
         x=$(( $x + 1 ))
         clear
         echo "Criando um problema solúvel. Aguarde...
         "
         echo "$i. $N1 > $N2 ($INVERSAO)"
         sleep 0.02
      done
   done
}

#Função que enconta o índice da casa vazia no vetor
function _vazio () {
   for i in {0..15}; do
      if [ "${Y[$i]}" == "__" ]
         then
            VAZIO=$i
      fi
   done
}

#Compara cada casa para ver se está na ordem certa
function _conseguiu () {
   FINAL=$(echo $(sort <<<"${X[@]:0:44}"))
   ATUAL=${Y[@]:0:15}
   if [ "$ATUAL" == "$FINAL" ]
      then
            #Exibe a mensagem e encerra!
            echo "CONSEGUIU!!!
            "
            exit 0
   fi   
}

#Realiza o movimento da troca
function _move () {
   TEMP=${Y[$POSICAO]}
   Y[$POSICAO]=${Y[$VAZIO]}
   Y[$VAZIO]=$TEMP   
}

#Função para trocar ao pressionar as setas
function _troca () {
   
   #Verifica distância entre o número que deseja mover e a casa vazia.
   #Isso determina a direção (esquerda, direita, cima e baixo).
   DIST=$(( $POSICAO - $VAZIO ))
   
   #Colunas laterais
   COLUNA1=("3" "7" "11" "15")
   COLUNA2=("0" "4" "8" "12")
   
   #Mover para esquerda
   if  [ $DIST -eq -1 ]
      then
         if [[ ! " ${COLUNA1[@]} " =~ " ${POSICAO} " ]]; then _move; fi
   fi
   
   #Mover para direita
   if  [ $DIST -eq 1 ]
      then
         if [[ ! " ${COLUNA2[@]} " =~ " ${POSICAO} " ]]; then _move; fi
   fi
   
   #Mover para cima ou para baixo
   if  [ $DIST -eq 4 ] || [ $DIST -eq -4 ]; then _move; fi   
}

#Verifica a possibilidade da troca
function _verifica () {
   
   #Opção do jogador
   OPT="${Y[$NUM]}"
   
   #Checa posição do número escolhido e se o mesmo pertence ao vetor
   PERTENCE="0"
   for i in {0..15}; do
      if [ "${Y[$i]}" == "$OPT" ] || [ "${Y[$i]}" == "0$OPT" ]
         then
            POSICAO=$i
            PERTENCE="1"
      fi
   done
   
   #Se pertence, pode trocar.
   if [ $PERTENCE == "1" ]
      then
         _troca
   fi
   _desenha
}

#"Desenha" o jogo
function _desenha () {
   _vazio
   clear
   echo "Racha-cuca!"
   #echo "$INVERSAO: ${Y[@]:0:15}"
   echo "${bold}
   +----+----+----+----+
   | ${Y[0]} | ${Y[1]} | ${Y[2]} | ${Y[3]} |
   +----+----+----+----+
   | ${Y[4]} | ${Y[5]} | ${Y[6]} | ${Y[7]} |
   +----+----+----+----+
   | ${Y[8]} | ${Y[9]} | ${Y[10]} | ${Y[11]} |
   +----+----+----+----+
   | ${Y[12]} | ${Y[13]} | ${Y[14]} | ${Y[15]} |
   +----+----+----+----+${normal}"
   echo ""
   echo "Use as setas para mover os NÚMEROS"
   echo "Use Ctrl+c para encerrar"
   echo "$INVERSOES"
   _conseguiu
   read -n3 -s INPUT
   case $INPUT in
   $'\e[A') NUM=$(( $VAZIO + 4 ));;
   $'\e[B') NUM=$(( $VAZIO - 4 ));;
   $'\e[C') NUM=$(( $VAZIO - 1 ));;
   $'\e[D') NUM=$(( $VAZIO + 1 ));;
   *) _desenha;;
   esac   
   _verifica
}
_embaralha_tudo


Scripts recomendados

Matar aplicativos

Quantos delimitadores?

Script para converter um diretório de arquivos em mp3 para ogg.

Gerar senhas

Snake [ALFA] em Shell Script


  

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