用Shell编写的俄罗斯方块小游戏LinuxWord文档格式.docx
- 文档编号:19303448
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:18
- 大小:19.46KB
用Shell编写的俄罗斯方块小游戏LinuxWord文档格式.docx
《用Shell编写的俄罗斯方块小游戏LinuxWord文档格式.docx》由会员分享,可在线阅读,更多相关《用Shell编写的俄罗斯方块小游戏LinuxWord文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
#各种方块旋转后可能的样式数目
countBox=(1222444)
#各种方块再box数组中的偏移
offsetBox=(013571115)
#每提高一个速度级需要积累的分数
iScoreEachLevel=50#begreaterthan7
#运行时数据
sig=0#接收到的signal
iScore=0#总分
iLevel=0#速度级
boxNew=()#新下落的方块的位置定义
cBoxNew=0#新下落的方块的颜色
iBoxNewType=0#新下落的方块的种类
iBoxNewRotate=0#新下落的方块的旋转角度
boxCur=()#当前方块的位置定义
cBoxCur=0#当前方块的颜色
iBoxCurType=0#当前方块的种类
iBoxCurRotate=0#当前方块的旋转角度
boxCurX=-1#当前方块的x坐标位置
boxCurY=-1#当前方块的y坐标位置
iMap=()#背景方块图表
#初始化所有背景方块为-1,表示没有方块
for((i=0;
i<
iTrayHeight*iTrayWidth;
i++));
doiMap[$i]=-1;
done
#接收输入的进程的主函数
functionRunAsKeyReceiver()
{
localpidDisplayerkeyaKeysigcESCsTTY
pidDisplayer=$1
aKey=(000)
cESC=`echo-ne"
\33"
`
cSpace=`echo-ne"
\40"
#保存终端属性。
在read-s读取终端键时,终端的属性会被暂时改变。
#如果在read-s时程序被不幸杀掉,可能会导致终端混乱,
#需要在程序退出时恢复终端属性。
sTTY=`stty-g`
#捕捉退出信号
trap"
MyExit;
"
INTTERM
MyExitNoSub;
$sigExit
#隐藏光标
echo-ne"
\33[?
25l"
while[[1]]
do
#读取输入。
注-s不回显,-n读到一个字符立即返回
read-s-n1key
aKey[0]=${aKey[1]}
aKey[1]=${aKey[2]}
aKey[2]=$key
sig=0
#判断输入了何种键
if[[$key==$cESC&
&
${aKey[1]}==$cESC]]
then
#ESC键
MyExit
elif[[${aKey[0]}==$cESC&
${aKey[1]}=="
["
]]
if[[$key=="
A"
]];
thensig=$sigRotate#<
向上键>
elif[[$key=="
B"
thensig=$sigDown#<
向下键>
D"
thensig=$sigLeft#<
向左键>
C"
thensig=$sigRight#<
向右键>
fi
W"
||$key=="
w"
thensig=$sigRotate#W,w
S"
s"
thensig=$sigDown#S,s
a"
thensig=$sigLeft#A,a
d"
thensig=$sigRight#D,d
elif[["
[$key]"
=="
[]"
thensig=$sigAllDown#空格键
Q"
q"
]]#Q,q
if[[$sig!
=0]]
#向另一进程发送消息
kill-$sig$pidDisplayer
}
#退出前的恢复
functionMyExitNoSub()
localy
#恢复终端属性
stty$sTTY
((y=iTop+iTrayHeight+4))
#显示光标
echo-e"
\033[?
25h\033[${y};
0H"
exit
functionMyExit()
#通知显示进程需要退出
kill-$sigExit$pidDisplayer
MyExitNoSub
#处理显示和游戏流程的主函数
functionRunAsDisplayer()
localsigThis
InitDraw
#挂载各种信号的处理函数
sig=$sigRotate;
$sigRotate
sig=$sigLeft;
$sigLeft
sig=$sigRight;
$sigRight
sig=$sigDown;
$sigDown
sig=$sigAllDown;
$sigAllDown
ShowExit;
#根据当前的速度级iLevel不同,设定相应的循环的次数
for((i=0;
21-iLevel;
i++))
usleep20000
sigThis=$sig
#根据sig变量判断是否接受到相应的信号
if((sigThis==sigRotate));
thenBoxRotate;
#旋转
elif((sigThis==sigLeft));
thenBoxLeft;
#左移一列
elif((sigThis==sigRight));
thenBoxRight;
#右移一列
elif((sigThis==sigDown));
thenBoxDown;
#下落一行
elif((sigThis==sigAllDown));
thenBoxAllDown;
#下落到底
#kill-$sigDown$$
BoxDown#下落一行
#BoxMove(y,x),测试是否可以把移动中的方块移到(x,y)的位置,返回0则可以,1不可以
functionBoxMove()
localjixyxTestyTest
yTest=$1
xTest=$2
for((j=0;
j<
8;
j+=2))
((i=j+1))
((y=${boxCur[$j]}+yTest))
((x=${boxCur[$i]}+xTest))
if((y<
0||y>
=iTrayHeight||x<
0||x>
=iTrayWidth))
#撞到墙壁了
return1
if((${iMap[y*iTrayWidth+x]}!
=-1))
#撞到其他已经存在的方块了
return0;
#将当前移动中的方块放到背景方块中去,
#并计算新的分数和速度级。
(即一次方块落到底部)
functionBox2Map()
localjixyxpypline
#将当前移动中的方块放到背景方块中去
((y=${boxCur[$j]}+boxCurY))
((x=${boxCur[$i]}+boxCurX))
((i=y*iTrayWidth+x))
iMap[$i]=$cBoxCur
#消去可被消去的行
line=0
iTrayWidth*iTrayHeight;
j+=iTrayWidth))
for((i=j+iTrayWidth-1;
i>
=j;
i--))
if((${iMap[$i]}==-1));
thenbreak;
if((i>
=j));
thencontinue;
((line++))
for((i=j-1;
=0;
((x=i+iTrayWidth))
iMap[$x]=${iMap[$i]}
iTrayWidth;
iMap[$i]=-1
if((line==0));
thenreturn;
#根据消去的行数line计算分数和速度级
((x=iLeft+iTrayWidth*2+7))
((y=iTop+11))
((iScore+=line*2-1))
#显示新的分数
\033[1m\033[3${cScoreValue}m\033[${y};
${x}H${iScore}"
if((iScore%iScoreEachLevel<
line*2-1))
if((iLevel<
20))
((iLevel++))
((y=iTop+14))
#显示新的速度级
\033[3${cScoreValue}m\033[${y};
${x}H${iLevel}"
\33[0m"
#重新显示背景方块
for((y=0;
y<
iTrayHeight;
y++))
((yp=y+iTrayTop+1))
((xp=iTrayLeft+1))
((i=y*iTrayWidth))
\033[${yp};
${xp}H"
for((x=0;
x<
x++))
((j=i+x))
if((${iMap[$j]}==-1))
"
else
\033[1m\033[7m\033[3${iMap[$j]}m\033[4${iMap[$j]}m[]\033[0m"
#下落一行
functionBoxDown()
localys
((y=boxCurY+1))#新的y坐标
ifBoxMove$y$boxCurX#测试是否可以下落一行
s="
`DrawCurBox0`"
#将旧的方块抹去
((boxCurY=y))
$s`DrawCurBox1`"
#显示新的下落后方块
echo-ne$s
#走到这儿,如果不能下落了
Box2Map#将当前移动中的方块贴到背景方块中
RandomBox#产生新的方块
#左移一列
functionBoxLeft()
localxs
((x=boxCurX-1))
ifBoxMove$boxCurY$x
s=`DrawCurBox0`
((boxCurX=x))
s=$s`DrawCurBox1`
#右移一列
functionBoxRight()
((x=boxCurX+1))
#下落到底
functionBoxAllDown()
localkjixyiDowns
iDown=$iTrayHeight
#计算一共需要下落多少行
for((k=y+1;
k<
k++))
((i=k*iTrayWidth+x))
if((${iMap[$i]}!
=-1));
((k-=y+1))
if(($iDown>
$k));
theniDown=$k;
s=`DrawCurBox0`#将旧的方块抹去
((boxCurY+=iDown))
s=$s`DrawCurBox1`#显示新的下落后的方块
#旋转方块
functionBoxRotate()
localiCountiTestRotateboxTestjis
iCount=${countBox[$iBoxCurType]}#当前的方块经旋转可以产生的样式的数目
#计算旋转后的新的样式
((iTestRotate=iBoxCurRotate+1))
if((iTestRotate>
=iCount))
((iTestRotate=0))
#更新到新的样式,保存老的样式(但不显示)
for((j=0,i=(${offsetBox[$iBoxCurType]}+$iTestRotate)*8;
j++,i++))
boxTest[$j]=${boxCur[$j]}
boxCur[$j]=${box[$i]}
ifBoxMove$boxCurY$boxCurX#测试旋转后是否有空间放的下
#抹去旧的方块
j++))
boxCur[$j]=${boxTest[$j]}
#画上新的方块
iBoxCurRotate=$iTestRotate
#不能旋转,还是继续使用老的样式
#DrawCurBox(bDraw),绘制当前移动中的方块,bDraw为1,画上,bDraw为0,抹去方块。
functionDrawCurBox()
localijtbDrawsBoxs
bDraw=$1
if((bDraw==0))
sBox="
\40\40"
s=$s"
\033[1m\033[7m\033[3${cBoxCur}m\033[4${cBoxCur}m"
((i=iTrayTop+1+${boxCur[$j]}+boxCurY))
((t=iTrayLeft+1+2*(boxCurX+${boxCur[$j+1]})))
#\033[y;
xH,光标到(x,y)处
\033[${i};
${t}H${sBox}"
echo-n$s
#更新新的方块
functionRandomBox()
localijt
#更新当前移动的方块
iBoxCurType=${iBoxNewType}
iBoxCurRotate=${iBoxNewRotate}
cBoxCur=${cBoxNew}
${#boxNew[@]};
boxCur[$j]=${boxNew[$j]}
#显示当前移动的方块
if((${#boxCur[@]}==8))
#计算当前方块该从顶端哪一行"
冒"
出来
for((j=0,t=4;
if((${boxCur[$j]}<
t));
thent=${boxCur[$j]};
((boxCurY=-t))
for((j=1,i=-4,t=20;
if((${boxCur[$j]}>
i));
theni=${boxCur[$j]};
((boxCurX=(iTrayWidth-1-i-t)/2))
echo-ne`DrawCurBox1`
#如果方块一出来就没处放,Gameover!
if!
BoxMove$boxCurY$boxCurX
kill-$sigExit${PPID}
ShowExit
#清除右边预显示的方块
4;
((i=iTop+1+j))
((t=iLeft+2*iTrayWidth+7))
\33[${i};
${t}H"
#随机产生新的方块
((iBoxNewType=RANDOM%${#offsetBox[@]}))
((iBoxNewRotate=RANDOM%${countBox[$iBoxNewType]}))
for((j=0,i=(${offsetBox[$iBoxNewType]}+$iBoxNewRotate)*8;
boxNew[$j]=${box[$i]};
((cBoxNew=${colorTable[RANDOM%${#colorTable[@]}]}))
#显示右边预显示的方块
\033[1m\033[7m\33[3${cBoxNew}m\033[4${cBoxNew}m"
((i=iTop+1+${boxNew[$j]}))
((t=iLeft+2*iTrayWidth+7+2*${boxNew[$j+1]}))
${t}H[]"
\033[0m"
#初始绘制
functionInit
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Shell 编写 俄罗斯方块 小游戏 Linux