2003-10-28 08:18
黄叶
作者:飞灰橙 来自:ChinaUnix.net<br /><br /> 忙一下午,终于出来了<br />在我的redhat8.0上运行通过。<br />游戏键:<br />上:w, i<br />下:s, k<br />左:a, j<br />右:d, l<br />退出:q<br /><br /><!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1--><br />#!/bin/bash<br /><br />function DetectInput<br />{<br />while [[ 1 ]]<br />do<br />c=""<br />read -n 1 c<br />echo -ne "\r \r"<br />if [[ $c == "a" || $c == "j" || $c == "A" || $c == "J" ]]<br />then<br />kill -36 $pidShowSnake<br />elif [[ $c == "w" || $c == "i" || $c == "W" || $c == "I" ]]<br />then<br />kill -37 $pidShowSnake<br />elif [[ $c == "d" || $c == "l" || $c == "D" || $c == "L" ]]<br />then<br />kill -38 $pidShowSnake<br />elif [[ $c == "s" || $c == "k" || $c == "S" || $c == "K" ]]<br />then<br />kill -39 $pidShowSnake<br />elif [[ $c == "q" || $c == "Q" ]]<br />then<br />echo Quit.<br />kill -40 $pidShowSnake<br />exit<br />fi<br />done<br />}<br /><br />function AllExit<br />{<br />kill -40 $pidShowSnake<br />exit<br />}<br /><br />if [[ $1 != "--showsnake" ]]<br />then<br />eval $0" --showsnake "$$"&"<br />trap "exit" TERM<br />trap "AllExit" INT<br />pidShowSnake=$!<br />DetectInput<br />exit<br />else<br />pidCtlSnake=$2<br />fi<br /><br />echo sub<br /><br /><br />iSpeed=500 #time interval in millisecond<br />iDirection=0 #1-left, 2-up, 3-right, 4-down<br />iWidth=15<br />iHeight=15<br />iX=(6 7 8)<br />iY=(7 7 7)<br />iMap=()<br />iS=0 #Start pointer in iX<br /><br />(( iTotalBox = iWidth * iHeight ))<br />for (( i = 0; i < iTotalBox; i++ ))<br />do<br />(( iMap[$i] = 0 ))<br />done<br /><br />function RandomHeader<br />{<br />(( iNew = RANDOM % ( iTotalBox - ${#iX[@]} ) ))<br />for (( iNewP = 0, i = 0; iNewP < iTotalBox && i < iNew; iNewP++))<br />do<br />if (( ${iMap[$iNewP]} != 1 )); then (( i++ )); fi<br />done<br />while (( ${iMap[$iNewP]} == 1 )); do (( iNewP++ )); done<br /><br />(( iNewX = iNewP % iWidth ))<br />(( iNewY = (iNewP - iNewX) / iWidth ))<br /><br />echo -ne "\33[1m\33[35m"<br />(( pX = 2 * iNewX + iLeft + 1 ))<br />(( pY = iNewY + iTop + 1 ))<br />echo -ne "\33["$pY";"$pX"H[]"<br />echo -ne "\33["$iCursor";1H"<br />echo -ne "\33[0m"<br /><br />}<br /><br />function InitDraw<br />{<br />clear<br /><br />(( iTop = 1 ))<br />(( iBottom = iTop + iHeight + 1 ))<br />(( iLeft = 1 ))<br />(( iRight = iLeft + iWidth + iWidth + 1 ))<br />(( iCursor = iBottom + 1 ))<br /><br />echo -ne "\33[1m\33[32m"<br />for (( i = iLeft + 1; i < iWidth + iWidth + iLeft + 1; i++ ))<br />do<br />echo -ne "\33["$iTop";"$i"H="<br />echo -ne "\33["$iBottom";"$i"H="<br />done<br />for (( i = iTop; i < iHeight + iTop + 2; i++ ))<br />do<br />echo -ne "\33["$i";"$iLeft"H|"<br />echo -ne "\33["$i";"$iRight"H|"<br />done<br />echo -ne "\33["$iCursor";1H"<br />echo -ne "\33[0m"<br /><br />echo -ne "\33[1m\33[33m"<br />for (( i = 0; i < ${#iX[@]}; i++ ))<br />do<br />(( pX = 2 * ${iX[$i]} + iLeft + 1 ))<br />(( pY = ${iY[$i]} + iTop + 1 ))<br />(( pM = ${iY[$i]} * iWidth + ${iX[$i]} ))<br />(( iMap[$pM] = 1 ))<br />echo -ne "\33["$pY";"$pX"H[]"<br />#echo ${iX[$i]}<br />done<br />echo -ne "\33["$iCursor";1H"<br />echo -ne "\33[0m"<br /><br />RandomHeader<br />}<br /><br /><br />function ShiftSnake<br />{<br />(( iLastP = iS - 1 ))<br />if (( iLastP < 0 )); then ((iLastP = ${#iX[@]} - 1 )); fi<br /><br />if (( iDir == 1 )) #left<br />then<br />(( iHX = ${iX[$iLastP]} - 1 ))<br />(( iHY = ${iY[$iLastP]} ))<br />elif (( iDir == 2 )) #up<br />then<br />(( iHX = ${iX[$iLastP]} ))<br />(( iHY = ${iY[$iLastP]} - 1 ))<br />elif (( iDir == 3 )) #right<br />then<br />(( iHX = ${iX[$iLastP]} + 1 ))<br />(( iHY = ${iY[$iLastP]} ))<br />elif (( iDir == 4 )) #down<br />then<br />(( iHX = ${iX[$iLastP]} ))<br />(( iHY = ${iY[$iLastP]} + 1 ))<br />fi<br /><br />bOver=0<br />if (( iHX < 0 || iHY < 0 || iHX >= iWidth || iHY >= iHeight )); then bOver=1;fi<br />if (( bOver == 0 )); then<br />if (( ${iMap[iHY * iWidth + iHX]} == 1 )); then bOver=1; fi<br />fi<br /><br />if (( bOver == 1 ))<br />then<br />kill $pidCtlSnake<br />(( iBottom = iBottom + 1 ))<br />echo -e "\33["$iBottom";0HGame over! (Score: "${#iX[@]}"00)\33[0m"<br />exit 0;<br />fi<br /><br /><br />#check if catch the new box<br />if (( iHX == iNewX && iHY == iNewY ))<br />then<br />for (( i = ${#iX[@]}; i > iS; i-- ))<br />do<br />(( iX[$i] = ${iX[$i - 1]} ))<br />(( iY[$i] = ${iY[$i - 1]} ))<br />done<br />(( iX[$iS] = iHX ))<br />(( iY[$iS] = iHY ))<br /><br />(( iNextP = iS + 1 ))<br />if (( iNextP >= ${#iX[@]} )); then iNextP=0; fi<br /><br />echo -ne "\a"<br />RandomHeader<br />else<br />(( iNextP = iS + 1 ))<br />if (( iNextP >= ${#iX[@]} )); then iNextP=0; fi<br /><br />#clear snake tailer<br />(( pX = 2 * ${iX[$iS]} + iLeft + 1 ))<br />(( pY = ${iY[$iS]} + iTop + 1 ))<br />(( pM = ${iY[$iS]} * iWidth + ${iX[$iS]} ))<br />(( iMap[$pM] = 0 ))<br />echo -ne "\33["$pY";"$pX"H "<br />(( iX[$iS] = iHX ))<br />(( iY[$iS] = iHY ))<br /><br />fi<br /><br />#draw snake header<br />echo -ne "\33[1m\33[33m"<br />(( pX = 2 * iHX + iLeft + 1 ))<br />(( pY = iHY + iTop + 1 ))<br />(( pM = iHY * iWidth + iHX ))<br />(( iMap[$pM] = 1 ))<br />echo -ne "\33["$pY";"$pX"H[]"<br />echo -ne "\33["$iCursor";1H"<br />echo -ne "\33[0m"<br /><br />(( iS = iNextP ))<br />}<br /><br />trap "if (( iDir != 3 && iDir != 0 )); then iDirection=1; fi" 36<br />trap "if (( iDir != 4 )); then iDirection=2; fi" 37<br />trap "if (( iDir != 1 )); then iDirection=3; fi" 38<br />trap "if (( iDir != 2 )); then iDirection=4; fi" 39<br />trap "exit" 40<br /><br />InitDraw<br /><br />(( iNanoSec = iSpeed * 1000000 ))<br />iTime="1"`date +"%S%N"`<br />while [[ 1 ]]<br />do<br />usleep 100000<br />iTimeNew="1"`date +"%S%N"`<br /><br />#avoid iTimeNew < iTime when new minute comes<br />if (( iTimeNew < iTime ))<br />then<br />(( iTime = iTime - 60000000000 ))<br />fi<br /><br />#detect the time interval<br />if (( iTimeNew - iTime < iNanoSec )); then continue; fi<br />iTime=$iTimeNew<br /><br />iDir=$iDirection<br /><br />if (( iDir != 0 ))<br />then<br />ShiftSnake<br />fi<br />done<br /><!--c2--></div><!--ec2-->