Jogo: racha-cuca
Publicado por Xerxes (última atualização em 12/04/2017)
[ Hits: 2.759 ]
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
Administração de Servidor FTP + MySQL
Script para acionamento de GPIO para Relé Raspberry Pi
Script para Montar Partição/Unidade ...
Solicitar senha para abrir programa
Nenhum comentário foi encontrado.
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Warcraft II Remastered no Linux? (7)
O programa assinador digital (5)









