• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            俄羅斯方塊代碼

            Posted on 2010-02-04 15:38 Prayer 閱讀(331) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Shell
            1. #!/bin/bash

            2. # Tetris Game
            3. # 10.21.2003 xhchen<[email]xhchen@winbond.com.tw[/email]>

            4. #APP declaration
            5. APP_NAME="${0##*[\\/]}"
            6. APP_VERSION="1.0"


            7. #顏色定義
            8. cRed=1
            9. cGreen=2
            10. cYellow=3
            11. cBlue=4
            12. cFuchsia=5
            13. cCyan=6
            14. cWhite=7
            15. colorTable=($cRed $cGreen $cYellow $cBlue $cFuchsia $cCyan $cWhite)

            16. #位置和大小
            17. iLeft=3
            18. iTop=2
            19. ((iTrayLeft = iLeft + 2))
            20. ((iTrayTop = iTop + 1))
            21. ((iTrayWidth = 10))
            22. ((iTrayHeight = 15))

            23. #顏色設(shè)置
            24. cBorder=$cGreen
            25. cScore=$cFuchsia
            26. cScoreValue=$cCyan

            27. #控制信號(hào)
            28. #改游戲使用兩個(gè)進(jìn)程,一個(gè)用于接收輸入,一個(gè)用于游戲流程和顯示界面;
            29. #當(dāng)前者接收到上下左右等按鍵時(shí),通過向后者發(fā)送signal的方式通知后者。
            30. sigRotate=25
            31. sigLeft=26
            32. sigRight=27
            33. sigDown=28
            34. sigAllDown=29
            35. sigExit=30

            36. #七中不同的方塊的定義
            37. #通過旋轉(zhuǎn),每種方塊的顯示的樣式可能有幾種
            38. box0=(0 0 0 1 1 0 1 1)
            39. box1=(0 2 1 2 2 2 3 2 1 0 1 1 1 2 1 3)
            40. box2=(0 0 0 1 1 1 1 2 0 1 1 0 1 1 2 0)
            41. box3=(0 1 0 2 1 0 1 1 0 0 1 0 1 1 2 1)
            42. 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)
            43. 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)
            44. 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)
            45. #所有其中方塊的定義都放到box變量中
            46. box=(${box0[@]} ${box1[@]} ${box2[@]} ${box3[@]} ${box4[@]} ${box5[@]} ${box6[@]})
            47. #各種方塊旋轉(zhuǎn)后可能的樣式數(shù)目
            48. countBox=(1 2 2 2 4 4 4)
            49. #各種方塊再box數(shù)組中的偏移
            50. offsetBox=(0 1 3 5 7 11 15)

            51. #每提高一個(gè)速度級(jí)需要積累的分?jǐn)?shù)
            52. iScoreEachLevel=50        #be greater than 7

            53. #運(yùn)行時(shí)數(shù)據(jù)
            54. sig=0                #接收到的signal
            55. iScore=0        #總分
            56. iLevel=0        #速度級(jí)
            57. boxNew=()        #新下落的方塊的位置定義
            58. cBoxNew=0        #新下落的方塊的顏色
            59. iBoxNewType=0        #新下落的方塊的種類
            60. iBoxNewRotate=0        #新下落的方塊的旋轉(zhuǎn)角度
            61. boxCur=()        #當(dāng)前方塊的位置定義
            62. cBoxCur=0        #當(dāng)前方塊的顏色
            63. iBoxCurType=0        #當(dāng)前方塊的種類
            64. iBoxCurRotate=0        #當(dāng)前方塊的旋轉(zhuǎn)角度
            65. boxCurX=-1        #當(dāng)前方塊的x坐標(biāo)位置
            66. boxCurY=-1        #當(dāng)前方塊的y坐標(biāo)位置
            67. iMap=()                #背景方塊圖表

            68. #初始化所有背景方塊為-1, 表示沒有方塊
            69. for ((i = 0; i < iTrayHeight * iTrayWidth; i++)); do iMap[$i]=-1; done


            70. #接收輸入的進(jìn)程的主函數(shù)
            71. function RunAsKeyReceiver()
            72. {
            73.         local pidDisplayer key aKey sig cESC sTTY

            74.         pidDisplayer=$1
            75.         aKey=(0 0 0)

            76.         cESC=`echo -ne "\033"`
            77.         cSpace=`echo -ne "\040"`

            78.         #保存終端屬性。在read -s讀取終端鍵時(shí),終端的屬性會(huì)被暫時(shí)改變。
            79.         #如果在read -s時(shí)程序被不幸殺掉,可能會(huì)導(dǎo)致終端混亂,
            80.         #需要在程序退出時(shí)恢復(fù)終端屬性。
            81.         sTTY=`stty -g`

            82.         #捕捉退出信號(hào)
            83.         trap "MyExit;" INT TERM
            84.         trap "MyExitNoSub;" $sigExit

            85.         #隱藏光標(biāo)
            86.         echo -ne "\033[?25l"


            87.         while :
            88.         do
            89.                 #讀取輸入。注-s不回顯,-n讀到一個(gè)字符立即返回
            90.                 read -s -n 1 key

            91.                 aKey[0]=${aKey[1]}
            92.                 aKey[1]=${aKey[2]}
            93.                 aKey[2]=$key
            94.                 sig=0

            95.                 #判斷輸入了何種鍵
            96.                 if [[ $key == $cESC && ${aKey[1]} == $cESC ]]
            97.                 then
            98.                         #ESC鍵
            99.                         MyExit
            100.                 elif [[ ${aKey[0]} == $cESC && ${aKey[1]} == "[" ]]
            101.                 then
            102.                         if [[ $key == "A" ]]; then sig=$sigRotate        #<向上鍵>
            103.                         elif [[ $key == "B" ]]; then sig=$sigDown        #<向下鍵>
            104.                         elif [[ $key == "D" ]]; then sig=$sigLeft        #<向左鍵>
            105.                         elif [[ $key == "C" ]]; then sig=$sigRight        #<向右鍵>
            106.                         fi
            107.                 elif [[ $key == "W" || $key == "w" ]]; then sig=$sigRotate        #W, w
            108.                 elif [[ $key == "S" || $key == "s" ]]; then sig=$sigDown        #S, s
            109.                 elif [[ $key == "A" || $key == "a" ]]; then sig=$sigLeft        #A, a
            110.                 elif [[ $key == "D" || $key == "d" ]]; then sig=$sigRight        #D, d
            111.                 elif [[ "[$key]" == "[]" ]]; then sig=$sigAllDown        #空格鍵
            112.                 elif [[ $key == "Q" || $key == "q" ]]                        #Q, q
            113.                 then
            114.                         MyExit
            115.                 fi

            116.                 if [[ $sig != 0 ]]
            117.                 then
            118.                         #向另一進(jìn)程發(fā)送消息
            119.                         kill -$sig $pidDisplayer
            120.                 fi
            121.         done
            122. }

            123. #退出前的恢復(fù)
            124. function MyExitNoSub()
            125. {
            126.         local y

            127.         #恢復(fù)終端屬性
            128.         stty $sTTY
            129.         ((y = iTop + iTrayHeight + 4))

            130.         #顯示光標(biāo)
            131.         echo -e "\033[?25h\033[${y};0H"
            132.         exit
            133. }


            134. function MyExit()
            135. {
            136.         #通知顯示進(jìn)程需要退出
            137.         kill -$sigExit $pidDisplayer

            138.         MyExitNoSub
            139. }


            140. #處理顯示和游戲流程的主函數(shù)
            141. function RunAsDisplayer()
            142. {
            143.         local sigThis
            144.         InitDraw

            145.         #掛載各種信號(hào)的處理函數(shù)
            146.         trap "sig=$sigRotate;" $sigRotate
            147.         trap "sig=$sigLeft;" $sigLeft
            148.         trap "sig=$sigRight;" $sigRight
            149.         trap "sig=$sigDown;" $sigDown
            150.         trap "sig=$sigAllDown;" $sigAllDown
            151.         trap "ShowExit;" $sigExit

            152.         while :
            153.         do
            154.                 #根據(jù)當(dāng)前的速度級(jí)iLevel不同,設(shè)定相應(yīng)的循環(huán)的次數(shù)
            155.                 for ((i = 0; i < 21 - iLevel; i++))
            156.                 do
            157.                         sleep 0.02
            158.                         sigThis=$sig
            159.                         sig=0

            160.                         #根據(jù)sig變量判斷是否接受到相應(yīng)的信號(hào)
            161.                         if ((sigThis == sigRotate)); then BoxRotate;        #旋轉(zhuǎn)
            162.                         elif ((sigThis == sigLeft)); then BoxLeft;        #左移一列
            163.                         elif ((sigThis == sigRight)); then BoxRight;        #右移一列
            164.                         elif ((sigThis == sigDown)); then BoxDown;        #下落一行
            165.                         elif ((sigThis == sigAllDown)); then BoxAllDown;        #下落到底
            166.                         fi
            167.                 done
            168.                 #kill -$sigDown $$
            169.                 BoxDown        #下落一行
            170.         done
            171. }


            172. #BoxMove(y, x), 測(cè)試是否可以把移動(dòng)中的方塊移到(x, y)的位置, 返回0則可以, 1不可以
            173. function BoxMove()
            174. {
            175.         local j i x y xTest yTest
            176.         yTest=$1
            177.         xTest=$2
            178.         for ((j = 0; j < 8; j += 2))
            179.         do
            180.                 ((i = j + 1))
            181.                 ((y = ${boxCur[$j]} + yTest))
            182.                 ((x = ${boxCur[$i]} + xTest))
            183.                 if (( y < 0 || y >= iTrayHeight || x < 0 || x >= iTrayWidth))
            184.                 then
            185.                         #撞到墻壁了
            186.                         return 1
            187.                 fi
            188.                 if ((${iMap[y * iTrayWidth + x]} != -1 ))
            189.                 then
            190.                         #撞到其他已經(jīng)存在的方塊了
            191.                         return 1
            192.                 fi
            193.         done
            194.         return 0;
            195. }


            196. #將當(dāng)前移動(dòng)中的方塊放到背景方塊中去,
            197. #并計(jì)算新的分?jǐn)?shù)和速度級(jí)。(即一次方塊落到底部)
            198. function Box2Map()
            199. {
            200.         local j i x y xp yp line

            201.         #將當(dāng)前移動(dòng)中的方塊放到背景方塊中去
            202.         for ((j = 0; j < 8; j += 2))
            203.         do
            204.                 ((i = j + 1))
            205.                 ((y = ${boxCur[$j]} + boxCurY))
            206.                 ((x = ${boxCur[$i]} + boxCurX))
            207.                 ((i = y * iTrayWidth + x))
            208.                 iMap[$i]=$cBoxCur
            209.         done

            210.         #消去可被消去的行
            211.         line=0
            212.         for ((j = 0; j < iTrayWidth * iTrayHeight; j += iTrayWidth))
            213.         do
            214.                 for ((i = j + iTrayWidth - 1; i >= j; i--))
            215.                 do
            216.                         if ((${iMap[$i]} == -1)); then break; fi
            217.                 done
            218.                 if ((i >= j)); then continue; fi

            219.                 ((line++))
            220.                 for ((i = j - 1; i >= 0; i--))
            221.                 do
            222.                         ((x = i + iTrayWidth))
            223.                         iMap[$x]=${iMap[$i]}
            224.                 done
            225.                 for ((i = 0; i < iTrayWidth; i++))
            226.                 do
            227.                         iMap[$i]=-1
            228.                 done
            229.         done

            230.         if ((line == 0)); then return; fi

            231.         #根據(jù)消去的行數(shù)line計(jì)算分?jǐn)?shù)和速度級(jí)
            232.         ((x = iLeft + iTrayWidth * 2 + 7))
            233.         ((y = iTop + 11))
            234.         ((iScore += line * 2 - 1))
            235.         #顯示新的分?jǐn)?shù)
            236.         echo -ne "\033[1m\033[3${cScoreValue}m\033[${y};${x}H${iScore}         "
            237.         if ((iScore % iScoreEachLevel < line * 2 - 1))
            238.         then
            239.                 if ((iLevel < 20))
            240.                 then
            241.                         ((iLevel++))
            242.                         ((y = iTop + 14))
            243.                         #顯示新的速度級(jí)
            244.                         echo -ne "\033[3${cScoreValue}m\033[${y};${x}H${iLevel}        "
            245.                 fi
            246.         fi
            247.         echo -ne "\033[0m"


            248.         #重新顯示背景方塊
            249.         for ((y = 0; y < iTrayHeight; y++))
            250.         do
            251.                 ((yp = y + iTrayTop + 1))
            252.                 ((xp = iTrayLeft + 1))
            253.                 ((i = y * iTrayWidth))
            254.                 echo -ne "\033[${yp};${xp}H"
            255.                 for ((x = 0; x < iTrayWidth; x++))
            256.                 do
            257.                         ((j = i + x))
            258.                         if ((${iMap[$j]} == -1))
            259.                         then
            260.                                 echo -ne "  "
            261.                         else
            262.                                 echo -ne "\033[1m\033[7m\033[3${iMap[$j]}m\033[4${iMap[$j]}m[]\033[0m"
            263.                         fi
            264.                 done
            265.         done
            266. }


            267. #下落一行
            268. function BoxDown()
            269. {
            270.         local y s
            271.         ((y = boxCurY + 1))        #新的y坐標(biāo)
            272.         if BoxMove $y $boxCurX        #測(cè)試是否可以下落一行
            273.         then
            274.                 s="`DrawCurBox 0`"        #將舊的方塊抹去
            275.                 ((boxCurY = y))
            276.                 s="$s`DrawCurBox 1`"        #顯示新的下落后方塊
            277.                 echo -ne $s
            278.         else
            279.                 #走到這兒, 如果不能下落了
            280.                 Box2Map                #將當(dāng)前移動(dòng)中的方塊貼到背景方塊中
            281.                 RandomBox        #產(chǎn)生新的方塊
            282.         fi
            283. }

            284. #左移一列
            285. function BoxLeft()
            286. {
            287.         local x s
            288.         ((x = boxCurX - 1))
            289.         if BoxMove $boxCurY $x
            290.         then
            291.                 s=`DrawCurBox 0`
            292.                 ((boxCurX = x))
            293.                 s=$s`DrawCurBox 1`
            294.                 echo -ne $s
            295.         fi
            296. }

            297. #右移一列
            298. function BoxRight()
            299. {
            300.         local x s
            301.         ((x = boxCurX + 1))
            302.         if BoxMove $boxCurY $x
            303.         then
            304.                 s=`DrawCurBox 0`
            305.                 ((boxCurX = x))
            306.                 s=$s`DrawCurBox 1`
            307.                 echo -ne $s
            308.         fi
            309. }


            310. #下落到底
            311. function BoxAllDown()
            312. {
            313.         local k j i x y iDown s
            314.         iDown=$iTrayHeight

            315.         #計(jì)算一共需要下落多少行
            316.         for ((j = 0; j < 8; j += 2))
            317.         do
            318.                 ((i = j + 1))
            319.                 ((y = ${boxCur[$j]} + boxCurY))
            320.                 ((x = ${boxCur[$i]} + boxCurX))
            321.                 for ((k = y + 1; k < iTrayHeight; k++))
            322.                 do
            323.                         ((i = k * iTrayWidth + x))
            324.                         if (( ${iMap[$i]} != -1)); then break; fi
            325.                 done
            326.                 ((k -= y + 1))
            327.                 if (( $iDown > $k )); then iDown=$k; fi
            328.         done

            329.         s=`DrawCurBox 0`        #將舊的方塊抹去
            330.         ((boxCurY += iDown))
            331.         s=$s`DrawCurBox 1`        #顯示新的下落后的方塊
            332.         echo -ne $s
            333.         Box2Map                #將當(dāng)前移動(dòng)中的方塊貼到背景方塊中
            334.         RandomBox        #產(chǎn)生新的方塊
            335. }


            336. #旋轉(zhuǎn)方塊
            337. function BoxRotate()
            338. {
            339.         local iCount iTestRotate boxTest j i s
            340.         iCount=${countBox[$iBoxCurType]}        #當(dāng)前的方塊經(jīng)旋轉(zhuǎn)可以產(chǎn)生的樣式的數(shù)目

            341.         #計(jì)算旋轉(zhuǎn)后的新的樣式
            342.         ((iTestRotate = iBoxCurRotate + 1))
            343.         if ((iTestRotate >= iCount))
            344.         then
            345.                 ((iTestRotate = 0))
            346.         fi

            347.         #更新到新的樣式, 保存老的樣式(但不顯示)
            348.         for ((j = 0, i = (${offsetBox[$iBoxCurType]} + $iTestRotate) * 8; j < 8; j++, i++))
            349.         do
            350.                 boxTest[$j]=${boxCur[$j]}
            351.                 boxCur[$j]=${box[$i]}
            352.         done

            353.         if BoxMove $boxCurY $boxCurX        #測(cè)試旋轉(zhuǎn)后是否有空間放的下
            354.         then
            355.                 #抹去舊的方塊
            356.                 for ((j = 0; j < 8; j++))
            357.                 do
            358.                         boxCur[$j]=${boxTest[$j]}
            359.                 done
            360.                 s=`DrawCurBox 0`

            361.                 #畫上新的方塊
            362.                 for ((j = 0, i = (${offsetBox[$iBoxCurType]} + $iTestRotate) * 8; j < 8; j++, i++))
            363.                 do
            364.                         boxCur[$j]=${box[$i]}
            365.                 done
            366.                 s=$s`DrawCurBox 1`
            367.                 echo -ne $s
            368.                 iBoxCurRotate=$iTestRotate
            369.         else
            370.                 #不能旋轉(zhuǎn),還是繼續(xù)使用老的樣式
            371.                 for ((j = 0; j < 8; j++))
            372.                 do
            373.                         boxCur[$j]=${boxTest[$j]}
            374.                 done
            375.         fi
            376. }


            377. #DrawCurBox(bDraw), 繪制當(dāng)前移動(dòng)中的方塊, bDraw為1, 畫上, bDraw為0, 抹去方塊。
            378. function DrawCurBox()
            379. {
            380.         local i j t bDraw sBox s
            381.         bDraw=$1

            382.         s=""
            383.         if (( bDraw == 0 ))
            384.         then
            385.                 sBox="\040\040"
            386.         else
            387.                 sBox="[]"
            388.                 s=$s"\033[1m\033[7m\033[3${cBoxCur}m\033[4${cBoxCur}m"
            389.         fi

            390.         for ((j = 0; j < 8; j += 2))
            391.         do
            392.                 ((i = iTrayTop + 1 + ${boxCur[$j]} + boxCurY))
            393.                 ((t = iTrayLeft + 1 + 2 * (boxCurX + ${boxCur[$j + 1]})))
            394.                 #\033[y;xH, 光標(biāo)到(x, y)處
            395.                 s=$s"\033[${i};${t}H${sBox}"
            396.         done
            397.         s=$s"\033[0m"
            398.         echo -n $s
            399. }


            400. #更新新的方塊
            401. function RandomBox()
            402. {
            403.         local i j t

            404.         #更新當(dāng)前移動(dòng)的方塊
            405.         iBoxCurType=${iBoxNewType}
            406.         iBoxCurRotate=${iBoxNewRotate}
            407.         cBoxCur=${cBoxNew}
            408.         for ((j = 0; j < ${#boxNew[@]}; j++))
            409.         do
            410.                 boxCur[$j]=${boxNew[$j]}
            411.         done


            412.         #顯示當(dāng)前移動(dòng)的方塊
            413.         if (( ${#boxCur[@]} == 8 ))
            414.         then
            415.                 #計(jì)算當(dāng)前方塊該從頂端哪一行"冒"出來
            416.                 for ((j = 0, t = 4; j < 8; j += 2))
            417.                 do
            418.                         if ((${boxCur[$j]} < t)); then t=${boxCur[$j]}; fi
            419.                 done
            420.                 ((boxCurY = -t))
            421.                 for ((j = 1, i = -4, t = 20; j < 8; j += 2))
            422.                 do
            423.                         if ((${boxCur[$j]} > i)); then i=${boxCur[$j]}; fi
            424.                         if ((${boxCur[$j]} < t)); then t=${boxCur[$j]}; fi
            425.                 done
            426.                 ((boxCurX = (iTrayWidth - 1 - i - t) / 2))

            427.                 #顯示當(dāng)前移動(dòng)的方塊
            428.                 echo -ne `DrawCurBox 1`

            429.                 #如果方塊一出來就沒處放,Game over!
            430.                 if ! BoxMove $boxCurY $boxCurX
            431.                 then
            432.                         kill -$sigExit ${PPID}
            433.                         ShowExit
            434.                 fi
            435.         fi



            436.         #清除右邊預(yù)顯示的方塊
            437.         for ((j = 0; j < 4; j++))
            438.         do
            439.                 ((i = iTop + 1 + j))
            440.                 ((t = iLeft + 2 * iTrayWidth + 7))
            441.                 echo -ne "\033[${i};${t}H        "
            442.         done

            443.         #隨機(jī)產(chǎn)生新的方塊
            444.         ((iBoxNewType = RANDOM % ${#offsetBox[@]}))
            445.         ((iBoxNewRotate = RANDOM % ${countBox[$iBoxNewType]}))
            446.         for ((j = 0, i = (${offsetBox[$iBoxNewType]} + $iBoxNewRotate) * 8; j < 8; j++, i++))
            447.         do
            448.                 boxNew[$j]=${box[$i]};
            449.         done

            450.         ((cBoxNew = ${colorTable[RANDOM % ${#colorTable[@]}]}))

            451.         #顯示右邊預(yù)顯示的方塊
            452.         echo -ne "\033[1m\033[7m\033[3${cBoxNew}m\033[4${cBoxNew}m"
            453.         for ((j = 0; j < 8; j += 2))
            454.         do
            455.                 ((i = iTop + 1 + ${boxNew[$j]}))
            456.                 ((t = iLeft + 2 * iTrayWidth + 7 + 2 * ${boxNew[$j + 1]}))
            457.                 echo -ne "\033[${i};${t}H[]"
            458.         done
            459.         echo -ne "\033[0m"
            460. }


            461. #初始繪制
            462. function InitDraw()
            463. {
            464.         clear
            465.         RandomBox        #隨機(jī)產(chǎn)生方塊,這時(shí)右邊預(yù)顯示窗口中有方快了
            466.         RandomBox        #再隨機(jī)產(chǎn)生方塊,右邊預(yù)顯示窗口中的方塊被更新,原先的方塊將開始下落
            467.         local i t1 t2 t3

            468.         #顯示邊框
            469.         echo -ne "\033[1m"
            470.         echo -ne "\033[3${cBorder}m\033[4${cBorder}m"

            471.         ((t2 = iLeft + 1))
            472.         ((t3 = iLeft + iTrayWidth * 2 + 3))
            473.         for ((i = 0; i < iTrayHeight; i++))
            474.         do
            475.                 ((t1 = i + iTop + 2))
            476.                 echo -ne "\033[${t1};${t2}H||"
            477.                 echo -ne "\033[${t1};${t3}H||"
            478.         done

            479.         ((t2 = iTop + iTrayHeight + 2))
            480.         for ((i = 0; i < iTrayWidth + 2; i++))
            481.         do
            482.                 ((t1 = i * 2 + iLeft + 1))
            483.                 echo -ne "\033[${iTrayTop};${t1}H=="
            484.                 echo -ne "\033[${t2};${t1}H=="
            485.         done
            486.         echo -ne "\033[0m"


            487.         #顯示"Score"和"Level"字樣
            488.         echo -ne "\033[1m"
            489.         ((t1 = iLeft + iTrayWidth * 2 + 7))
            490.         ((t2 = iTop + 10))
            491.         echo -ne "\033[3${cScore}m\033[${t2};${t1}HScore"
            492.         ((t2 = iTop + 11))
            493.         echo -ne "\033[3${cScoreValue}m\033[${t2};${t1}H${iScore}"
            494.         ((t2 = iTop + 13))
            495.         echo -ne "\033[3${cScore}m\033[${t2};${t1}HLevel"
            496.         ((t2 = iTop + 14))
            497.         echo -ne "\033[3${cScoreValue}m\033[${t2};${t1}H${iLevel}"
            498.         echo -ne "\033[0m"
            499. }


            500. #退出時(shí)顯示GameOVer!
            501. function ShowExit()
            502. {
            503.         local y
            504.         ((y = iTrayHeight + iTrayTop + 3))
            505.         echo -e "\033[${y};0HGameOver!\033[0m"
            506.         exit
            507. }


            508. #顯示用法.
            509. function Usage
            510. {
            511.         cat << EOF
            512. Usage: $APP_NAME
            513. Start tetris game.

            514.   -h, --help              display this help and exit
            515.       --version           output version information and exit
            516. EOF
            517. }


            518. #游戲主程序在這兒開始.
            519. if [[ "$1" == "-h" || "$1" == "--help" ]]; then
            520.         Usage
            521. elif [[ "$1" == "--version" ]]; then
            522.         echo "$APP_NAME $APP_VERSION"
            523. elif [[ "$1" == "--show" ]]; then
            524.         #當(dāng)發(fā)現(xiàn)具有參數(shù)--show時(shí),運(yùn)行顯示函數(shù)
            525.         RunAsDisplayer
            526. else
            527.         bash $0 --show&        #以參數(shù)--show將本程序再運(yùn)行一遍
            528.         RunAsKeyReceiver $!        #以上一行產(chǎn)生的進(jìn)程的進(jìn)程號(hào)作為參數(shù)
            529. fi
            综合久久给合久久狠狠狠97色| 亚洲精品无码久久一线| 天天综合久久久网| 久久精品中文闷骚内射| 思思久久好好热精品国产| 国产三级精品久久| 丁香久久婷婷国产午夜视频| 久久影视国产亚洲| 久久亚洲国产精品五月天婷| 亚洲国产精品无码久久一区二区 | 久久精品国产福利国产秒| 久久精品国产亚洲av麻豆小说| 国产精品无码久久四虎| 色偷偷88888欧美精品久久久 | 久久婷婷国产剧情内射白浆| 久久乐国产精品亚洲综合| 久久综合狠狠综合久久综合88| 久久精品国产99久久丝袜| 久久天天躁狠狠躁夜夜2020老熟妇| 亚洲AV无码久久精品蜜桃| 人妻无码久久精品| 综合网日日天干夜夜久久| 色婷婷综合久久久久中文一区二区| 亚洲乱亚洲乱淫久久| 久久久久亚洲AV无码专区网站| 国内精品久久久久影院免费| 老男人久久青草av高清| 久久久久久久久无码精品亚洲日韩 | 国产91久久综合| 2021少妇久久久久久久久久| 日本精品久久久久中文字幕| 欧美亚洲色综久久精品国产| 国产A级毛片久久久精品毛片| 色综合久久88色综合天天 | 久久国产成人亚洲精品影院| 天堂无码久久综合东京热| 精品久久久久久久久久中文字幕 | 一本色道久久综合亚洲精品| 精品视频久久久久| 精品无码久久久久久国产| 久久精品中文字幕一区|