用shell脚本写的一个简单的俄罗斯方块

  • 代码
    • 代码
    • 测试
    • 下载链接

代码

代码

#!/bin/bash
#version 1.2,若非正常退出,请使用附带的killel.sh脚本杀死进程
#定义用于显示的地图map和背景全地图mapbackmap=(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) #游戏共有20行,16列,此处定义行数,而每行是否有方块由数组中的元素决定(二进制的0为没有方块,1为有方块)
mapback=(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) #(0 0 0 0 0 0 65534 65534 65534 65534 65534 65534 65534 65534 65534 65534 65534 65534 65534 65534 )  #用于临时存放包含当前方块的背景地图
zongtime=10
sleeptime=0.1
downtime=0#存放当前方块的相关参数
curx=7
cury=0
curtype=0
curstat=0
curfk=(0 0 0 0)        #用于表示当前方块的数组#预制方块参数
yutype=0
yustat=0
yufk=(0 0 0 0)#分数和行数
zongfen=0
zonghang=0
dancifen=0
dangqianhang=0
qiancihang=0
dengji=1#用于存放fGetfk生成的方块
scfk=(0 0 0 0)#游戏参数
cyzfc="左移a 右移d 变形j 落地k 加速s 退出q 暂停p 存档c 取档l 重新开始r"
zhuangtai=$cyzfc
fangkuai="@"
beijing=" "
gameover=0#难度相关参数
nanduline=0  #存放底部随机产生的行
nandutime=0  #在时间难度模式下的计时器
nanduzongtime=100 #在时间难度模式下的产生底部随机行的时间间隔
nandutimeflag=0  #是否打开时间难度的标志位
nandudengji=1
nanduzonghang=12 #在行数难度模式下的消除多少行产生底部随机行
nanduhang=0  #在行数难度模式下的行数计数器
nanduhangflag=0  #是否带开行数难度的标志位#以后要修改的:定义当前方块和临时方块############################################
#      (3 3|0 15,2 2 2 2|2 7,2 3 2,0 7 2,2 6 2|1 7,2 2 3,7 4,3 1 1|4 7,3 2 2,7 1,1 1 3|6 3,1 3 2|3 6,2 3 1)
#allfk=(3 3 0 15 2 2 2 2 2 7 2 3 2 0 7 2 2 6 2 1 7 2 2 3 7 4 3 1 1 4 7 3 2 2 7 1 1 1 3 6 3 1 3 2 3 6 2 3 1)
#        (2|2 4|2 3 3 3|2 3 2 3|2 3 2 3|2 3|2 3)
#afkstat=(2 2 4 2 3 3 3 2 3 2 3 2 3 2 3 2 3 2 3)
#afktype=(1 2 4 4 4 2 2)
##################################################################################定义各类方块,(各类方块对应数字:1、田字形 2、长条形 3、山字形 4、左勾形 5、右勾形 6、左之形 7、右之形)
function fGetfk(){ #参数1:方块类型  #参数2:方块状态case $1 in1)scfk=(3 3);;2)case $2 in1)scfk=(0 15);;2)scfk=(1 1 1 1);;3)scfk=(0 15);;4)scfk=(1 1 1 1);;esac ;; 3)case $2 in1)scfk=(2 7);;2)scfk=(2 3 2);;3)scfk=(0 7 2);;4)scfk=(1 3 1);;esac;;4)case $2 in1)scfk=(1 7);;2)scfk=(2 2 3);;3)scfk=(7 4);;4)scfk=(3 1 1);;esac;;5)case $2 in1)scfk=(4 7);;2)scfk=(3 2 2);;3)scfk=(7 1);;4)scfk=(1 1 3);;esac;;6)case $2 in1)scfk=(6 3);;2)scfk=(1 3 2);;3)scfk=(6 3);;4)scfk=(1 3 2);;esac;;7)case $2 in1)scfk=(3 6);;2)scfk=(2 3 1);;3)scfk=(3 6);;4)scfk=(2 3 1);;esac;;esac
}#刷背景地图的函数,也即是把当前方块融入背景地图
function fMaptemp(){local ifor ((i=0;i<20;i++))do((mapback[i]=map[i]))done
}#刷显示地图的函数
function fMap(){local ifor ((i=0;i<20;i++))do((map[i]=mapback[i]))done
}#绘制当前方块
function fDrawfk(){  #参数1:给定的y坐标local curfktemp cH ifor ((i=0;i<4;i++))do((curfktemp=curfk[i]<< curx))((map[$1+i]=mapback[$1+i]|curfktemp))done
}#方块左移的函数
function fLeft(){if fPeng $((curx+1)) $cury $curtype $curstatthen((curx++))fDrawfk $curyfi
}#方块右移的函数
function fRight(){if fPeng $((curx-1)) $cury $curtype $curstatthen((curx--))fDrawfk $curyfi
}#方块变形的函数
function fChange(){local cH i tempx j pengfGetfk $curtype $curstatfor j in 0 -1 -2 -3 do((tempx=curx+j))if fPeng $tempx $cury $curtype $((curstat%4+1))then((curstat=curstat%4+1))curx=$tempxfor ((i=0;i<4;i++))do((curfk[i]=scfk[i]))donefDrawfk $curyreturn 0fidone
}#方块下移的函数
function fDown(){local aif fPeng $curx $((cury+1)) $curtype $curstatthen((map[cury]=mapback[cury]))((cury++))fDrawfk $curyelsefMaptempfZhenglifInitreturn 0fi
}#方块直接落底的函数
function fDownbottom(){local a i1 i2for ((i1=cury;i1<19;i1++))dofPeng $curx $(($i1+1)) $curtype $curstat;a=$?if [ $a -eq 1 ]thenfor ((i2=0;i2<4;i2++))do((map[cury+i2]=mapback[cury+i2]))done((cury=$i1))fDrawfk $curyfMaptempfZhenglifInit#fDownreturn 0fidone
}#判断是否出边界或与其他方块碰撞的函数
function fPeng(){ #参数1:移动后的x坐标   #参数2:移动后的y坐标 #参数3:方块的类型 #参数4:方块的状态local cH chazhifGetfk $3 $4cH=${#scfk[@]}
# fRemovefk $curyfor ((i=0;i<4;i++))doif (( $1<0 || ((scfk[i]<<$1))>65535 || (($2+$cH))>20 || ((((scfk[i]<<$1))&mapback[$2+i]))>0))thenreturn 1fidonereturn 0
}#检查函数
function fCheck(){local ifor ((i=0;i<4;i++))doif [ ${map[cury+i]} -eq 65535 ]thenreturn 0fidonereturn 1
}#整理及记分函数
function fZhengli(){local i j k cH mapbottomj=19if fCheckthenfGetfk $curtype $curstat cH=${#scfk[@]}for i in {0..3}dofor ((k=0;k<cH;k++))doif [ ${mapback[cury+k]} -eq 65535 ]thenif [ ${map[cury+k]} -eq 65535 ]thenmap[cury+k]=0elif [ ${map[cury+k]} -eq 0 ]thenmap[cury+k]=65535fifidonefDisplaysleep 0.3donefor ((i=19;i>=0;i--))doif [ ${mapback[i]} -ne 65535 ]thenmap[j]=${mapback[i]}((j--))fidone((dangqianhang=j+1))for ((j=$j;j>=0;j--))domap[j]=0done fMaptemp#计分方法if [ $dangqianhang -eq $qiancihang -a $dangqianhang -ne 1 ]then((dancifen=dancifen+5*dangqianhang*dangqianhang*(dengji+9)/10*(10+nanduhangflag*2)/10)) #若与上次消除行数相同,则分数加成else((dancifen=(10*dangqianhang)*(dengji+9)/10*(10+nanduhangflag*2)/10))  #若与上次消除行数不相同,则分数加成消失fi((zongfen=zongfen+dancifen))((zonghang=zonghang+dangqianhang))qiancihang=$dangqianhang((nanduhang=nanduhang+dangqianhang))if ((((zonghang/50+1))>dengji))then ((dengji=zonghang/50+1)) for i in {1..4}dozhuangtai="升级了!准备进入下一级"fDisplaysleep 0.2zhuangtai=""fDisplaysleep 0.2donezhuangtai=$cyzfcfiif ((zongtime<11))then((zongtime=11-dengji))fiif ((nanduhangflag==1&&nanduhang>=nanduzonghang))thenfHangnandunanduhang=0#mapbottom=map[19]for i in {1..3}domap[19]=0fDisplaysleep 0.3map[19]=$nandulinefDisplaysleep 0.3donefifi
}#新方块初始化函数
function fInit(){local cH icurtype=$yutypecurstat=$yustat((yutype=$RANDOM%7+1))((yustat=$RANDOM%4+1))fGetfk $yutype $yustatfor i in {0..3}do((yufk[i]=scfk[i]))done#curtype=2#curstat=1curx=7cury=0fGetfk $curtype $curstatfor ((i=0;i<4;i++))do((curfk[i]=scfk[i]))donedowntime=0fDrawfk $cury#测试新出方块是否一出来就和背景方块重合,是则代表游戏结束fPeng $curx $cury $curtype $curstat;a=$?if [ $a -ne 0 ]thengameover=1# echo "o" > ctrl.txt# cat ctrl.txt>>debug#return 1fi
}#时间难度
function fTimenandu(){local ifPeng $curx $((cury+1)) $curtype $curstatif [ $? -ne 0 ]thenfMaptempfZhenglifInitfi((nanduline=$RANDOM%32767+$RANDOM%32766+1))for i in {0..18}domapback[i]=${mapback[i+1]}donemapback[19]=$nandulinefMapfDrawfk $curyfPeng $curx $((cury+1)) $curtype $curstatif [ $? -ne 0 ]thenfMapfDrawfk $curyfMaptempfZhenglifInitfi
}#行数难度
function fHangnandu(){local i((nanduline=$RANDOM%32767+$RANDOM%32766+1))for i in {0..18}domapback[i]=${mapback[i+1]}donemapback[19]=$nandulinefMap#fDrawfk $cury
}#输出调试数据的函数,此函数仅用于调试
function fTiaoshi(){ #参数1:接收调试数据的文件echo "map   ${map[@]}" >$1echo "mapba ${mapback[@]}" >> $1echo -n "curx  $curx" >> $1echo -n "cury  $cury" >> $1echo -n "curtype $curtype" >> $1echo -n "curstat $curstat" >> $1echo -n "yutype $yutype" >> $1echo -n "yustat $yustat" >> $1echo -n "zongfen  $zongfen" >> $1echo -n "zonghang $zonghang" >> $1echo -n "dancifen $dancifen" >> $1echo -n "dangqianhang $dangqianhang" >> $1echo -n "qiancihang $qiancihang" >> $1echo "dengji $dengji" >> $1echo "" >> $1
}#存档
function fSave(){echo "${map[@]}" >> save.txt        #显示地图echo "${mapback[@]}" >> save.txt    #背景地图echo "${curx}" >> save.txt          #当前x坐标echo "${cury}" >> save.txt          #当前y坐标echo "${curtype}" >> save.txt       #当前方块类型echo "${curstat}" >> save.txt       #当前方块状态echo "${yutype}" >> save.txt        #预制方块类型  echo "${yustat}" >> save.txt        #预制方块状态  echo "${zongfen}" >> save.txt       #总分  echo "${zonghang}" >> save.txt      #总行数echo "${dancifen}" >> save.txt      #单次得分   echo "${dangqianhang}" >> save.txt  #当前消除行数echo "${qiancihang}" >> save.txt    #前次消除行数echo "${dengji}" >> save.txt        #等级echo "a${fangkuai}" >> save.txt     #用于代表方块的字符 echo "a${beijing}" >> save.txt      #用于代表背景的字符echo "${nanduhangflag}" >> save.txt #是否开启难度的标志echo "${nanduhang}" >> save.txt     #底部出现的随机行计数器
}#读档
function fLoad(){local j=0map=()mapback=()for i in `sed -n "1p" save.txt`domap[j]=$i((j++))donej=0for i in `sed -n "2p" save.txt`domapback[j]=$i((j++))donecurx=`sed -n "3p" save.txt`cury=`sed -n "4p" save.txt`curtype=`sed -n "5p" save.txt`curstat=`sed -n "6p" save.txt`yutype=`sed -n "7p" save.txt`yustat=`sed -n "8p" save.txt`zongfen=`sed -n "9p" save.txt`zonghang=`sed -n "10p" save.txt`dancifen=`sed -n "11p" save.txt`dangqianhang=`sed -n "12p" save.txt`qiancihang=`sed -n "13p" save.txt`dengji=`sed -n "14p" save.txt`fangkuai=`sed -n "15p" save.txt`if [ "$fangkuai" == "a" ]thenfangkuai=" "elsefangkuai=${fangkuai:1:1}fibeijing=`sed -n "16p" save.txt`if [ "$beijing" == "a" ]thenbeijing=" "elsebeijing=${beijing:1:1}ficurfk=()scfk=()yufk=()fGetfk $curtype $curstatfor ((i=0;i<4;i++))docurfk[i]=${scfk[i]}donefGetfk $yutype $yustatfor ((i=0;i<4;i++))doyufk[i]=${scfk[i]}doneif ((zongtime<11))then((zongtime=11-dengji))finanduhangflag=`sed -n "17p" save.txt`nanduhang=`sed -n "18p" save.txt`
}#读取配置文件
function fConf(){beijing=`sed -n "/beijing=/p" peizhi.conf`if [ "$beijing" == "beijing=" ]thenbeijing=" "elsebeijing=${beijing:${#beijing}-1:1}fifangkuai=`sed -n "/fangkuai=/p" peizhi.conf`if [ "$fangkuai" == "fangkuai=" ]thenfangkuai=" "elsefangkuai=${fangkuai:${#fangkuai}-1:1}fi
}#退出函数
function fExit(){local ctkey izhuangtai="确定要退出吗?(y/n)"fDisplay:>ctrl.txtwhile truedoctkey=$(cat ctrl.txt)if [ "$ctkey" == "n" ]thenzhuangtai=$cyzfc:>ctrl.txtreturnelif [ "$ctkey" == "y" ]thenbreak fisleep 0.2donerm -fr ctrl.txt fk.disp start.txtclearfor i in $(ps -aux |grep -E "fk.disp"|grep -Ev "vim|grep"|awk '{print $2}')dokill -9 $i &>/dev/nulldoneclearfor i in $(ps -aux |grep -E "elsfk|start.txt"|grep -Ev "vim|grep"|awk '{print $2}')dokill -9 $i &>/dev/nulldoneclearexit
}#根据参数修改显示文件fk.disp,然后根据fk.disp文件显示游戏画面
function fDisplay(){local x y i j:> fk.dispx=65536;y=${map[0]}echo -n "|" >> fk.dispfor j in {1..16}dox=$((x>>1))if [ $((x&y)) -ne 0 ]thenecho -n "${fangkuai}" >> fk.dispelseecho -n "${beijing}" >> fk.dispfi   doneecho -n "|" >> fk.dispecho "总  分:$zongfen" >>fk.dispx=65536;y=${map[1]}echo -n "|" >> fk.dispfor j in {1..16}dox=$((x>>1))if [ $((x&y)) -ne 0 ]thenecho -n "${fangkuai}" >> fk.dispelseecho -n "${beijing}" >> fk.dispfi doneecho -n "|" >> fk.dispecho "总  行:$zonghang" >>fk.dispx=65536;y=${map[2]}echo -n "|" >> fk.dispfor j in {1..16}dox=$((x>>1))if [ $((x&y)) -ne 0 ]thenecho -n "${fangkuai}" >> fk.dispelseecho -n "${beijing}" >> fk.dispfi doneecho -n "|" >> fk.dispecho "单次分:$dancifen" >>fk.dispx=65536;y=${map[3]}echo -n "|" >> fk.dispfor j in {1..16}dox=$((x>>1))if [ $((x&y)) -ne 0 ]thenecho -n "${fangkuai}" >> fk.dispelseecho -n "${beijing}" >> fk.dispfidoneecho -n "|" >> fk.dispecho "等  级:$dengji" >>fk.dispfor i in {4..7}doecho -n "|" >> fk.dispx=65536y=${map[$i]}for j in {1..16}dox=$((x>>1))if [ $((x&y)) -ne 0 ]thenecho -n "${fangkuai}" >> fk.dispelseecho -n "${beijing}" >> fk.dispfidoneecho -n "|" >> fk.dispx=8y=${yufk[i-4]} for j in {0..3}do if [ $((x&y)) -ne 0 ]thenecho -n $fangkuai >> fk.dispelseecho -n " " >> fk.dispfix=$((x>>1))doneecho "" >> fk.dispdonefor i in {8..19}doecho -n "|" >> fk.dispx=65536y=${map[$i]}for j in {1..16}dox=$((x>>1))if [ $((x&y)) -ne 0 ]thenecho -n "${fangkuai}" >> fk.dispelseecho -n "${beijing}" >> fk.dispfi doneecho "|" >> fk.dispdoneecho "~~~~~~~~~~~~~~~~~~" >> fk.dispecho $zhuangtai >>fk.disp
}#得到键盘输入并修改ctrl.txt文件以传参给fMain函数
function fGetKey(){local key i ctrlkey #tshang=12while truedoread -n 1 -s  key &>/dev/nullecho "::outkey" >>debugctrlkey=$(cat ctrl.txt)if [ "$ctrlkey" == "beijing" ]thenif [ "$key" == "" ]then sed -i "/beijing=/cbeijing=" peizhi.confsed -i  "12c|请输入一个字符作为背景:         |" start.txtsed -i  "13c|(回车为空格):空格               |" start.txtelsesed -i "/beijing=/cbeijing=${key}" peizhi.confsed -i  "12c|请输入一个字符作为背景:         |" start.txtsed -i  "13c|(回车为空格):$key                  |" start.txtfikey="":>ctrl.txtfiif [ "$ctrlkey" == "fangkuai" ]thenif [ "$key" == "" ]thensed -i "/fangkuai=/cfangkuai=" peizhi.confsed -i  "12c|请输入一个字符作为方块:         |" start.txtsed -i  "13c|(回车为空格):空格               |" start.txtelsesed -i "/fangkuai=/cfangkuai=${key}" peizhi.confsed -i  "12c|请输入一个字符作为方块:         |" start.txtsed -i  "13c|(回车为空格):$key                  |" start.txtfikey="":>ctrl.txtfiif [ "$key" == "a" -o "$key" == "A" ]thenecho "l" > ctrl.txt           #l=左移elif [ "$key" == "d" -o "$key" == "D" ]thenecho "r" > ctrl.txt           #r=右移  elif [ "$key" == "j" -o "$key" == "J" ]thenecho "c" > ctrl.txt           #c=变形elif [ "$key" == "k" -o "$key" == "K" ]thenecho "d" > ctrl.txt       #d=落到底部elif [ "$key" == "q" -o "$key" == "Q" ]thenecho "e" > ctrl.txt           #e=退出elif [ "$key" == "p" -o "$key" == "P" ]thenecho "p" > ctrl.txt           #p=暂停elif [ "$key" == "r" -o "$key" == "R" ]thenecho "s" > ctrl.txt       #r=重新开始elif [ "$key" == "y" -o "$key" == "Y" ]thenecho "y" > ctrl.txt            #y=yeselif [ "$key" == "n" -o "$key" == "N" ]thenecho "n" > ctrl.txt             #y=noelif [ "$key" == "c" -o "$key" == "C" ]thenecho "w" > ctrl.txt           #w=存档elif [ "$key" == "l" -o "$key" == "L" ]thenecho "a" > ctrl.txt           #a=取档elif [ "$key" == "s" -o "$key" == "S" ]thenecho "h" > ctrl.txt           #a=取档elif [ "$key" == "1" ]thenecho "1" > ctrl.txt       #1=开始游戏elif [ "$key" == "2" ]thenecho "2" > ctrl.txt       #2=读取存档elif [ "$key" == "3" ]thenecho "3" > ctrl.txt       #3=改变背景elif [ "$key" == "4" ]thenecho "4" > ctrl.txt       #4=改变方块elif [ "$key" == "5" ]thenecho "5" > ctrl.txt       #5=退出游戏elif [ "$key" == "6" ]thenecho "6" > ctrl.txt       #6=显示帮助elif [ "$key" == "7" ]thenecho "7" > ctrl.txt       #7=启用难度elif [ "$key" == "0" ]thenecho "0" > ctrl.txt       #0=退出帮助fidone
}#制作开始画面文件
function fStartfile(){echo "-----------------------------------" >start.txtecho "|         连消俄罗斯方块          |" >>start.txtecho "|            版本:1.1             |" >>start.txtecho "-----------------------------------" >>start.txtecho "|   1、开始游戏     7、启用难度   |" >>start.txtecho "|   2、读取存档                   |" >>start.txtecho "|   3、改变背景                   |" >>start.txtecho "|   4、改变方块                   |" >>start.txtecho "|   5、退出游戏                   |" >>start.txtecho "|   6、显示帮助                   |" >>start.txtecho "-----------------------------------" >>start.txtecho "|                                 |" >>start.txtecho "|                                 |" >>start.txtecho "-----------------------------------" >>start.txtecho "|     Copyright © 2017 洪 超      |" >>start.txtecho "|      All rights reserved        |" >>start.txtecho "-----------------------------------" >>start.txt
}#制作帮助文件
function fHelpfile(){echo -n "           " >start.txtecho "游戏帮助" >>start.txtecho "退出帮助请按0" >>start.txtecho "1.各个键的使用:" >>start.txtecho -e "左移:a 右移:d 变形:j 落地:k 加速:s 退出:q\n暂停:p 存档:c 取档:l 重新开始:r" >>start.txt echo -e "2.游戏计分方法:\n消除1行得到10分,连续消除相同行数将会有分\n数加成,具体计分方法如下:" >>start.txt echo -e "1)连续消除1行无加成;\n2)连续消除2行以上将在上次单次得分的基础上\n加消除行数的平方;" >>start.txt echo -e "3)连续消除相同行数后若有一次消除不同行数\n加成将消失;" >>start.txt echo -e "4)等级加成,等级1无加成,等级2单次得分加\n消除行数的平方乘1.1,等级3单次得分加消除\n行数的平方乘1.2.....以此类推" >>start.txt echo -e "3.每消除50行升一等级" >>start.txt echo -e "4.若开启难度,每消除12行底部出现一行方块" >>start.txt echo -e "5.以后将有更多新玩法,敬请期待" >>start.txt
}#显示开始画面
function fStart(){local ctrlkey:>ctrl.txtfStartfilewatch -n 0.2 "cat start.txt"& startid=$!while truedoctrlkey=`cat ctrl.txt`if [ "$ctrlkey" == "1" ]thenkill -9 $startidfConf:>ctrl.txtreturnfiif [ "$ctrlkey" == "2" ]thenif [ -a save.txt ]  #检查是否有存档文件thenkill -9 $startid &>/dev/nullfLoad:>ctrl.txtreturnelsesed -i "12c|          (当前无存档)           |" start.txt:>ctrl.txtfifiif [ "$ctrlkey" == "3" ] thenecho "beijing"> ctrl.txtsed -i  "12c|请输入一个字符作为背景:         |" start.txtsed -i  "13c|(回车为空格):                   |" start.txtfiif [ "$ctrlkey" == "4" ]thenecho "fangkuai"> ctrl.txtsed -i  "12c|请输入一个字符作为方块:         |" start.txtsed -i  "13c|(回车为空格):                   |" start.txtfiif [ "$ctrlkey" == "5" ]thenkill -9 $startid &>/dev/nullrm -fr ctrl.txt fk.disp start.txtclearfor i in $(ps -aux |grep -E "fk.disp"|grep -Ev "vim|grep"|awk '{print $2}')dokill -9 $idoneclearfor i in $(ps -aux |grep -E "elsfk|start.txt"|grep -Ev "vim|grep"|awk '{print $2}')dokill -9 $idoneclearexitfiif [ "$ctrlkey" == "6" ]thenfHelpfile:>ctrl.txtfiif [ "$ctrlkey" == "7" ]then#nandutimeflag=1  #是否打开时间难度nanduhangflag=1sed -i  "12c|已开启难度模式                   |" start.txt:>ctrl.txtfiif [ "$ctrlkey" == "0" ]then fStartfile:>ctrl.txtfisleep 0.2done
}#主程序
function fMain(){local i:>fk.disp:>ctrl.txtif ! [ -a peizhi.conf ]thenecho "beijing=" > peizhi.confecho "fangkuai=@" >>peizhi.conffi
# fConf((yutype=$RANDOM%7+1))((yustat=$RANDOM%4+1))fInitfStartwatch -n 0.1 "cat fk.disp"&while :doif [ $gameover -eq 1 ]thenecho "你的总分是:$zongfen" >> chengji.txtecho "你的总消除行数是:$zonghang" >> chengji.txtzhuangtai="游戏结束!若要重新开始请按r,退出请按q"fDisplaymap=(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)mapback=(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)zongfen=0zonghang=0dancifen=0dangqianhang=0qiancihang=0dengji=1nanduhang=0:>ctrl.txtwhile truedoctrlkey=$(cat ctrl.txt)if [ "$ctrlkey" == "s" ]thenfInitzhuangtai=$cyzfcgameover=0breakfiif [ "$ctrlkey" == "e" ]thenfExitfisleep 0.2donefictrlkey=$(cat ctrl.txt)case $ctrlkey inl)fLeft;;r)fRight;;c)fChange;;h)fDown;;d)fDownbottom;;e)fExit;;p)zhuangtai="暂停中...若要开始请按p"fDisplay:>ctrl.txtwhile truedoctrlkey=$(cat ctrl.txt)if [ "$ctrlkey" == "p" ]thenzhuangtai=$cyzfc:>ctrl.txtbreakfisleep 0.2done;;s)zhuangtai="要重新开始游戏吗?(y/n)"fDisplay:>ctrl.txtwhile truedoctrlkey=$(cat ctrl.txt)if [ "$ctrlkey" == "n" ]thenzhuangtai=$cyzfc:>ctrl.txtbreakelif [ "$ctrlkey" == "y" ]thenmap=(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)mapback=(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)zongfen=0zonghang=0dancifen=0dangqianhang=0qiancihang=0dengji=1zhuangtai=$cyzfc:>ctrl.txtbreakfisleep 0.2donefInit;;w)zhuangtai="是否要存档?(y/n)"fDisplay:>ctrl.txtwhile truedoctrlkey=$(cat ctrl.txt)if [ "$ctrlkey" == "n" ]thenzhuangtai=$cyzfcbreakelif [ "$ctrlkey" == "y" ]then:>save.txtfSave zhuangtai=$cyzfcbreakfisleep 0.2done;;  a)zhuangtai="是否要取档?(y/n)"fDisplay:>ctrl.txtwhile truedoctrlkey=$(cat ctrl.txt)if [ "$ctrlkey" == "n" ]thenzhuangtai=$cyzfcbreakelif [ "$ctrlkey" == "y" ]thenif [ -a save.txt ]thenfLoadzhuangtai=$cyzfcbreakelsezhuangtai=$cyzfcbreakfifisleep 0.2done;;esac:> ctrl.txtif [ $nandutimeflag -eq 1 -a $nandutime -ge $nanduzongtime ]thenfTimenandunandutime=0fiif [ $downtime -ge $zongtime ]thenfDowndowntime=0fifDisplaysleep $sleeptime((downtime++))((nandutime++))done
}fMain  2>debug&
#fMain& 2>/dev/null
fGetKey

测试

在centos命令行下运行得比较流畅,没有画面闪烁现象,但在centos GNOME界面下终端中运行会有画面闪烁现象

下载链接

代码下载

用shell脚本写的一个简单的俄罗斯方块相关推荐

  1. shell脚本写出一个简单的猜价格游戏

    [root@localhost ~]# vim game.sh #!/bin/bash a=$(expr ${RANDOM} % 1000) #$RANDOM是一个环境变量,每次都会随机输出一个介于0 ...

  2. 用shell脚本写一个猜数游戏

    用shell脚本写一个猜数游戏 最近用shell写的一个猜数游戏,包括4个不同难度,脚本如下: #作者:p_小王echo '欢迎来到猜数游戏!' while true doread -p '开始/退出 ...

  3. 最近写了一个简单的面向对象的脚本语言 Q 语言

    最近写了一个简单的面向对象的脚本语言 Q 语言,语法类似于 Javascript, 加入了一些 python 的语法功能. 同时实现了部分的 Javascript prototype 的功能 (个人觉 ...

  4. PHP服务器脚本实例,Shell脚本实现的一个简易Web服务器例子分享_linux shell

    这篇文章主要介绍了Shell脚本实现的一个简易Web服务器例子分享,本文实现的Web服务器非常简单实用,可以在你不想安装nginx.apache等大型WEB服务器时使用,需要的朋友可以参考下 假设你想 ...

  5. linux用shell脚本写游戏,shell脚本实现猜数游戏

    用shell脚本写一个猜数游戏 最近用shell写的一个猜数游戏,包括4个不同难度,脚本如下: #作者:p_小王 echo '欢迎来到猜数游戏!' while true do read -p '开始/ ...

  6. easy-mock写的一个简单的模拟二页的反馈

    用easy-mock写的一个简单的模拟二页的反馈,因为后端团队比较传统,所以设计的结构不太规范. 功能:每页10条,共2页,共12条记录,超出参数范围会返错误码: easy模板: {code: fun ...

  7. AndroidSDK开发6我用kotlin协程写了一个简单sdk

    目录 AndroidSDK开发6我用kotlin协程写了一个简单sdk 1.kotlin的依赖和导包如下:(//如果不使用协程可以去掉协程的导包减少sdk包大小) 2.Application代码如下: ...

  8. 自己写的一个简单的android记事本app

    自己写的一个简单的记事本app,效果如下: 一.首先是第一个界面的编写,最上面是一个TextView,中间是一个Linearlayout中嵌套一个listview布局,最下面是一个button.下面附 ...

  9. 用li写的一个简单的横向导航菜单demo

    用ul li写的一个简单的横向导航菜单,很实用: /* 所有class为menu的div中的ul样式 */ div.menu ul { list-style:none; /* 去掉ul前面的符号 */ ...

最新文章

  1. 一次性掌握机器学习基础知识脉络 | 公开课笔记
  2. 白话:服务降级与熔断的区别
  3. 鲲鹏性能优化十板斧(二)——CPU与内存子系统性能调优
  4. qt 子窗口写到线程就卡死_Qt多线程创建
  5. [导入]Asp.Net MVC实践 - 探索UrlRouting并分析UrlHelper (基于ASP.NET MVC Preview 3)
  6. 计算机网络简单理解总结
  7. docker初学记录--运行应用程序
  8. Java层Binder框架通信原理(转自Cloud Chou's Tech Blog)
  9. Priest John's Busiest Day (2-sat)
  10. 基于共享单车轨迹的自行车道规划(读书笔记)
  11. 码元速率 matlab,[转载]基于小波变换的移相键控信号符号速率估计(matlab仿真)...
  12. Android【WebView】
  13. python中用于释放类占用的资源的方法是()_mooc大学英语词汇期末答案
  14. c++中atan2函数_atan2()函数以及C ++中的示例
  15. H.264 高度压缩数字视频编解码器标准
  16. 查重时的疑惑:一个字一个字手写的论文怎么查重率就46%?
  17. 离心泵水力设计——叶轮设计——3 中间流线
  18. Navicat fro oracle 简体中文破解版(亲测可用)
  19. k8s集群下搭建数据同步工具-canal:canal-admin篇
  20. 虚幻4 python_技术前瞻:虚幻引擎中的 Python

热门文章

  1. Prolific USB-to-Serial Comm Port最新程序不支持win11怎么处理
  2. android加载ftp图片,按键安卓版网络访问之 图片处理,FTP,HTTP 实现
  3. 最清晰的进制转换讲解 - java实现
  4. 逻辑值分类True False
  5. 单片机I/O开漏输出详解 “与逻辑” ,改变上拉电源的电压,提供TTL/CMOS电平输出,标准的开漏脚一般只有输出的能力添加其它的判断电路,才能具备双向输入、输出的能力
  6. switch语句及三种循环语句
  7. html添加用户与删除吗,HTML页面元素的添加与删除
  8. 数据库新增修改和删除
  9. 看到一篇详细的关于Python之Numpy教程分享给和我一样在编程上的小白
  10. 不想进大厂的程序员是没有梦想的,2021年阿里、腾讯,java架构师指南百度云