设为首页 加入收藏

TOP

Shell脚本练习(七)
2023-07-23 13:39:42 】 浏览:148
Tags:Shell
ey=(0 0 0) cESC=`echo -ne "\033"` cSpace=`echo -ne "\040"` #保存终端属性。在read -s读取终端键时,终端的属性会被暂时改变。 #如果在read -s时程序被不幸杀掉,可能会导致终端混乱, #需要在程序退出时恢复终端属性。 sTTY=`stty -g` #捕捉退出信号 trap "MyExit;" INT QUIT trap "MyExitNoSub;" $sigExit #隐藏光标 echo -ne "\033[?25l" while : do #读取输入。注-s不回显,-n读到一个字符立即返回 read -s -n 1 key 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]} == "[" ]] then if [[ $key == "A" ]]; then sig=$sigRotate #<向上键> elif [[ $key == "B" ]]; then sig=$sigDown #<向下键> elif [[ $key == "D" ]]; then sig=$sigLeft #<向左键> elif [[ $key == "C" ]]; then sig=$sigRight #<向右键> fi elif [[ $key == "W" || $key == "w" ]]; then sig=$sigRotate #W, w elif [[ $key == "S" || $key == "s" ]]; then sig=$sigDown #S, s elif [[ $key == "A" || $key == "a" ]]; then sig=$sigLeft #A, a elif [[ $key == "D" || $key == "d" ]]; then sig=$sigRight #D, d elif [[ "[$key]" == "[]" ]]; then sig=$sigAllDown #空格键 elif [[ $key == "Q" || $key == "q" ]] #Q, q then MyExit fi if [[ $sig != 0 ]] then #向另一进程发送消息 kill -$sig $pidDisplayer fi done } #退出前的恢复 MyExitNoSub() { local y #恢复终端属性 stty $sTTY ((y = marginTop + mapHeight + 4)) #显示光标 echo -e "\033[?25h\033[${y};0H" exit } MyExit() { #通知显示进程需要退出 kill -$sigExit $pidDisplayer MyExitNoSub } #处理显示和游戏流程的主函数 RunAsDisplayer() { local sigThis 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 : do #根据当前的速度级iLevel不同,设定相应的循环的次数 for ((i = 0; i < 21 - iLevel; i++)) do sleep 0.02 sigThis=$sig sig=0 #根据sig变量判断是否接受到相应的信号 if ((sigThis == sigRotate)); then BoxRotate; #旋转 elif ((sigThis == sigLeft)); then BoxLeft; #左移一列 elif ((sigThis == sigRight)); then BoxRight; #右移一列 elif ((sigThis == sigDown)); then BoxDown; #下落一行 elif ((sigThis == sigAllDown)); then BoxAllDown; #下落到底 fi done #kill -$sigDown $$ BoxDown #下落一行 done } #绘制当前方块,传第一个参数,0表示擦除当前方块,1表示绘制当前方块 DrawCurBox() { local i x y bErase sBox bErase=$1 if (( bErase == 0 )) then sBox="\040\040" #用两个空格擦除 else sBox="[]" echo -ne "\033[1m\033[3${iBoxCurColor}m\033[4${iBoxCurColor}m" fi for ((i = 0; i < 8; i += 2)) do ((y = mapTop + 1 + ${boxCur[$i]} + boxCurY)) ((x = mapLeft + 1 + 2 * (boxCurX + ${boxCur[$i + 1]}))) echo -ne "\033[${y};${x}H${sBox}" done echo -ne "\033[0m" } #移动方块 #BoxMove(y, x), 测试是否可以把移动中的方块移到(y, x)的位置, 返回0则可以, 1不可以 BoxMove() { local i x y xPos yPos yPos=$1 xPos=$2 for ((i = 0; i < 8; i += 2)) do #方块相对于棋盘坐标 ((y = yPos + ${boxCur[$i]})) ((x = xPos + ${boxCur[$i + 1]})) if (( y < 0 || y >= mapHeight || x < 0 || x >= mapWidth)) then #撞到墙壁了 return 1 fi if (( ${map[y * mapWidth + x]} != -1 )) then #撞到其他已经存在的方块了 return 1 fi done return 0; } #将方块贴到棋盘上 Box2Map() { local i j x y line #将当前移动中的方块贴到棋盘对应的区域 for ((i = 0; i < 8; i += 2)) do #计算方块相对于
首页 上一页 4 5 6 7 8 9 下一页 尾页 7/9/9
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇MIT 6.828 Homework: Xv6 System .. 下一篇用bpftrace窃取Mysql账号密码

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目