Jogo: racha-cuca
Publicado por Xerxes (última atualização em 12/04/2017)
[ Hits: 2.830 ]
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
Automatizando backups no Samba
Abrir e redirecionar portas TCP em firewall iptables
Atualisar e instalar pacotes no sistema.
Nenhum comentário foi encontrado.
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Opções secretas em tema do Cinnamon
Como mapear unidade de rede no Linux
Como quebrar senha usando john the ripper
Alguém pode me indicar um designer freelancer? [RESOLVIDO] (1)
Alguém já testou o novo COSMIC Desktop? O que achou? (4)
Não consigo instalar distro antiga no virtualbox nem direto no hd (29)
queria saber como posso alterar a frequencia do meu ryzen 2300u pro (3)









