bashmaze.sh

¡Esta es una revisión vieja del documento!


#!/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

* Help the red ball find the exit * Keys:

a -> move left
s -> move down
d -> move right
w -> move up
q -> quit (anytime)

*** EOF tput sgr0 echo -e '\033[01;31m' cat « EOF Select the difficulty:

1-) Easy
2-) Medium
3-) Hard
q-) Exit

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 $1) maze[$2)]=1 maze[$3)]=1 print_maze > $TMP/maze.txt sed -i '1d' $TMP/maze.txt sed -i 's/^ g' $TMP/maze.txt # Variables INPUT=“0” # Input data m=“0” # Mov 1 n=“1” # Mov 2 C=“0” # Collision test x=“3” # X coordinate y=“0” # Y coordinate counter=“1” #Counts movements 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 “X coordinate = $x” echo “Y coordinate = $y” echo “Moves = $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 You WON!!!!! echo “Score: $counter moves” 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


1)
2 * MAZE_WIDTH + 2
2)
MAZE_WIDTH + 2
3)
(MAZE_HEIGHT - 2) * MAZE_WIDTH + MAZE_WIDTH - 3
  • bashmaze.sh.1718145999.txt.gz
  • Última modificación: 2024/06/11 22:46
  • por peron