shell编程实现俄罗斯方块_第1页
shell编程实现俄罗斯方块_第2页
shell编程实现俄罗斯方块_第3页
shell编程实现俄罗斯方块_第4页
shell编程实现俄罗斯方块_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#!/bin/shaBox0_0=(0000001000000000111000000)aBox0_1=(0000010000000000010000000000011000000)aBox0_2=(000000000000000011100000000010000000-1)aBox0_3=(0000110000000000010000000000010000000)aBox1_0=(0000100000000000111000000)aBox1_1=(0000011000000000010000000000010000000)aBox1_2=(000000000000000011100000000000100000-1)aBox1_3=(0000010000000000010000000000110000000)aBox2_0=(0000100000000000110000000000010000000)aBox2_1=(0000011000000000110000000)aBox3_0=(0000010000000000110000000000100000000)aBox3_1=(0000110000000000011000000)aBox4_0=(000000000000000011110000-1)aBox4_1=(0000010000000000010000000000010000000000010000000)aBox5_0=(0000011000000000011000000)aBox6_0=(0000010000000000111000000)aBox6_1=(0000010000000000011000000000010000000)aBox6_2=(000000000000000011100000000001000000-1)aBox6_3=(0000010000000000110000000000010000000)iSumType=7 #方块类型总数aStyles=(4422214) #各个种类方块样式数iOrigoX=10 #显示起始位置xiOrigoY=5 #显示起始位置yiMapWidth=12 #方块宽10iMapHeight=15#方块高15iBox_X=0 #方块位置xiBox_Y=0 #方块位置yiScore=0 #分数iLevel=0 #级别iScoreEachLevle=50 #每升一级需积累分数#初始化所有背景方块for((i=0;i<iMapWidth*iMapHeight;i++))doaBoxBg[$i]=0done#定义控制信号,挪用信号25~31iSIG=0#iSIG_Rotate=25#旋转iSIG_Left=26#向左移动iSIG_Right=27#向右移动iSIG_Down=28#向下iSIG_FallDown=29#直落到底iSIG_Exit=30#退出iSIG_Pause=31#暂停Control(){trap"Game_Exit"2315$iSIG_Exitecho-ne"\033[?25l"SAVEDSTTY=`stty-g`iDisplayPID=$1while:doread-s-n1LINEiSIG=0case$LINEin"A")iSIG=$iSIG_Rotate;;"B")iSIG=$iSIG_Down;;"D")iSIG=$iSIG_Left;;"C")iSIG=$iSIG_Right;;"")iSIG=$iSIG_FallDown;;p|P)iSIG=$iSIG_Pause;;q|Q)Game_Exit;;esac[$iSIG-ne0]&&kill-$iSIG$iDisplayPIDdone}Display(){trap"iSIG=$iSIG_Rotate"$iSIG_Rotatetrap"iSIG=$iSIG_Down"$iSIG_Downtrap"iSIG=$iSIG_Left"$iSIG_Lefttrap"iSIG=$iSIG_Right"$iSIG_Righttrap"iSIG=$iSIG_FallDown"$iSIG_FallDowntrap"iSIG=$iSIG_Pause"$iSIG_PauselocaliSIGThisiclearfor((i=0;i<${#aBoxMove[*]};i++))do[$((iBox_Y*12+i))-lt0]&&continue #排除刚开始显示方块时iBox_Y为负的情况if["${aBoxMove[$i]}"=="1"-a"${aBoxBg[$((iBox_Y*12+i))]}"!="0"];then #触底iBox_Y=$((iBox_Y-1)) #复原return0fidoneiBox_Y=$((iBox_Y-1))return1}Box_Delete()#消行.计算分数.{localijklineaLineFull=()aBoxBgNew=()line=0k=0#检查那些行可以消掉for((i=0;i<15;i++)) #ydofor((j=0;j<10;j++))do[${aBoxBg[$((i*12+1+j))]}-eq0]&&break[$j-eq9]&&aLineFull[$line]=$i&&((line++))donedone[$line-eq0]&&return0#计算分数和级别iScore=$((iScore+(line*2)-1))echo-ne"\033[15;$((iOrigoX+30))H${iScore}"if[[$((iScore/iScoreEachLevle))-gt$iLevel&&$iLevel-lt20]]then((iLevel++))fiecho-ne"\033[20;$((iOrigoX+30))H${iLevel}\033[0m"#重新整理aBoxBg数组for((i=0;i<15;i++))dowhile["$((i+k-line))"=="${aLineFull[$k]}"]#这里处理连续消除多行do((k++))donefor((j=0;j<12;j++))doif[$i-lt$line];thenaBoxBgNew[$((i*12+j))]=0elseaBoxBgNew[$((i*12+j))]=${aBoxBg[$(((i+k-line)*12+j))]}fidonedone#刷新背景aBoxBg=(${aBoxBgNew[*]})for((i=0;i<15;i++))#ydofor((j=0;j<10;j++))doecho-ne"\033[$((i+iOrigoY));$((((j+1)*2)+iOrigoX))H"if[${aBoxBg[$((i*12+1+j))]}-eq0];thenecho""elseecho-ne"\033[1m\033[${aBoxBg[$((i*12+1+j))]}m[]\033[0m"fidonedone}Create_Box()#显示新方块{aBoxMove=()if[-z"$iCurrentType"];then((iCurrentType=RANDOM%$iSumType))((iCurrentStyle=RANDOM%${aStyles[$iCurrentType]}))((iCurrentColor=41+RANDOM%7))elseiCurrentType=$iNewTypeiCurrentStyle=$iNewStyleiCurrentColor=$iNewColorfi#iCurrentType=4#iCurrentStyle=1aBoxMove=(`eval'echo${aBox'$iCurrentType'_'$iCurrentStyle'[*]}'`)iBox_Y=${aBoxMove[$((${#aBoxMove[*]}-1))]}iBox_X=0Draw_Box_NewRandom_BoxIsBottom&&kill-$iSIG_Exit$PPID}Random_Box()#随机产生方块并预显示{locali((iNewType=RANDOM%$iSumType))((iNewStyle=RANDOM%${aStyles[$iNewType]}))((iNewColor=41+RANDOM%7))#抹掉原显示for((i=0;i<${#aBoxMove[*]};i++))doif[${aBoxMove[$i]}-eq1];thenecho-ne"\033[$(($i/12+iOrigoY));$((($i%12)*2+iOrigoX+20))H"fidone#预显示新方块aBoxNEW=(`eval'echo${aBox'$iNewType'_'$iNewStyle'[*]}'`)for((i=0;i<${#aBoxNEW[*]};i++))doif[${aBoxNEW[$i]}-eq1];thenecho-ne"\033[1m\033[${iNewColor}m\033[$(($i/12+iOrigoY));$((($i%12)*2+iOrigoX+20))H[]\033[0m"fidone}Move_Left(){locali#判断是否碰墙for((i=0;i<$((${#aBoxMove[*]}/12));i++))do[${aBoxMove[$((i*12+1))]}-eq1]&&return0done#判断是否碰背景for((i=0;i<${#aBoxMove[*]};i++))do[$((iBox_Y*12+i))-le0]&&continue#排除刚开始显示方块时iBox_Y为负的情况[${aBoxMove[$i]}-eq1-a${aBoxBg[$((iBox_Y*12+i-1))]}-ne0]&&return0#触底done#清除原显示Draw_Box_Clearfor((i=0;i<$((${#aBoxMove[*]}-2));i++))doaBoxMove[$i]=${aBoxMove[$((i+1))]}done#重新显示方块Draw_Box_NewiBox_X=$((iBox_X-1))}Move_Right()#右移{locali#判断是否碰墙for((i=0;i<$((${#aBoxMove[*]}/12));i++))do[${aBoxMove[$((i*12+10))]}-eq1]&&return0done#判断是否碰背景for((i=0;i<${#aBoxMove[*]};i++))do[$((iBox_Y*12+i))-lt0]&&continue#排除刚开始显示方块时iBox_Y为负的情况["${aBoxMove[$i]}"=="1"-a"${aBoxBg[$((iBox_Y*12+i+1))]}"!="0"]&&return0#触底done#清除原显示Draw_Box_Clearfor((i=$((${#aBoxMove[*]}-2));i>0;i--))doaBoxMove[$i]=${aBoxMove[$((i-1))]}done#重新显示方块Draw_Box_NewiBox_X=$((iBox_X+1))}Move_Down()#下落一格{localiif!IsBottom #返回0则表示底部thenDraw_Box_CleariBox_Y=$((iBox_Y+1))#画新方块Draw_Box_Newelse# 把当前方块移到背景(把方块位置的背景设置为颜色数)(注:0为空)for((i=0;i<${#aBoxMove[*]};i++))doif[${aBoxMove[$i]}-eq1];thenaBoxBg[$((iBox_Y*12+i))]=$iCurrentColorfidoneBox_DeleteCreate_Boxfi}Move_FallDown()#直落到底{localiDraw_Box_Clearfor((i=0;i<15;i++))doif!IsBottomtheniBox_Y=$((iBox_Y+1))elsebreakfidoneDraw_Box_NewMove_Down}Move_Rotate()#当前style跳转到下一style,x位移量根据iBox_X位置决定{locali[${aStyles[$iCurrentType]}-eq1]&&return0 #只有一种类型的不处理[$iBox_Y-lt0]&&return0#iBox_Y<0不处理sRotateStyle=$(((iCurrentStyle+1)%${aStyles[$iCurrentType]}))aBoxRotate=(`eval'echo${aBox'$iCurrentType'_'$sRotateStyle'[*]}'`)#先根据iBox_X作左右移位处理,把重新赋值aBoxRotate/aBoxMoveif[$iBox_X-gt0];then #右移for((i=$((${#aBoxRotate[*]}-2));i>=iBox_X;i--))#原数组末尾增加了一位数记录起始位置,所以这里要减2doaBoxRotate[$i]=${aBoxRotate[$((i-iBox_X))]}donefor((i=0;i<iBox_X;i++))doaBoxRotate[$i]=0doneelse #左移for((i=0;i<$((${#aBoxRotate[*]}+$iBox_X-2));i++))doaBoxRotate[$i]=${aBoxRotate[$((i-iBox_X))]}donefo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论