Jogo: racha-cuca
Publicado por Xerxes (última atualização em 12/04/2017)
[ Hits: 2.485 ]
Homepage: -
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.
#!/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
Uma loja de apps por linha de comando
Cálculo da Aplicação Financeira
Inicializando os serviços de OmniBus
Nenhum comentário foi encontrado.
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
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
Criando uma VPC na AWS via CLI
Multifuncional HP imprime mas não digitaliza
Dica básica para escrever um Artigo.
Como Exibir Imagens Aleatórias no Neofetch para Personalizar seu Terminal
Melhorando a precisão de valores flutuantes em python[AJUDA] (11)
GLPI - Configuração de destinatário com conta Microsoft Exchange (0)
Vou voltar moderar conteúdos de Dicas e Artigos (3)
OpenVPN no MACBOOK conecta mas não pinga pastas de rede compartilhada ... (1)