Jogo: racha-cuca
Publicado por Xerxes (última atualização em 12/04/2017)
[ Hits: 2.326 ]
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
Conexão e Desconexão ADSL automáticas no Slackware
Configuração do repositório do Slackware Current
Instalação e desinstalação do Flash Player
Backup para fita dat em Dialog
Nenhum comentário foi encontrado.
Agora temos uma assistente virtual no fórum!!! (247)
Manutenção de sistemas Linux Debian e derivados com apt-get, apt, aptitude e dpkg
Melhorando o tempo de boot do Fedora e outras distribuições
Como instalar as extensões Dash To Dock e Hide Top Bar no Gnome 45/46
Como Atualizar Fedora 39 para 40
Instalar Google Chrome no Debian e derivados
Consertando o erro do Sushi e Wayland no Opensuse Leap 15
Instalar a última versão do PostgreSQL no Lunix mantendo atualizado
Flathub na sua distribuição Linux e comandos básicos de gerenciamento
iso de sistema 32 bit em atividade (16)
Reset do linux sem perder dual boot (3)
Impressora Canon Ip 1800 (Drivers) 64 bit (3)
Como transfiro os pokemons do fire red para o emulador mupen64? (1)