You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
3.0 KiB
157 lines
3.0 KiB
#!/bin/zsh
|
|
|
|
|
|
_STTY=$(stty -g) # Save current terminal setup
|
|
printf "\e[2J" # clear screen, set cursos at beginning
|
|
stty -echo -icanon # Turn off line buffering
|
|
printf '\e[?25h' # Turn on the cursor
|
|
|
|
# VARIABLES
|
|
typeset -A IMAGE
|
|
X=0
|
|
Y=24
|
|
height=0
|
|
width=0
|
|
snake='═'
|
|
|
|
vertical=false
|
|
forward=true
|
|
upward=true
|
|
pen_down=true
|
|
|
|
function get_size() {
|
|
# Get terminal size ('stty' is POSIX and always available).
|
|
read -r LINES COLUMNS < <(stty size)
|
|
height=$((LINES-1))
|
|
width=$((COLUMNS-1))
|
|
}
|
|
|
|
function start_the_snake() {
|
|
rm thesnake
|
|
for i in {0..$height}
|
|
do
|
|
for j in {0..$width}
|
|
do
|
|
IMAGE["${i};${j}"]=' ' ; printf ${IMAGE["${i};${j}"]}
|
|
done
|
|
done
|
|
printf '\e[2J\e[H' ; printf '\e[0;24H'
|
|
}
|
|
|
|
function save_the_snake() {
|
|
for i in {0..$height}
|
|
do
|
|
for j in {0..$width}
|
|
do
|
|
printf ${IMAGE["${i};${j}"]}
|
|
done
|
|
done >> thesnake
|
|
sed -e "s/.\{$COLUMNS\}/&\n/g" < thesnake > multilinesnake
|
|
}
|
|
|
|
function show_the_snake() {
|
|
printf '\e[2J\e[H'
|
|
for i in {0..$height}
|
|
do
|
|
for j in {0..$width}
|
|
do
|
|
printf ${IMAGE["${i};${j}"]}
|
|
done
|
|
done
|
|
printf '\e[%s;%sH' "$((Y+1))" "$((X+1))"
|
|
}
|
|
function at_exit() {
|
|
printf "\e[?9l" # Turn off mouse reading
|
|
printf "\e[?12l\e[?25h" # Turn on cursor
|
|
stty "$_STTY" # reinitialize terminal settings
|
|
clear
|
|
exit
|
|
}
|
|
|
|
#═ ║╒ ╓ ╔ ╕ ╖ ╗ ╘ ╙ ╚ ╛ ╜ ╝ ╞ ╟
|
|
#╠ ╡ ╢ ╣ ╤ ╥ ╦ ╧ ╨ ╩ ╪ ╫ ╬
|
|
|
|
function move_snake_up() {
|
|
if [ "$vertical" = false ] ; then
|
|
if [ "$forward" = true ] ; then
|
|
snake='╝'
|
|
else
|
|
snake='╚'
|
|
fi
|
|
else
|
|
snake='║'
|
|
fi
|
|
#draw nothing it the pen is not down
|
|
if [ "$pen_down" = false ] ; then
|
|
snake=' '
|
|
fi
|
|
IMAGE["${Y};${X}"]=$snake ; Y=$((Y-1)) ; vertical=true ; upward=true
|
|
}
|
|
|
|
function move_snake_down() {
|
|
if [ "$vertical" = false ] ; then
|
|
if [ "$forward" = true ] ; then
|
|
snake='╗'
|
|
else
|
|
snake='╔'
|
|
fi
|
|
else
|
|
snake='║'
|
|
fi
|
|
#draw nothing it the pen is not down
|
|
if [ "$pen_down" = false ] ; then
|
|
snake=' '
|
|
fi
|
|
IMAGE["${Y};${X}"]=$snake ; Y=$((Y+1)) ; vertical=true ; upward=false
|
|
}
|
|
|
|
function move_snake_forward() {
|
|
if [ "$vertical" = true ] ; then
|
|
if [ "$upward" = true ] ; then
|
|
snake='╔'
|
|
else
|
|
snake='╚'
|
|
fi
|
|
else
|
|
snake='═'
|
|
fi
|
|
#draw nothing it the pen is not down
|
|
if [ "$pen_down" = false ] ; then
|
|
snake=' '
|
|
fi
|
|
IMAGE["${Y};${X}"]=$snake ; X=$((X+1)) ; vertical=false ; forward=true
|
|
}
|
|
|
|
function move_snake_backward() {
|
|
if [ "$vertical" = true ] ; then
|
|
if [ "$upward" = true ] ; then
|
|
snake='╗'
|
|
else
|
|
snake='╝'
|
|
fi
|
|
else
|
|
snake='═'
|
|
fi
|
|
#draw nothing it the pen is not down
|
|
if [ "$pen_down" = false ] ; then
|
|
snake=' '
|
|
fi
|
|
IMAGE["${Y};${X}"]=$snake ; X=$((X-1)) ; vertical=false ; forward=false
|
|
}
|
|
|
|
# Main #
|
|
get_size
|
|
start_the_snake
|
|
echo
|
|
while read -s -k 1 cr;
|
|
do
|
|
case "$cr" in
|
|
w) move_snake_up ; show_the_snake ;;
|
|
s) move_snake_down ; show_the_snake ;;
|
|
a) move_snake_backward ; show_the_snake ;;
|
|
d) move_snake_forward ; show_the_snake ;;
|
|
t) pen_down=true ;;
|
|
y) pen_down=false ;;
|
|
q) save_the_snake && at_exit ;;
|
|
esac
|
|
done
|
|
|