shell编程俄罗斯方块.docx
- 文档编号:4018376
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:16
- 大小:17.57KB
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;i functionRunAsKeyReceiver() { 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;j do 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;i do 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%iScoreEachLevel then 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;y do ((yp=y+iTrayTop+1)) ((xp=iTrayLeft+1)) ((i=y*iTrayWidth)) echo-ne"\33[${yp};${xp}H" for((x=0;x do ((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;k do ((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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- shell 编程 俄罗斯方块
![提示](https://static.bdocx.com/images/bang_tan.gif)