#!/usr/local/bin/bash
#
#
# Bash Maze ver 1.0
# This game was based on the maze generator from
# Joe Wingbermuehle at https://raw.github.com/joewing/maze/master/maze.sh
# I've added movement and collision to create the game.
#
#
# References:
# https://raw.github.com/joewing/maze/master/maze.sh
# http://lendscripts.blogspot.com.br/2012/10/licao-3-programacao-de-jogos-em.html
#
# Written by Fernando Bolonhezi Giannasi - jun/2013
# Validade bash version
if [ $(echo $BASH_VERSION | awk -F"." '{ if ( ($1 >= 4) ) {print "0"} else {print "1"}}') -ne "0" ]; then
echo "This game only works on bash 4.0 or later"
echo "Your version is $BASH_VERSION"
exit 1
fi
# Inicial menu
setterm -cursor off
while true; do
clear
echo -e '\033[01;33m'
cat << EOF
Bash Maze ver 1.0
*******************************************
Ayuda a la bola roja a encontrar la salida
*******************************************
Teclas:
a -> Izquierda
s -> Abajo
d -> Derecha
w -> Arriba
q -> Salir (en cualquier momento)
*******************************************
EOF
tput sgr0
echo -e '\033[01;31m'
cat << EOF
Seleccione dificultad:
1-) Fácil
2-) Medio
3-) Difícil
q-) Salir
EOF
tput sgr0
read -n1 -s DIFIC
case "$DIFIC" in
"1")
MAZE_WIDTH="39"
MAZE_HEIGHT="21"
break
;;
"2")
MAZE_WIDTH="49"
MAZE_HEIGHT="31"
break
;;
"3")
MAZE_WIDTH="59"
MAZE_HEIGHT="31"
break
;;
"q")
exit 0
;;
esac
done
# Initialize the maze array.
function init_maze {
for ((y=0; y<MAZE_HEIGHT; y++)) ; do
for ((x=1; x<$((MAZE_WIDTH-1)); x++)) ; do
maze[$((y * MAZE_WIDTH + x))]=0
done
maze[$((y * MAZE_WIDTH + 0))]=1
maze[$((y * MAZE_WIDTH + (MAZE_WIDTH - 1)))]=1
done
for ((x=0; x<MAZE_WIDTH; x++)) ; do
maze[$x]=1
maze[$(((MAZE_HEIGHT - 1) * MAZE_WIDTH + x))]=1
done
}
# Display the maze array.
function print_maze {
for ((y=0; y<MAZE_HEIGHT; y++)) ; do
for ((x = 0; x < MAZE_WIDTH; x++ )) ; do
if [[ maze[$((y * MAZE_WIDTH + x))] -eq 0 ]] ; then
echo -n "[]"
else
echo -n " "
fi
done
echo
done
}
# Carve the maze starting at the specified offset.
function carve_maze {
local index=$1
local dir=$RANDOM
local i=0
maze[$index]=1
while [ $i -le 4 ] ; do
local offset=0
case $((dir % 4)) in
0) offset=1 ;;
1) offset=-1 ;;
2) offset=$MAZE_WIDTH ;;
3) offset=$((-$MAZE_WIDTH)) ;;
esac
local index2=$((index + offset))
if [[ maze[$index2] -eq 0 ]] ; then
local nindex=$((index2 + offset))
if [[ maze[$nindex] -eq 0 ]] ; then
maze[$index2]=1
carve_maze $nindex
i=0
dir=$RANDOM
index=$nindex
fi
fi
i=$((i + 1))
dir=$((dir + 1))
done
}
# Create a maze:
TMP="/tmp"
if [ ! -d "$TMP" ]; then
mkdir "$TMP"
fi
init_maze
carve_maze $((2 * MAZE_WIDTH + 2))
maze[$((MAZE_WIDTH + 2))]=1
maze[$(((MAZE_HEIGHT - 2) * MAZE_WIDTH + MAZE_WIDTH - 3))]=1
print_maze > $TMP/maze.txt
sed -i '1d' $TMP/maze.txt
sed -i 's/^ //g' $TMP/maze.txt
# Variables
INPUT="0" # Data de entrada
m="0" # Mov 1
n="1" # Mov 2
C="0" # Prueba colisión
x="3" # coord X
y="0" # coord Y
counter="1" #Contador movimiento
WINS="$(echo $MAZE_HEIGHT - 3 | bc)" # Detects the exit
#Functions to print maze and ball
function cat_maze() {
echo -ne '\033[01;32m'
cat $TMP/maze.txt
tput sgr0
echo "Coordinada X = $x"
echo "Coordinada Y = $y"
echo "Movidas = $counter"
}
function cat_ball() {
echo -ne '\033[01;31m'O
tput sgr0
}
# inicial position
clear
tput cup 0 0
cat_maze
tput cup $y $x
cat_ball
# Moving the ball:
while [ $INPUT != "q" ];do
read -n1 -s INPUT
if [ $INPUT = a ];then
let "m = x"
let "n = y + 1"
C=$(cat $TMP/maze.txt | sed -n "$n"p 2> /dev/null | cut -c"$m" 2> /dev/null) # If C is not empty than we hit a wall
if [ -z $C ];then
let "x = x - 1"
else
let counter--
fi
fi
if [ $INPUT = d ];then
let "m = x + 2"
let "n = y + 1"
C=$(cat $TMP/maze.txt | sed -n "$n"p 2> /dev/null | cut -c"$m" 2> /dev/null)
if [ -z $C ];then
let "x = x + 1"
else
let counter--
fi
fi
if [ $INPUT = w ];then
let "m = x + 1"
let "n = y"
C=$(cat $TMP/maze.txt | sed -n "$n"p 2> /dev/null | cut -c"$m" 2> /dev/null)
if [ -z $C ];then
let "y = y - 1"
else
let counter--
fi
fi
if [ $INPUT = s ];then
let "m = x + 1"
let "n = y + 2"
C=$(cat $TMP/maze.txt | sed -n "$n"p 2> /dev/null | cut -c"$m" 2> /dev/null)
if [ -z $C ];then
let "y = y + 1"
else
let counter--
fi
fi
if [ "$y" -lt "0" ]; then y=0; let counter--; fi
# Check Wins
if [ "$y" -gt "$WINS" ]; then
tput cup $(echo $MAZE_HEIGHT + 3 | bc) 0
echo -e '\033[01;31m'
echo GANASTE!!!!!
echo "Puntaje: $counter movidas"
tput sgr0
echo
setterm -cursor on
exit 0
fi
clear
cat_maze
# Prints the ball on new location
tput cup $y $x
cat_ball
let counter++
done
clear
# End of script