现在的位置: 首页shell>正文
超级shell脚本写的俄罗斯方块游戏
2011年05月13日 shell 评论数 2 ⁄ 被围观 26,232 次+

超级shell脚本写的俄罗斯方块游戏,真的很佩服!

game

代码如下:

  1. #!/bin/bash   
  2.   
  3. # Tetris Game   
  4.   
  5. #APP declaration   
  6. APP_NAME="${0##*[\\/]}"  
  7. APP_VERSION="1.0"  
  8.   
  9.   
  10. #颜色定义   
  11. cRed=1  
  12. cGreen=2  
  13. cYellow=3  
  14. cBlue=4  
  15. cFuchsia=5  
  16. cCyan=6  
  17. cWhite=7  
  18. colorTable=($cRed $cGreen $cYellow $cBlue $cFuchsia $cCyan $cWhite)   
  19.   
  20. #位置和大小   
  21. iLeft=3  
  22. iTop=2  
  23. ((iTrayLeft = iLeft + 2))   
  24. ((iTrayTop = iTop + 1))   
  25. ((iTrayWidth = 10))   
  26. ((iTrayHeight = 15))   
  27.   
  28. #颜色设置   
  29. cBorder=$cGreen   
  30. cScore=$cFuchsia   
  31. cScoreValue=$cCyan   
  32.   
  33. #控制信号   
  34. #改游戏使用两个进程,一个用于接收输入,一个用于游戏流程和显示界面;   
  35. #当前者接收到上下左右等按键时,通过向后者发送signal的方式通知后者。   
  36. sigRotate=25  
  37. sigLeft=26  
  38. sigRight=27  
  39. sigDown=28  
  40. sigAllDown=29  
  41. sigExit=30  
  42.   
  43. #七中不同的方块的定义   
  44. #通过旋转,每种方块的显示的样式可能有几种   
  45. box0=(0 0 0 1 1 0 1 1)   
  46. box1=(0 2 1 2 2 2 3 2 1 0 1 1 1 2 1 3)   
  47. box2=(0 0 0 1 1 1 1 2 0 1 1 0 1 1 2 0)   
  48. box3=(0 1 0 2 1 0 1 1 0 0 1 0 1 1 2 1)   
  49. box4=(0 1 0 2 1 1 2 1 1 0 1 1 1 2 2 2 0 1 1 1 2 0 2 1 0 0 1 0 1 1 1 2)   
  50. box5=(0 1 1 1 2 1 2 2 1 0 1 1 1 2 2 0 0 0 0 1 1 1 2 1 0 2 1 0 1 1 1 2)   
  51. box6=(0 1 1 1 1 2 2 1 1 0 1 1 1 2 2 1 0 1 1 0 1 1 2 1 0 1 1 0 1 1 1 2)   
  52. #所有其中方块的定义都放到box变量中   
  53. box=(${box0[@]} ${box1[@]} ${box2[@]} ${box3[@]} ${box4[@]} ${box5[@]} ${box6[@]})   
  54. #各种方块旋转后可能的样式数目   
  55. countBox=(1 2 2 2 4 4 4)   
  56. #各种方块再box数组中的偏移   
  57. offsetBox=(0 1 3 5 7 11 15)   
  58.   
  59. #每提高一个速度级需要积累的分数   
  60. iScoreEachLevel=50        #be greater than 7  
  61.   
  62. #运行时数据   
  63. sig=0                #接收到的signal   
  64. iScore=0        #总分   
  65. iLevel=0        #速度级   
  66. boxNew=()        #新下落的方块的位置定义   
  67. cBoxNew=0        #新下落的方块的颜色   
  68. iBoxNewType=0        #新下落的方块的种类   
  69. iBoxNewRotate=0        #新下落的方块的旋转角度   
  70. boxCur=()        #当前方块的位置定义   
  71. cBoxCur=0        #当前方块的颜色   
  72. iBoxCurType=0        #当前方块的种类   
  73. iBoxCurRotate=0        #当前方块的旋转角度   
  74. boxCurX=-1        #当前方块的x坐标位置   
  75. boxCurY=-1        #当前方块的y坐标位置   
  76. iMap=()                #背景方块图表   
  77.   
  78. #初始化所有背景方块为-1, 表示没有方块   
  79. for ((i = 0; i < iTrayHeight * iTrayWidth; i++)); do iMap[$i]=-1; done   
  80.   
  81.   
  82. #接收输入的进程的主函数   
  83. function RunAsKeyReceiver()   
  84. {   
  85.         local pidDisplayer key aKey sig cESC sTTY   
  86.   
  87.         pidDisplayer=$1  
  88.         aKey=(0 0 0)   
  89.   
  90.         cESC=`echo -ne "\033"`   
  91.         cSpace=`echo -ne "\040"`   
  92.   
  93.         #保存终端属性。在read -s读取终端键时,终端的属性会被暂时改变。   
  94.         #如果在read -s时程序被不幸杀掉,可能会导致终端混乱,   
  95.         #需要在程序退出时恢复终端属性。   
  96.         sTTY=`stty -g`   
  97.   
  98.         #捕捉退出信号   
  99.         trap "MyExit;" INT TERM   
  100.         trap "MyExitNoSub;" $sigExit   
  101.   
  102.         #隐藏光标   
  103.         echo -ne "\033[?25l"  
  104.   
  105.   
  106.         while :   
  107.         do  
  108.                 #读取输入。注-s不回显,-n读到一个字符立即返回   
  109.                 read -s -n 1 key   
  110.   
  111.                 aKey[0]=${aKey[1]}   
  112.                 aKey[1]=${aKey[2]}   
  113.                 aKey[2]=$key   
  114.                 sig=0  
  115.   
  116.                 #判断输入了何种键   
  117.                 if [[ $key == $cESC && ${aKey[1]} == $cESC ]]   
  118.                 then   
  119.                         #ESC键   
  120.                         MyExit   
  121.                 elif [[ ${aKey[0]} == $cESC && ${aKey[1]} == "[" ]]   
  122.                 then   
  123.                         if [[ $key == "A" ]]; then sig=$sigRotate        #<向上键>   
  124.                         elif [[ $key == "B" ]]; then sig=$sigDown        #<向下键>   
  125.                         elif [[ $key == "D" ]]; then sig=$sigLeft        #<向左键>   
  126.                         elif [[ $key == "C" ]]; then sig=$sigRight        #<向右键>   
  127.                         fi   
  128.                 elif [[ $key == "W" || $key == "w" ]]; then sig=$sigRotate        #W, w   
  129.                 elif [[ $key == "S" || $key == "s" ]]; then sig=$sigDown        #S, s   
  130.                 elif [[ $key == "A" || $key == "a" ]]; then sig=$sigLeft        #A, a   
  131.                 elif [[ $key == "D" || $key == "d" ]]; then sig=$sigRight        #D, d   
  132.                 elif [[ "[$key]" == "[]" ]]; then sig=$sigAllDown        #空格键   
  133.                 elif [[ $key == "Q" || $key == "q" ]]                        #Q, q   
  134.                 then   
  135.                         MyExit   
  136.                 fi   
  137.   
  138.                 if [[ $sig != 0 ]]   
  139.                 then   
  140.                         #向另一进程发送消息   
  141.                         kill -$sig $pidDisplayer   
  142.                 fi   
  143.         done   
  144. }   
  145.   
  146. #退出前的恢复   
  147. function MyExitNoSub()   
  148. {   
  149.         local y   
  150.   
  151.         #恢复终端属性   
  152.         stty $sTTY   
  153.         ((y = iTop + iTrayHeight + 4))   
  154.   
  155.         #显示光标   
  156.         echo -e "\033[?25h\033[${y};0H"  
  157.         exit   
  158. }   
  159.   
  160.   
  161. function MyExit()   
  162. {   
  163.         #通知显示进程需要退出   
  164.         kill -$sigExit $pidDisplayer   
  165.   
  166.         MyExitNoSub   
  167. }   
  168.   
  169.   
  170. #处理显示和游戏流程的主函数   
  171. function RunAsDisplayer()   
  172. {   
  173.         local sigThis   
  174.         InitDraw   
  175.   
  176.         #挂载各种信号的处理函数   
  177.         trap "sig=$sigRotate;" $sigRotate   
  178.         trap "sig=$sigLeft;" $sigLeft   
  179.         trap "sig=$sigRight;" $sigRight   
  180.         trap "sig=$sigDown;" $sigDown   
  181.         trap "sig=$sigAllDown;" $sigAllDown   
  182.         trap "ShowExit;" $sigExit   
  183.   
  184.         while :   
  185.         do  
  186.                 #根据当前的速度级iLevel不同,设定相应的循环的次数   
  187.                 for ((i = 0; i < 21 - iLevel; i++))   
  188.                 do  
  189.                         sleep 0.02  
  190.                         sigThis=$sig   
  191.                         sig=0  
  192.   
  193.                         #根据sig变量判断是否接受到相应的信号   
  194.                         if ((sigThis == sigRotate)); then BoxRotate;        #旋转   
  195.                         elif ((sigThis == sigLeft)); then BoxLeft;        #左移一列   
  196.                         elif ((sigThis == sigRight)); then BoxRight;        #右移一列   
  197.                         elif ((sigThis == sigDown)); then BoxDown;        #下落一行   
  198.                         elif ((sigThis == sigAllDown)); then BoxAllDown;        #下落到底   
  199.                         fi   
  200.                 done   
  201.                 #kill -$sigDown $$   
  202.                 BoxDown        #下落一行   
  203.         done   
  204. }   
  205.   
  206.   
  207. #BoxMove(y, x), 测试是否可以把移动中的方块移到(x, y)的位置, 返回0则可以, 1不可以   
  208. function BoxMove()   
  209. {   
  210.         local j i x y xTest yTest   
  211.         yTest=$1  
  212.         xTest=$2  
  213.         for ((j = 0; j < 8; j += 2))   
  214.         do  
  215.                 ((i = j + 1))   
  216.                 ((y = ${boxCur[$j]} + yTest))   
  217.                 ((x = ${boxCur[$i]} + xTest))   
  218.                 if (( y < 0 || y >= iTrayHeight || x < 0 || x >= iTrayWidth))   
  219.                 then   
  220.                         #撞到墙壁了   
  221.                         return 1  
  222.                 fi   
  223.                 if ((${iMap[y * iTrayWidth + x]} != -1 ))   
  224.                 then   
  225.                         #撞到其他已经存在的方块了   
  226.                         return 1  
  227.                 fi   
  228.         done   
  229.         return 0;   
  230. }   
  231.   
  232.   
  233. #将当前移动中的方块放到背景方块中去,   
  234. #并计算新的分数和速度级。(即一次方块落到底部)   
  235. function Box2Map()   
  236. {   
  237.         local j i x y xp yp line   
  238.   
  239.         #将当前移动中的方块放到背景方块中去   
  240.         for ((j = 0; j < 8; j += 2))   
  241.         do  
  242.                 ((i = j + 1))   
  243.                 ((y = ${boxCur[$j]} + boxCurY))   
  244.                 ((x = ${boxCur[$i]} + boxCurX))   
  245.                 ((i = y * iTrayWidth + x))   
  246.                 iMap[$i]=$cBoxCur   
  247.         done   
  248.   
  249.         #消去可被消去的行   
  250.         line=0  
  251.         for ((j = 0; j < iTrayWidth * iTrayHeight; j += iTrayWidth))   
  252.         do  
  253.                 for ((i = j + iTrayWidth - 1; i >= j; i--))   
  254.                 do  
  255.                         if ((${iMap[$i]} == -1)); then break; fi   
  256.                 done   
  257.                 if ((i >= j)); then continue; fi   
  258.   
  259.                 ((line++))   
  260.                 for ((i = j - 1; i >= 0; i--))   
  261.                 do  
  262.                         ((x = i + iTrayWidth))   
  263.                         iMap[$x]=${iMap[$i]}   
  264.                 done   
  265.                 for ((i = 0; i < iTrayWidth; i++))   
  266.                 do  
  267.                         iMap[$i]=-1  
  268.                 done   
  269.         done   
  270.   
  271.         if ((line == 0)); then return; fi   
  272.   
  273.         #根据消去的行数line计算分数和速度级   
  274.         ((x = iLeft + iTrayWidth * 2 + 7))   
  275.         ((y = iTop + 11))   
  276.         ((iScore += line * 2 - 1))   
  277.         #显示新的分数   
  278.         echo -ne "\033[1m\033[3${cScoreValue}m\033[${y};${x}H${iScore}         "  
  279.         if ((iScore % iScoreEachLevel < line * 2 - 1))   
  280.         then   
  281.                 if ((iLevel < 20))   
  282.                 then   
  283.                         ((iLevel++))   
  284.                         ((y = iTop + 14))   
  285.                         #显示新的速度级   
  286.                         echo -ne "\033[3${cScoreValue}m\033[${y};${x}H${iLevel}        "  
  287.                 fi   
  288.         fi   
  289.         echo -ne "\033[0m"  
  290.   
  291.   
  292.         #重新显示背景方块   
  293.         for ((y = 0; y < iTrayHeight; y++))   
  294.         do  
  295.                 ((yp = y + iTrayTop + 1))   
  296.                 ((xp = iTrayLeft + 1))   
  297.                 ((i = y * iTrayWidth))   
  298.                 echo -ne "\033[${yp};${xp}H"  
  299.                 for ((x = 0; x < iTrayWidth; x++))   
  300.                 do  
  301.                         ((j = i + x))   
  302.                         if ((${iMap[$j]} == -1))   
  303.                         then   
  304.                                 echo -ne "  "  
  305.                         else  
  306.                                 echo -ne "\033[1m\033[7m\033[3${iMap[$j]}m\033[4${iMap[$j]}m[]\033[0m"  
  307.                         fi   
  308.                 done   
  309.         done   
  310. }   
  311.   
  312.   
  313. #下落一行   
  314. function BoxDown()   
  315. {   
  316.         local y s   
  317.         ((y = boxCurY + 1))        #新的y坐标   
  318.         if BoxMove $y $boxCurX        #测试是否可以下落一行   
  319.         then   
  320.                 s="`DrawCurBox 0`"        #将旧的方块抹去   
  321.                 ((boxCurY = y))   
  322.                 s="$s`DrawCurBox 1`"        #显示新的下落后方块   
  323.                 echo -ne $s   
  324.         else  
  325.                 #走到这儿, 如果不能下落了   
  326.                 Box2Map                #将当前移动中的方块贴到背景方块中   
  327.                 RandomBox        #产生新的方块   
  328.         fi   
  329. }   
  330.   
  331. #左移一列   
  332. function BoxLeft()   
  333. {   
  334.         local x s   
  335.         ((x = boxCurX - 1))   
  336.         if BoxMove $boxCurY $x   
  337.         then   
  338.                 s=`DrawCurBox 0`   
  339.                 ((boxCurX = x))   
  340.                 s=$s`DrawCurBox 1`   
  341.                 echo -ne $s   
  342.         fi   
  343. }   
  344.   
  345. #右移一列   
  346. function BoxRight()   
  347. {   
  348.         local x s   
  349.         ((x = boxCurX + 1))   
  350.         if BoxMove $boxCurY $x   
  351.         then   
  352.                 s=`DrawCurBox 0`   
  353.                 ((boxCurX = x))   
  354.                 s=$s`DrawCurBox 1`   
  355.                 echo -ne $s   
  356.         fi   
  357. }   
  358.   
  359.   
  360. #下落到底   
  361. function BoxAllDown()   
  362. {   
  363.         local k j i x y iDown s   
  364.         iDown=$iTrayHeight   
  365.   
  366.         #计算一共需要下落多少行   
  367.         for ((j = 0; j < 8; j += 2))   
  368.         do  
  369.                 ((i = j + 1))   
  370.                 ((y = ${boxCur[$j]} + boxCurY))   
  371.                 ((x = ${boxCur[$i]} + boxCurX))   
  372.                 for ((k = y + 1; k < iTrayHeight; k++))   
  373.                 do  
  374.                         ((i = k * iTrayWidth + x))   
  375.                         if (( ${iMap[$i]} != -1)); then break; fi   
  376.                 done   
  377.                 ((k -= y + 1))   
  378.                 if (( $iDown > $k )); then iDown=$k; fi   
  379.         done   
  380.   
  381.         s=`DrawCurBox 0`        #将旧的方块抹去   
  382.         ((boxCurY += iDown))   
  383.         s=$s`DrawCurBox 1`        #显示新的下落后的方块   
  384.         echo -ne $s   
  385.         Box2Map                #将当前移动中的方块贴到背景方块中   
  386.         RandomBox        #产生新的方块   
  387. }   
  388.   
  389.   
  390. #旋转方块   
  391. function BoxRotate()   
  392. {   
  393.         local iCount iTestRotate boxTest j i s   
  394.         iCount=${countBox[$iBoxCurType]}        #当前的方块经旋转可以产生的样式的数目   
  395.   
  396.         #计算旋转后的新的样式   
  397.         ((iTestRotate = iBoxCurRotate + 1))   
  398.         if ((iTestRotate >= iCount))   
  399.         then   
  400.                 ((iTestRotate = 0))   
  401.         fi   
  402.   
  403.         #更新到新的样式, 保存老的样式(但不显示)   
  404.         for ((j = 0, i = (${offsetBox[$iBoxCurType]} + $iTestRotate) * 8; j < 8; j++, i++))   
  405.         do  
  406.                 boxTest[$j]=${boxCur[$j]}   
  407.                 boxCur[$j]=${box[$i]}   
  408.         done   
  409.   
  410.         if BoxMove $boxCurY $boxCurX        #测试旋转后是否有空间放的下   
  411.         then   
  412.                 #抹去旧的方块   
  413.                 for ((j = 0; j < 8; j++))   
  414.                 do  
  415.                         boxCur[$j]=${boxTest[$j]}   
  416.                 done   
  417.                 s=`DrawCurBox 0`   
  418.   
  419.                 #画上新的方块   
  420.                 for ((j = 0, i = (${offsetBox[$iBoxCurType]} + $iTestRotate) * 8; j < 8; j++, i++))   
  421.                 do  
  422.                         boxCur[$j]=${box[$i]}   
  423.                 done   
  424.                 s=$s`DrawCurBox 1`   
  425.                 echo -ne $s   
  426.                 iBoxCurRotate=$iTestRotate   
  427.         else  
  428.                 #不能旋转,还是继续使用老的样式   
  429.                 for ((j = 0; j < 8; j++))   
  430.                 do  
  431.                         boxCur[$j]=${boxTest[$j]}   
  432.                 done   
  433.         fi   
  434. }   
  435.   
  436.   
  437. #DrawCurBox(bDraw), 绘制当前移动中的方块, bDraw为1, 画上, bDraw为0, 抹去方块。   
  438. function DrawCurBox()   
  439. {   
  440.         local i j t bDraw sBox s   
  441.         bDraw=$1  
  442.   
  443.         s=""  
  444.         if (( bDraw == 0 ))   
  445.         then   
  446.                 sBox="\040\040"  
  447.         else  
  448.                 sBox="[]"  
  449.                 s=$s"\033[1m\033[7m\033[3${cBoxCur}m\033[4${cBoxCur}m"  
  450.         fi   
  451.   
  452.         for ((j = 0; j < 8; j += 2))   
  453.         do  
  454.                 ((i = iTrayTop + 1 + ${boxCur[$j]} + boxCurY))   
  455.                 ((t = iTrayLeft + 1 + 2 * (boxCurX + ${boxCur[$j + 1]})))   
  456.                 #\033[y;xH, 光标到(x, y)处   
  457.                 s=$s"\033[${i};${t}H${sBox}"  
  458.         done   
  459.         s=$s"\033[0m"  
  460.         echo -n $s   
  461. }   
  462.   
  463.   
  464. #更新新的方块   
  465. function RandomBox()   
  466. {   
  467.         local i j t   
  468.   
  469.         #更新当前移动的方块   
  470.         iBoxCurType=${iBoxNewType}   
  471.         iBoxCurRotate=${iBoxNewRotate}   
  472.         cBoxCur=${cBoxNew}   
  473.         for ((j = 0; j < ${#boxNew[@]}; j++))   
  474.         do  
  475.                 boxCur[$j]=${boxNew[$j]}   
  476.         done   
  477.   
  478.   
  479.         #显示当前移动的方块   
  480.         if (( ${#boxCur[@]} == 8 ))   
  481.         then   
  482.                 #计算当前方块该从顶端哪一行"冒"出来   
  483.                 for ((j = 0, t = 4; j < 8; j += 2))   
  484.                 do  
  485.                         if ((${boxCur[$j]} < t)); then t=${boxCur[$j]}; fi   
  486.                 done   
  487.                 ((boxCurY = -t))   
  488.                 for ((j = 1, i = -4, t = 20; j < 8; j += 2))   
  489.                 do  
  490.                         if ((${boxCur[$j]} > i)); then i=${boxCur[$j]}; fi   
  491.                         if ((${boxCur[$j]} < t)); then t=${boxCur[$j]}; fi   
  492.                 done   
  493.                 ((boxCurX = (iTrayWidth - 1 - i - t) / 2))   
  494.   
  495.                 #显示当前移动的方块   
  496.                 echo -ne `DrawCurBox 1`   
  497.   
  498.                 #如果方块一出来就没处放,Game over!   
  499.                 if ! BoxMove $boxCurY $boxCurX   
  500.                 then   
  501.                         kill -$sigExit ${PPID}   
  502.                         ShowExit   
  503.                 fi   
  504.         fi   
  505.   
  506.   
  507.   
  508.         #清除右边预显示的方块   
  509.         for ((j = 0; j < 4; j++))   
  510.         do  
  511.                 ((i = iTop + 1 + j))   
  512.                 ((t = iLeft + 2 * iTrayWidth + 7))   
  513.                 echo -ne "\033[${i};${t}H        "  
  514.         done   
  515.   
  516.         #随机产生新的方块   
  517.         ((iBoxNewType = RANDOM % ${#offsetBox[@]}))   
  518.         ((iBoxNewRotate = RANDOM % ${countBox[$iBoxNewType]}))   
  519.         for ((j = 0, i = (${offsetBox[$iBoxNewType]} + $iBoxNewRotate) * 8; j < 8; j++, i++))   
  520.         do  
  521.                 boxNew[$j]=${box[$i]};   
  522.         done   
  523.   
  524.         ((cBoxNew = ${colorTable[RANDOM % ${#colorTable[@]}]}))   
  525.   
  526.         #显示右边预显示的方块   
  527.         echo -ne "\033[1m\033[7m\033[3${cBoxNew}m\033[4${cBoxNew}m"  
  528.         for ((j = 0; j < 8; j += 2))   
  529.         do  
  530.                 ((i = iTop + 1 + ${boxNew[$j]}))   
  531.                 ((t = iLeft + 2 * iTrayWidth + 7 + 2 * ${boxNew[$j + 1]}))   
  532.                 echo -ne "\033[${i};${t}H[]"  
  533.         done   
  534.         echo -ne "\033[0m"  
  535. }   
  536.   
  537.   
  538. #初始绘制   
  539. function InitDraw()   
  540. {   
  541.         clear   
  542.         RandomBox        #随机产生方块,这时右边预显示窗口中有方快了   
  543.         RandomBox        #再随机产生方块,右边预显示窗口中的方块被更新,原先的方块将开始下落   
  544.         local i t1 t2 t3   
  545.   
  546.         #显示边框   
  547.         echo -ne "\033[1m"  
  548.         echo -ne "\033[3${cBorder}m\033[4${cBorder}m"  
  549.   
  550.         ((t2 = iLeft + 1))   
  551.         ((t3 = iLeft + iTrayWidth * 2 + 3))   
  552.         for ((i = 0; i < iTrayHeight; i++))   
  553.         do  
  554.                 ((t1 = i + iTop + 2))   
  555.                 echo -ne "\033[${t1};${t2}H||"  
  556.                 echo -ne "\033[${t1};${t3}H||"  
  557.         done   
  558.   
  559.         ((t2 = iTop + iTrayHeight + 2))   
  560.         for ((i = 0; i < iTrayWidth + 2; i++))   
  561.         do  
  562.                 ((t1 = i * 2 + iLeft + 1))   
  563.                 echo -ne "\033[${iTrayTop};${t1}H=="  
  564.                 echo -ne "\033[${t2};${t1}H=="  
  565.         done   
  566.         echo -ne "\033[0m"  
  567.   
  568.   
  569.         #显示"Score""Level"字样   
  570.         echo -ne "\033[1m"  
  571.         ((t1 = iLeft + iTrayWidth * 2 + 7))   
  572.         ((t2 = iTop + 10))   
  573.         echo -ne "\033[3${cScore}m\033[${t2};${t1}HScore"  
  574.         ((t2 = iTop + 11))   
  575.         echo -ne "\033[3${cScoreValue}m\033[${t2};${t1}H${iScore}"  
  576.         ((t2 = iTop + 13))   
  577.         echo -ne "\033[3${cScore}m\033[${t2};${t1}HLevel"  
  578.         ((t2 = iTop + 14))   
  579.         echo -ne "\033[3${cScoreValue}m\033[${t2};${t1}H${iLevel}"  
  580.         echo -ne "\033[0m"  
  581. }   
  582.   
  583.   
  584. #退出时显示GameOVer!   
  585. function ShowExit()   
  586. {   
  587.         local y   
  588.         ((y = iTrayHeight + iTrayTop + 3))   
  589.         echo -e "\033[${y};0HGameOver!\033[0m"  
  590.         exit   
  591. }   
  592.   
  593.   
  594. #显示用法.   
  595. function Usage   
  596. {   
  597.         cat << EOF   
  598. Usage: $APP_NAME   
  599. Start tetris game.   
  600.   
  601.   -h, --help              display this help and exit   
  602.       --version           output version information and exit   
  603. EOF   
  604. }   
  605.   
  606.   
  607. #游戏主程序在这儿开始.   
  608. if [[ "$1" == "-h" || "$1" == "--help" ]]; then   
  609.         Usage   
  610. elif [[ "$1" == "--version" ]]; then   
  611.         echo "$APP_NAME $APP_VERSION"  
  612. elif [[ "$1" == "--show" ]]; then   
  613.         #当发现具有参数--show时,运行显示函数   
  614.         RunAsDisplayer   
  615. else  
  616.         bash $0 --show&        #以参数--show将本程序再运行一遍   
  617.         RunAsKeyReceiver $!        #以上一行产生的进程的进程号作为参数   
  618. fi  
本文地址:http://www.92csz.com/57/653.html
如非注明则为本站原创文章,欢迎转载。转载请注明转载自:moon's blog
 

目前有 2 条留言 其中:访客:1 条, 博主:1 条

  1. Bob : 2011年08月09日18:00:24  -49楼

    好东西,收了,代码没缩进啊……

    • clairelume : 2011年08月09日18:08:56

      本来是缩进的,一生成高亮后,不知道怎么就没有缩进了