Fuga da Mina

Publicado por Xerxes (última atualização em 11/08/2016)

[ Hits: 3.088 ]

Homepage: -

Download fuga_da_mina.sh




O script é um minigame que fiz para tentar usar "matriz" em BASH. Sendo que bash só tem vetor. Descrição do jogo está no começo do script. Pode ser útil para alguém que está começando no mundo dos scripts como eu.

  



Esconder código-fonte

#!/bin/bash

# Fuga da Mina v1.0b
# 
# Neste joguinho você controla um mineiro representado pela "@".
# A mina está prestes a desabar. Você tem um tempo para fugir.
# Você deve levar o mineiro até a saída "s".
# 
# Quando estiver sem caminho, pode usar a picareta e quebrar as
# paredes. Mas elas possuem uma "resistência" e a cada tentativa
# o tempo corre.
# 
# Caso encontre algum "T" no caminho, você ganha um tempinho extra.
#
# Autor: Xerxes Lins (xerxeslins@gmail.com)
#       www.vivaolinux.com.br/~xerxeslins

function _cria_mapa {
   for i in {0..9}  #linhas
   do
      for j in {0..14} #colunas
      do
      SORT=$(( ( RANDOM % 2 ) ))
      if [ $SORT -eq 0 ]
      then
         TILE="#"
      else
         TILE="."
      fi
      if [ $j = 0 ] || [ $i = 0 ] || [ $j = 14 ] || [ $i = 9 ]
      then
         TILE="x"
      fi
      eval LINHA$i[$j]=$TILE
      done
   done
}

function _nasce_personagem {
   x=1
   y=$(( ( RANDOM % 8 ) + 1 ))
   eval LINHA$y[$x]="@"
   TEMPO=20
}
function _tempo_extra {
   x=$(( ( RANDOM % 12 ) + 1 ))
   y=$(( ( RANDOM % 8 ) + 1 ))
   eval LINHA$y[$x]="T"
   TEMPO=20
}
function _saida {
   xs=14
   ys=$(( ( RANDOM % 8 ) + 1 ))
   eval LINHA$ys[$xs]="S"
}

function _desenha_mapa {
   clear
   echo "Tempo restante: $TEMPO"
   echo ""
   echo "$MSG"
   echo ""
   for i in {0..9}
   do
      VAR=$(eval echo LINHA$i[@])
      echo -ne "${!VAR}\n"
   done
}
function _pick_crock {
   SORT=$(( ( RANDOM % 5 ) ))
   if [[ $SORT -le 0 ]]
   then 
      echo 0
   else
      echo 1
   fi   
}
function _sorteia_pedra {
   SORT=$(( ( RANDOM % 10 ) ))
   if [[ $SORT -le 0 ]]
   then 
      SURPRESA="T"
   else
      SURPRESA="."
   fi   
}
function _desmorona {
   for i in {0..9}
   do
      for j in {0..14}
      do
      eval LINHA$i[$j]="#"
      done
   done
}
function _gameover {
   _desmorona
   MSG="MORREU SOTERRADO!"
   _desenha_mapa
   sleep 2
   tput cnorm
   exit
}
function _vitoria {
   MSG="VOCÊ CONSEGUIU!"
   _desenha_mapa
   exit
}

function _play {

while [ "$INPUT" != "x" ]
do

   if [ $TEMPO -lt 0 ]
   then
   TEMPO=0
   _gameover
   fi
   
   TEMPO=$(( $TEMPO - 1))
   MSG=""
   read  -n1 -s INPUT
   if [ $INPUT = a ]
   then
      VAR=$(eval echo LINHA$y[$(( $x - 1 ))])
      if [ "${!VAR}" = "." ]
      then
         eval LINHA$y[$x]="."
         x=$(( $x - 1 ))
         y=$y
         eval LINHA$y[$x]="@"
      elif [ "${!VAR}" = "#" ]
      then
         if [ $(_pick_crock) = 0 ]
         then
            _sorteia_pedra
            eval LINHA$y[$x - 1]="$SURPRESA"
            MSG="Crock!"
            _desenha_mapa
         else
            MSG="Pick!"
            _desenha_mapa
         fi
      elif [ "${!VAR}" = "S" ]
         then
         eval LINHA$y[$x]="."
         x=$(( $x - 1 ))
         y=$y
         eval LINHA$y[$x]="@"
         _desenha_mapa
         _vitoria
      elif [ "${!VAR}" = "T" ]
         then
         eval LINHA$y[$x]="."
         x=$(( $x - 1 ))
         y=$y
         eval LINHA$y[$x]="@"
         TEMPO=$(( $TEMPO + 5 ))
         MSG="Tempo +5"
         _desenha_mapa
         
      fi
   fi
   if [ $INPUT = d ]
   then
      VAR=$(eval echo LINHA$y[$(( $x + 1 ))])
      if [ "${!VAR}" = "." ]
      then
         eval LINHA$y[$x]="."
         x=$(( $x + 1 ))
         y=$y
         eval LINHA$y[$x]="@"
         elif [ "${!VAR}" = "#" ]
      then
         if [ $(_pick_crock) = 0 ]
         then
            _sorteia_pedra
            eval LINHA$y[$x + 1]="$SURPRESA"
            MSG="Crock!"
            _desenha_mapa
         else
            MSG="Pick!"
            _desenha_mapa
         fi
      elif [ "${!VAR}" = "S" ]
         then
         eval LINHA$y[$x]="."
         x=$(( $x + 1 ))
         y=$y
         eval LINHA$y[$x]="@"
         _desenha_mapa
         _vitoria
      elif [ "${!VAR}" = "T" ]
         then
         eval LINHA$y[$x]="."
         x=$(( $x + 1 ))
         y=$y
         eval LINHA$y[$x]="@"
         TEMPO=$(( $TEMPO + 5 ))
         MSG="Tempo +5"
         _desenha_mapa
         
      fi
   fi
   if [ $INPUT = w ]
   then
      VAR=$(eval echo LINHA$(( $y - 1))[$x])
      if [ "${!VAR}" = "." ]
      then
         eval LINHA$y[$x]="."
         x=$x
         y=$(( $y - 1 ))
         eval LINHA$y[$x]="@"
         elif [ "${!VAR}" = "#" ]
      then
         if [ $(_pick_crock) = 0 ]
         then
            _sorteia_pedra
            eval LINHA$(( $y - 1))[$x]="$SURPRESA"
            MSG="Crock!"
            _desenha_mapa
         else
            MSG="Pick!"
            _desenha_mapa
         fi
      elif [ "${!VAR}" = "S" ]
         then
         eval LINHA$y[$x]="."
         x=$x
         y=$(( $y - 1 ))
         eval LINHA$y[$x]="@"
         _desenha_mapa
         _vitoria
      elif [ "${!VAR}" = "T" ]
         then
         eval LINHA$y[$x]="."
         x=$x
         y=$(( $y - 1 ))
         eval LINHA$y[$x]="@"
         TEMPO=$(( $TEMPO + 5 ))
         MSG="Tempo +5"
         _desenha_mapa
         
      fi
   fi
   if [ $INPUT = s ]
   then
      VAR=$(eval echo LINHA$(( $y + 1))[$x])
      if [ "${!VAR}" = "." ]
      then
         eval LINHA$y[$x]="."
         x=$x
         y=$(( $y + 1 ))
         eval LINHA$y[$x]="@"
         elif [ "${!VAR}" = "#" ]
      then
         if [ $(_pick_crock) = 0 ]
         then
            _sorteia_pedra
            eval LINHA$(( $y + 1))[$x]="$SURPRESA"
            MSG="Crock!"
            _desenha_mapa
         else
            MSG="Pick!"
            _desenha_mapa
         fi
      elif [ "${!VAR}" = "S" ]
         then
         eval LINHA$y[$x]="."
         x=$x
         y=$(( $y + 1 ))
         eval LINHA$y[$x]="@"
         _desenha_mapa
         _vitoria

      elif [ "${!VAR}" = "T" ]
         then
         eval LINHA$y[$x]="."
         x=$x
         y=$(( $y + 1 ))
         eval LINHA$y[$x]="@"
         TEMPO=$(( $TEMPO + 5 ))
         MSG="Tempo +5"
         _desenha_mapa

      fi
   fi
   clear
   _desenha_mapa
done
}
tput civis
_cria_mapa
for i in {1..3}
do
   _tempo_extra
done
_nasce_personagem
_saida
MSG="Mova o @ até a saída (S) usando A D W S"
_desenha_mapa
_play

Scripts recomendados

Script para sincronizar dados entre desktop e notebook de maneira 99% automática usando rsync

exenow - Habilitando suporte a executaveis windows no kernel do linux

Script para monitorar os 10 processos que mais consomem CPU e Memória

Gerar senhas

Configurar servidor proxy no Apt-get usando SS e Kdialog


  

Comentários
[1] Comentário enviado por sergeimartao em 15/08/2016 - 13:45h

Muito legal o script e o game também, parabéns!

[2] Comentário enviado por xerxeslins em 26/08/2016 - 11:07h


[1] Comentário enviado por sergeimartao em 15/08/2016 - 13:45h

Muito legal o script e o game também, parabéns!


Valeu! :)

[3] Comentário enviado por lucasss em 17/09/2016 - 16:24h

nunca ví um script tão complexo


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts