Discussione:
PONG!
(troppo vecchio per rispondere)
antoniomac5
2009-11-19 20:30:40 UTC
Permalink
#!/bin/bash

cleanonexit () {
kill $idpaintscene
echo -en "\e[m"
echo -en "\e[H\e[J"
echo -en "\e[$(( LINES / 2 ));$(( COLUMNS / 2 - 5 ))HGAME OVER!"
sleep 1
echo -en "\e[H\e[J"
echo -en "\e[?25h"
}

trap cleanonexit 0

size=`stty size`
LINES=${size% *}
COLUMNS=${size#* }

idmain=$$
idpaintscene=
paddlelength=4
speed=0.1


#BACKGROUND PROCESS
paintscene () {
trap "paintpaddle up" usr1
trap "paintpaddle down" usr2

paintpaddle () { # $1=up,down
if test $1 == up; then
test $paddley -gt 1 && (( --paddley ))
elif test $1 == down; then
test $(( paddley + paddlelength - 1 )) -lt $LINES && (( +
+paddley ))
fi

echo -en "\e[m\e[$(( paddley - 1 ));1H "
echo -en "\e[47m"
for (( y = paddley; y < paddley + paddlelength; ++y )); do
echo -en "\e[$y;1H "
done
if test $(( paddley + paddlelength - 1 )) -ne $LINES; then
echo -en "\e[m\e[$(( paddley + paddlelength ));1H "
fi
}

paintball () {
echo -en "\e[m\e[$bally;${ballx}H "
(( ballx += directionx ))
(( bally += directiony ))
test $ballx -eq $COLUMNS && (( directionx *= -1 ))
test $ballx -eq 2 -a \
$bally -ge $paddley -a \
$bally -lt $(( paddley + paddlelength )) && (( directionx *= -1 ))
test $ballx -eq 1 && kill $idmain
test $bally -eq $LINES -o $bally -eq 1 && (( directiony *= -1 ))

echo -en "\e[47m\e[$bally;${ballx}H "
}

paddley=$(( LINES / 2 - paddlelength / 2 ))
ballx=$COLUMNS
bally=$(( RANDOM % LINES + 1 ))
directionx=-1
directiony=$(( RANDOM % 2 == 1 ? 1 : -1 ))

paintpaddle nomove
while true; do
paintball
sleep $speed
done
}


echo -en "\e[H\e[J"
echo -en "\e[?25l"
paintscene &
idpaintscene=$!

while true; do
read -sn1
test "$REPLY" == $'\e' || continue
read -sn1
test "$REPLY" == "[" || continue
read -sn1
case "$REPLY" in
A) kill -usr1 $idpaintscene ;;
B) kill -usr2 $idpaintscene ;;
esac
done
antoniomac5
2009-11-19 20:38:47 UTC
Permalink
      test $(( paddley + paddlelength - 1 )) -lt $LINES && (( +
+paddley ))
copiato come sta, non funziona
ma non e' colpa mia... questa riga andrebbe tutta di fila...
antoniomac5
2009-11-19 20:51:10 UTC
Permalink
brutta quella funzione lunga... forse risulta piu' pulito e meglio
leggibile cosi'.

-----------
#!/bin/bash

cleanonexit () {
kill $idpaintscene
echo -en "\e[m"
echo -en "\e[H\e[J"
echo -en "\e[$(( LINES / 2 ));$(( COLUMNS / 2 - 5 ))HGAME OVER!"
sleep 1
echo -en "\e[H\e[J"
echo -en "\e[?25h"

}

trap cleanonexit 0

size=`stty size`
LINES=${size% *}
COLUMNS=${size#* }

idmain=$$
idpaintscene=
paddlelength=4
speed=0.1

paintpaddle () { # $1=up,down
if test $1 == up; then
test $paddley -gt 1 && (( --paddley ))
elif test $1 == down; then
test $(( paddley + paddlelength - 1 )) -lt $LINES && (( +
+paddley ))
fi

echo -en "\e[m\e[$(( paddley - 1 ));1H "
echo -en "\e[47m"
for (( y = paddley; y < paddley + paddlelength; ++y )); do
echo -en "\e[$y;1H "
done
if test $(( paddley + paddlelength - 1 )) -ne $LINES; then
echo -en "\e[m\e[$(( paddley + paddlelength ));1H "
fi
}

paintball () {
echo -en "\e[m\e[$bally;${ballx}H "
(( ballx += directionx ))
(( bally += directiony ))
test $ballx -eq $COLUMNS && (( directionx *= -1 ))
test $ballx -eq 2 -a \
$bally -ge $paddley -a \
$bally -lt $(( paddley + paddlelength )) && (( directionx *=
-1 ))
test $ballx -eq 1 && kill $idmain
test $bally -eq $LINES -o $bally -eq 1 && (( directiony *= -1 ))
echo -en "\e[47m\e[$bally;${ballx}H "
}


#BACKGROUND PROCESS
paintscene () {
trap "paintpaddle up" usr1
trap "paintpaddle down" usr2

paddley=$(( LINES / 2 - paddlelength / 2 ))
ballx=$COLUMNS
bally=$(( RANDOM % LINES + 1 ))
directionx=-1
directiony=$(( RANDOM % 2 == 1 ? 1 : -1 ))

paintpaddle nomove
while true; do
paintball
sleep $speed
done

}

echo -en "\e[H\e[J"
echo -en "\e[?25l"
paintscene &
idpaintscene=$!

while true; do
read -sn1
test "$REPLY" == $'\e' || continue
read -sn1
test "$REPLY" == "[" || continue
read -sn1
case "$REPLY" in
A) kill -usr1 $idpaintscene ;;
B) kill -usr2 $idpaintscene ;;
esac
done

Continua a leggere su narkive:
Loading...