shell编程俄罗斯方块.docx
《shell编程俄罗斯方块.docx》由会员分享,可在线阅读,更多相关《shell编程俄罗斯方块.docx(16页珍藏版)》请在冰豆网上搜索。
shell编程俄罗斯方块
#!
/bin/bash
#TetrisGame
#10.21.2003xhchen
###############################################################################
#因为HP上没有usleepbyCHENCHENG
###############################################################################
##include
##include
#
#intmain(intargc,char**argv)
#{
#intnRet;
#nRet=usleep(atol(argv[1]));
#//printf("%ld%d\n",atol(argv[1]),nRet);
#return0;
#}
###############################################################################
#colordefinition
cRed=1
cGreen=2
cYellow=3
cBlue=4
cFuchsia=5
cCyan=6
cWhite=7
colorTable=($cRed$cGreen$cYellow$cBlue$cFuchsia$cCyan$cWhite)
#size&position
iLeft=3
iTop=2
((iTrayLeft=iLeft+2))
((iTrayTop=iTop+1))
((iTrayWidth=10))
((iTrayHeight=15))
#styledefinition
cBorder=$cGreen
cScore=$cFuchsia
cScoreValue=$cCyan
#controlsignal
sigRotate=25
sigLeft=26
sigRight=27
sigDown=28
sigAllDown=29
sigExit=30
box0=(00011011)
box1=(0212223210111213)
box2=(0001111201101120)
box3=(0102101100101121)
box4=(01021121101112220111202100101112)
box5=(01112122101112200001112102101112)
box6=(01111221101112210110112101101112)
box=(${box0[@]}${box1[@]}${box2[@]}${box3[@]}${box4[@]}${box5[@]}${box6[@]})
countBox=(1222444)
offsetBox=(013571115)
iScoreEachLevel=50#begreaterthan7
#Runtimedata
sig=0
iScore=0
iLevel=0
boxNew=()#newbox
cBoxNew=0#newboxcolor
iBoxNewType=0#newboxtype
iBoxNewRotate=0#newboxrotatedegree
boxCur=()#currentbox
cBoxCur=0#currentboxcolor
iBoxCurType=0#currentboxtype
iBoxCurRotate=0#currentboxrotatedegree
boxCurX=-1#currentXposition
boxCurY=-1#currentYposition
iMap=()
for((i=0;ifunctionRunAsKeyReceiver()
{
localpidDisplayerkeyaKeysigcESCsTTY
pidDisplayer=$1
aKey=(000)
cESC=`echo-ne"\33"`
cSpace=`echo-ne"\40"`
sTTY=`stty-g`
trap"MyExit;"INTTERM
trap"MyExitNoSub;"$sigExit
echo-ne"\33[?
25l"
while[[1]]
do
read-s-n1key
aKey[0]=${aKey[1]}
aKey[1]=${aKey[2]}
aKey[2]=$key
sig=0
if[[$key==$cESC&&${aKey[1]}==$cESC]]
then
MyExit
elif[[${aKey[0]}==$cESC&&${aKey[1]}=="["]]
then
if[[$key=="A"]];thensig=$sigRotate
elif[[$key=="B"]];thensig=$sigDown
elif[[$key=="D"]];thensig=$sigLeft
elif[[$key=="C"]];thensig=$sigRight
fi
elif[[$key=="W"||$key=="w"]];thensig=$sigRotate
elif[[$key=="S"||$key=="s"]];thensig=$sigDown
elif[[$key=="A"||$key=="a"]];thensig=$sigLeft
elif[[$key=="D"||$key=="d"]];thensig=$sigRight
elif[["[$key]"=="[]"]];thensig=$sigAllDown
elif[[$key=="Q"||$key=="q"]]
then
MyExit
fi
if[[$sig!
=0]]
then
kill-$sig$pidDisplayer
fi
done
}
functionMyExitNoSub()
{
localy
stty$sTTY
((y=iTop+iTrayHeight+4))
echo-e"\33[?
25h\33[${y};0H"
exit
}
functionMyExit()
{
kill-$sigExit$pidDisplayer
MyExitNoSub
}
functionRunAsDisplayer()
{
localsigThis
InitDraw
trap"sig=$sigRotate;"$sigRotate
trap"sig=$sigLeft;"$sigLeft
trap"sig=$sigRight;"$sigRight
trap"sig=$sigDown;"$sigDown
trap"sig=$sigAllDown;"$sigAllDown
trap"ShowExit;"$sigExit
while[[1]]
do
for((i=0;i<21-iLevel;i++))
do
usleep20000
sigThis=$sig
sig=0
if((sigThis==sigRotate));thenBoxRotate;
elif((sigThis==sigLeft));thenBoxLeft;
elif((sigThis==sigRight));thenBoxRight;
elif((sigThis==sigDown));thenBoxDown;
elif((sigThis==sigAllDown));thenBoxAllDown;
fi
done
#kill-$sigDown$$
BoxDown
done
}
functionBoxMove()
{
localjixyxTestyTest
yTest=$1
xTest=$2
for((j=0;j<8;j+=2))
do
((i=j+1))
((y=${boxCur[$j]}+yTest))
((x=${boxCur[$i]}+xTest))
if((y<0||y>=iTrayHeight||x<0||x>=iTrayWidth))
then
return1
fi
if((${iMap[y*iTrayWidth+x]}!
=-1))
then
return1
fi
done
return0;
}
functionBox2Map()
{
localjixyxpypline
for((j=0;j<8;j+=2))
do
((i=j+1))
((y=${boxCur[$j]}+boxCurY))
((x=${boxCur[$i]}+boxCurX))
((i=y*iTrayWidth+x))
iMap[$i]=$cBoxCur
done
line=0
for((j=0;jdo
for((i=j+iTrayWidth-1;i>=j;i--))
do
if((${iMap[$i]}==-1));thenbreak;fi
done
if((i>=j));thencontinue;fi
((line++))
for((i=j-1;i>=0;i--))
do
((x=i+iTrayWidth))
iMap[$x]=${iMap[$i]}
done
for((i=0;ido
iMap[$i]=-1
done
done
if((line==0));thenreturn;fi
((x=iLeft+iTrayWidth*2+7))
((y=iTop+11))
((iScore+=line*2-1))
echo-ne"\33[1m\33[3${cScoreValue}m\33[${y};${x}H${iScore}"
if((iScore%iScoreEachLevelthen
if((iLevel<20))
then
((iLevel++))
((y=iTop+14))
echo-ne"\33[3${cScoreValue}m\33[${y};${x}H${iLevel}"
fi
fi
echo-ne"\33[0m"
for((y=0;ydo
((yp=y+iTrayTop+1))
((xp=iTrayLeft+1))
((i=y*iTrayWidth))
echo-ne"\33[${yp};${xp}H"
for((x=0;xdo
((j=i+x))
if((${iMap[$j]}==-1))
then
echo-ne""
else
echo-ne"\33[1m\33[7m\33[3${iMap[$j]}m\33[4${iMap[$j]}m[]\33[0m"
fi
done
done
}
functionBoxDown()
{
localys
((y=boxCurY+1))
ifBoxMove$y$boxCurX
then
s="`DrawCurBox0`"
((boxCurY=y))
s="$s`DrawCurBox1`"
echo-ne$s
else
Box2Map
RandomBox
fi
}
functionBoxLeft()
{
localxs
((x=boxCurX-1))
ifBoxMove$boxCurY$x
then
s=`DrawCurBox0`
((boxCurX=x))
s=$s`DrawCurBox1`
echo-ne$s
fi
}
functionBoxRight()
{
localxs
((x=boxCurX+1))
ifBoxMove$boxCurY$x
then
s=`DrawCurBox0`
((boxCurX=x))
s=$s`DrawCurBox1`
echo-ne$s
fi
}
functionBoxAllDown()
{
localkjixyiDowns
iDown=$iTrayHeight
for((j=0;j<8;j+=2))
do
((i=j+1))
((y=${boxCur[$j]}+boxCurY))
((x=${boxCur[$i]}+boxCurX))
for((k=y+1;kdo
((i=k*iTrayWidth+x))
if((${iMap[$i]}!
=-1));thenbreak;fi
done
((k-=y+1))
if(($iDown>$k));theniDown=$k;fi
done
s=`DrawCurBox0`
((boxCurY+=iDown))
s=$s`DrawCurBox1`
echo-ne$s
Box2Map
RandomBox
}
functionBoxRotate()
{
localiCountiTestRotateboxTestjis
iCount=${countBox[$iBoxCurType]}
((iTestRotate=iBoxCurRotate+1))
if((iTestRotate>=iCount))
then
((iTestRotate=0))
fi
for((j=0,i=(${offsetBox[$iBoxCurType]}+$iTestRotate)*8;j<8;j++,i++))
do
boxTest[$j]=${boxCur[$j]}
boxCur[$j]=${box[$i]}
done
ifBoxMove$boxCurY$boxCurX
then
for((j=0;j<8;j++))
do
boxCur[$j]=${boxTest[$j]}
done
s=`DrawCurBox0`
for((j=0,i=(${offsetBox[$iBoxCurType]}+$iTestRotate)*8;j<8;j++,i++))
do
boxCur[$j]=${box[$i]}
done
s=$s`DrawCurBox1`
echo-ne$s
iBoxCurRotate=$iTestRotate
else
for((j=0;j<8;j++))
do
boxCur[$j]=${boxTest[$j]}
done
fi
}
functionDrawCurBox()
{
localijtbDrawsBoxs
bDraw=$1
s=""
if((bDraw==0))
then
sBox="\40\40"
else
sBox="[]"
s=$s"\33[1m\33[7m\33[3${cBoxCur}m\33[4${cBoxCur}m"
fi
for((j=0;j<8;j+=2))
do
((i=iTrayTop+1+${boxCur[$j]}+boxCurY))
((t=iTrayLeft+1+2*(boxCurX+${boxCur[$j+1]})))
s=$s"\33[${i};${t}H${sBox}"
done
s=$s"\33[0m"
echo-n$s
}
functionRandomBox()
{
localijt
#changecurrentbox
iBoxCurType=${iBoxNewType}
iBoxCurRotate=${iBoxNewRotate}
cBoxCur=${cBoxNew}
for((j=0;j<${#boxNew[@]};j++))
do
boxCur[$j]=${boxNew[$j]}
done
if((${#boxCur[@]}==8))
then
#calculatecurrentbox'sstartingposition
for((j=0,t=4;j<8;j+=2))
do
if((${boxCur[$j]}done
((boxCurY=-t))
for((j=1,i=-4,t=20;j<8;j+=2))
do
if((${boxCur[$j]}>i));theni=${boxCur[$j]};fi
if((${boxCur[$j]}done
((boxCurX=(iTrayWidth-1-i-t)/2))
echo-ne`DrawCurBox1`
if!
BoxMove$boxCurY$boxCurX
then
kill-$sigExit${PPID}
ShowExit
fi
fi
#clearoldbox
for((j=0;j<4;j++))
do
((i=iTop+1+j))
((t=iLeft+2*iTrayWidth+7))
echo-ne"\33[${i};${t}H"
done
#getarandomnewbox
((iBoxNewType=RANDOM%${#offsetBox[@]}))
((iBoxNewRotate=RANDOM%${countBox[$iBoxNewType]}))
for((j=0,i=(${offsetBox[$iBoxNewType]}+$iBoxNewRotate)*8;j<8;j++,i++))
do
boxNew[$j]=${box[$i]};
done
((cBoxNew=${colorTable[RANDOM%${#colorTable[@]}]}))
#displaynewbox
echo-ne"\33[1m\33[7m\33[3${cBoxNew}m\33[4${cBoxNew}m"
for((j=0;j<8;j+=2))
do
((i=iTop+1+${boxNew[$j]}))
((t=iLeft+2*iTrayWidth+7+2*${boxNew[$j+1]}))
echo-ne"\33[${i};${t}H[]"
done
echo-ne"\33[0m"
}
functionInitDraw()
{
clear
RandomBox
RandomBox
localit1t2t3
#drawborder
echo-ne"\33[1m"
echo-ne"\33[3${cBorder}m\33[4${cBorder}m"
((t2=iLeft+1))
((t3=iLeft+iTrayWidth*2+3))
for((i=0;i