亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: shell版俄羅斯方塊 [打印本頁]

作者: 飛灰橙    時間: 2003-10-21 10:34
標(biāo)題: shell版俄羅斯方塊
把注釋加進(jìn)去了,可能不是很詳盡,
只希望能把問題表現(xiàn)的清楚一點

感謝各位兄弟的捧場,
屬于舊瓶裝新酒了,呵呵
如果你的終端可以顯示出顏色,效果會好點

運(yùn)行于GNU bash, version 2.05a.0(1)-release (i686-pc-linux-gnu)

---------------------------------------------------
果然在新的ubuntu下不能運(yùn)行了,需要將類似\33的地方改成\033,
感謝網(wǎng)友thinux和guotao_buaa幫忙修改,已經(jīng)將新的代碼補(bǔ)入。


  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. #控制信號
  28. #改游戲使用兩個進(jìn)程,一個用于接收輸入,一個用于游戲流程和顯示界面;
  29. #當(dāng)前者接收到上下左右等按鍵時,通過向后者發(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. #每提高一個速度級需要積累的分?jǐn)?shù)
  52. iScoreEachLevel=50        #be greater than 7

  53. #運(yùn)行時數(shù)據(jù)
  54. sig=0                #接收到的signal
  55. iScore=0        #總分
  56. iLevel=0        #速度級
  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讀取終端鍵時,終端的屬性會被暫時改變。
  79.         #如果在read -s時程序被不幸殺掉,可能會導(dǎo)致終端混亂,
  80.         #需要在程序退出時恢復(fù)終端屬性。
  81.         sTTY=`stty -g`

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

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


  87.         while :
  88.         do
  89.                 #讀取輸入。注-s不回顯,-n讀到一個字符立即返回
  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.         #掛載各種信號的處理函數(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)前的速度級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)的信號
  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), 測試是否可以把移動中的方塊移到(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)前移動中的方塊放到背景方塊中去,
  197. #并計算新的分?jǐn)?shù)和速度級。(即一次方塊落到底部)
  198. function Box2Map()
  199. {
  200.         local j i x y xp yp line

  201.         #將當(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ǐn)?shù)和速度級
  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.                         #顯示新的速度級
  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        #測試是否可以下落一行
  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)前移動中的方塊貼到背景方塊中
  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.         #計算一共需要下落多少行
  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)前移動中的方塊貼到背景方塊中
  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.         #計算旋轉(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        #測試旋轉(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)前移動中的方塊, 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)前移動的方塊
  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)前移動的方塊
  413.         if (( ${#boxCur[@]} == 8 ))
  414.         then
  415.                 #計算當(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)前移動的方塊
  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)生方塊,這時右邊預(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. #退出時顯示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時,運(yùn)行顯示函數(shù)
  525.         RunAsDisplayer
  526. else
  527.         bash $0 --show&        #以參數(shù)--show將本程序再運(yùn)行一遍
  528.         RunAsKeyReceiver $!        #以上一行產(chǎn)生的進(jìn)程的進(jìn)程號作為參數(shù)
  529. fi

復(fù)制代碼

[ 本帖最后由 飛灰橙 于 2008-2-2 13:30 編輯 ]
作者: sunkey    時間: 2003-10-21 11:13
標(biāo)題: shell版俄羅斯方塊
強(qiáng)!  都這么厲害。。!》痔胤痔
作者: c1l2d3    時間: 2003-10-21 11:57
標(biāo)題: shell版俄羅斯方塊
真歷害。。
作者: admirer    時間: 2003-10-21 13:01
標(biāo)題: shell版俄羅斯方塊
真棒!
作者: 光明曉仙    時間: 2003-10-21 13:56
標(biāo)題: shell版俄羅斯方塊
哪位老大能告訴我bash哪里有下載?我的SCO里沒有,我想玩玩試試....
作者: herl    時間: 2003-10-21 14:50
標(biāo)題: shell版俄羅斯方塊
飛灰橙兄,有csh,ksh,sh版for unix 的嗎???謝謝!!!
作者: c1l2d3    時間: 2003-10-21 14:53
標(biāo)題: shell版俄羅斯方塊
是呀!要是能在BSH或KSH下運(yùn)行就好了
作者: 飛灰橙    時間: 2003-10-21 15:02
標(biāo)題: shell版俄羅斯方塊
[quote]原帖由 "herl"]有csh,ksh,sh版for unix 的嗎???謝謝!!![/quote 發(fā)表:

沒有哎,抱歉抱歉 :wink:
作者: zjBahamout    時間: 2003-10-21 16:07
標(biāo)題: shell版俄羅斯方塊

pf的一塌糊涂
作者: tiansgx    時間: 2003-10-21 16:26
標(biāo)題: shell版俄羅斯方塊
太強(qiáng)了
這是我見過最強(qiáng)的shell程序!
pfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpf!
作者: 光明曉仙    時間: 2003-10-21 21:44
標(biāo)題: shell版俄羅斯方塊
雖然我還沒能試玩一下這個游戲,但是我也十分佩服飛灰橙兄弟...........
作者: bjgirl    時間: 2003-10-21 21:44
標(biāo)題: shell版俄羅斯方塊
真佩服樓主的編程能力!
作者: 飛灰橙    時間: 2003-10-22 08:19
標(biāo)題: shell版俄羅斯方塊

作者: 痞菜    時間: 2003-10-22 09:31
標(biāo)題: shell版俄羅斯方塊
牛呀 牛呀

我是特意登陸道謝的
作者: ecfa    時間: 2003-10-22 09:57
標(biāo)題: shell版俄羅斯方塊
太厲害了
作者: yukunzcn    時間: 2003-10-22 09:58
標(biāo)題: shell版俄羅斯方塊
pf,pf................................................................!

作者: yoof    時間: 2003-10-22 13:21
標(biāo)題: shell版俄羅斯方塊
強(qiáng)烈要求樓主講一下算法  強(qiáng)烈要求 強(qiáng)烈要求 強(qiáng)烈要求 強(qiáng)烈要求

外加比較詳細(xì)的注釋

作者: sw_yp    時間: 2003-10-22 19:59
標(biāo)題: shell版俄羅斯方塊
有些注釋就更加完美了。。。
作者: Greenergy    時間: 2003-10-22 20:00
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: blackant    時間: 2003-10-23 11:37
標(biāo)題: shell版俄羅斯方塊
[user@redhat9 user]$ bash shell_fk.sh
: command not found:
: command not found:
: command not found:
: command not found:
: command not found:
: command not found0:
: command not found1:
: command not found2:
: command not found3:
: command not found4:
: command not found6:
: command not found7:
'hell_fk.sh: line 18: syntax error near unexpected token `
'hell_fk.sh: line 18: `(iTrayLeft = iLeft + 2)
[user@redhat9 user]$
作者: ohwww    時間: 2003-10-25 10:13
標(biāo)題: shell版俄羅斯方塊
樓主,這幾天不在,你又在著嚇人啦,哈哈,太佩服你了。
作者: eling    時間: 2003-10-25 13:33
標(biāo)題: shell版俄羅斯方塊
太強(qiáng)了

作者: zpflixl    時間: 2003-10-25 21:02
標(biāo)題: shell版俄羅斯方塊
真是太厲害了,給些解釋吧。
作者: 小飛愛使申華    時間: 2003-10-26 06:43
標(biāo)題: shell版俄羅斯方塊
厲害,頂!
作者: 金玄    時間: 2003-10-26 13:32
標(biāo)題: shell版俄羅斯方塊
強(qiáng)~
雖然沒弄來玩,但看這一把的代碼就頭大了
帶點注視那太完美了
作者: fightforever    時間: 2003-10-27 18:10
標(biāo)題: shell版俄羅斯方塊
64: syntax error near unexpected token `(('

for (( i = 0; i < iTrayHeight * iTrayWidth; i++ )) ; do iMap[$i]=-1; done

誰知道怎么回事?
作者: lmtok    時間: 2003-10-27 19:49
標(biāo)題: shell版俄羅斯方塊
PFPF
作者: yoursmile    時間: 2003-10-27 20:14
標(biāo)題: shell版俄羅斯方塊
[quote]原帖由 "飛灰橙"][/quote 發(fā)表:

  1. [root@uclinux game]# sh eluosi.sh
  2. eluosi.sh: eluosi.sh: command not found
  3. eluosi.sh: kill: (32353) - No such process
  4. eluosi.sh: kill: (32353) - No such process
  5. eluosi.sh: kill: (32353) - No such process
  6. eluosi.sh: kill: (32353) - No such process
  7. eluosi.sh: kill: (32353) - No such process
  8. eluosi.sh: kill: (32353) - No such process
復(fù)制代碼


請教樓主,這是怎么回事。
bash 版本:
GNU bash, version 2.05a.0(1)-release-(i686-pc-linux-gnu)
作者: doni    時間: 2003-10-27 21:52
標(biāo)題: shell版俄羅斯方塊
原帖由 "fightforever" 發(fā)表:
done

誰知道怎么回事?


我也遇到過。
我先是在S8(bash v2.0.4)下試的,也是報這個錯。
后來是在mandrake 8(linux)下試的,就OK。
作者: 飛灰橙    時間: 2003-10-28 08:49
標(biāo)題: shell版俄羅斯方塊
原帖由 "yoursmile"][root@uclinux game 發(fā)表:
# sh eluosi.sh
eluosi.sh: eluosi.sh: command not found
eluosi.sh: kill: (32353) - No such process
eluosi.sh: kill: (32353) - No such process
eluosi.sh: kill: (32353) - No such process
eluosi.sh: kill: (32353) - No such process
eluosi.sh: kill: (32353) - No such process
eluosi.sh: kill: (32353) - No such process

以前是直接./eluosi.sh運(yùn)行的,沒注意到這個問題,呵呵
將后面$0 --show&改為bash $0 --show&就ok了。
作者: tiansgx    時間: 2003-10-28 17:56
標(biāo)題: shell版俄羅斯方塊
樓上的高手,給些注釋吧,大家都看得很頭疼
作者: 飛灰橙    時間: 2003-10-29 14:10
標(biāo)題: shell版俄羅斯方塊
兄弟們說的極是,
注釋少了以后自己都記不起來。
最近有點事情急趕,
過段時間我會把注釋加上來
作者: tiansgx    時間: 2003-10-29 15:18
標(biāo)題: shell版俄羅斯方塊
waiting...
作者: hardiwang    時間: 2003-11-24 13:24
標(biāo)題: shell版俄羅斯方塊
NB死了,老大,我拜你為師傅吧??好不好?
作者: songls    時間: 2003-11-24 14:05
標(biāo)題: shell版俄羅斯方塊
Ok Ok Ding
作者: sdccf    時間: 2004-02-07 00:57
標(biāo)題: shell版俄羅斯方塊
[quote]原帖由 "光明曉仙"]哪位老大能告訴我bash哪里有下載?我的SCO里沒有,我想玩玩試試....[/quote 發(fā)表:


http://unix-cd.com/softdown/show.asp?id=211
作者: wangnb    時間: 2004-02-28 15:37
標(biāo)題: shell版俄羅斯方塊
你太利害了,能給小弟寫一個SHELL 的終端打印程序嗎?如行,小弟萬分感謝!
E—mail: wangnb@tom.com
              wangnb@sina.com
作者: bac1    時間: 2004-07-07 15:44
標(biāo)題: shell版俄羅斯方塊
真是強(qiáng)啊   不過我發(fā)現(xiàn)了一個問題  我在linux下運(yùn)行的  當(dāng)用ctrl+z將游戲暫停后  在用fg命令將游戲調(diào)回來后  控制游戲的方向鍵就不好用了
作者: bst    時間: 2004-10-11 21:28
標(biāo)題: shell版俄羅斯方塊
[quote]原帖由 "bac1"]真是強(qiáng)啊   不過我發(fā)現(xiàn)了一個問題  我在linux下運(yùn)行的  當(dāng)用ctrl+z將游戲暫停后  在用fg命令將游戲調(diào)回來后  控制游戲的方向鍵就不好用了[/quote 發(fā)表:


果然是個問題??
作者: slnhghm    時間: 2004-10-12 10:11
標(biāo)題: shell版俄羅斯方塊
shell高手,pfpf
作者: gunguymadman    時間: 2004-10-12 10:19
標(biāo)題: shell版俄羅斯方塊
good
作者: yangkundai    時間: 2004-10-12 11:28
標(biāo)題: shell版俄羅斯方塊
不錯呀,佩服!!!
作者: ftpbin    時間: 2004-10-18 17:16
標(biāo)題: shell版俄羅斯方塊
要下SCO怎么裝BASH?
作者: 用錢的兜兜    時間: 2004-10-18 17:54
標(biāo)題: shell版俄羅斯方塊
在sunos 5。8下報錯
line 74: syntax error near unexpected token `(('
line 74: `for ((i = 0; i < iTrayHeight * iTrayWidth; i++)); do iMap[$i]=-1; done '
作者: 飛灰橙    時間: 2004-10-19 08:48
標(biāo)題: shell版俄羅斯方塊
[quote]原帖由 "用錢的兜兜"]done '[/quote 發(fā)表:


bash --version 出來是多少?
作者: billquick    時間: 2004-11-11 14:59
標(biāo)題: shell版俄羅斯方塊
佩服佩服佩服佩服
作者: boyu    時間: 2004-11-11 22:30
標(biāo)題: shell版俄羅斯方塊
強(qiáng)。
作者: strongxxxx    時間: 2004-11-12 11:58
標(biāo)題: shell版俄羅斯方塊
太佩服樂
作者: yslaoniu    時間: 2004-11-12 19:03
標(biāo)題: shell版俄羅斯方塊
佩服,佩服
作者: bitbull    時間: 2004-11-12 19:20
標(biāo)題: shell版俄羅斯方塊
昨天COPY試玩了一下,震撼!!
居然用SHELL寫的
一個字---牛!!
作者: purple_tide    時間: 2004-11-14 03:35
標(biāo)題: shell版俄羅斯方塊
我咋運(yùn)行不了?  ft
作者: chauney    時間: 2004-11-14 09:38
標(biāo)題: shell版俄羅斯方塊
佩服佩服!
作者: rubemars    時間: 2004-11-30 14:50
標(biāo)題: shell版俄羅斯方塊
程序運(yùn)行中好像有問題,會有一個方塊停在中間的現(xiàn)象(騰空,并沒有到最低下),不知大家有沒有這個問題?
GNU bash, version 2.05b.0(1)-release (i386-redhat-linux-gnu)
作者: 學(xué)習(xí)者yang    時間: 2004-11-30 15:41
標(biāo)題: shell版俄羅斯方塊
這論壇里高手如云啊,向你們學(xué)習(xí)!
作者: yoyo-8    時間: 2004-11-30 16:40
標(biāo)題: shell版俄羅斯方塊
都不知道怎么學(xué)的,搞得這么精.
飛灰橙: 你知道怎么在nawk中自定義函數(shù)嗎??????
作者: zz93    時間: 2004-11-30 22:24
標(biāo)題: shell版俄羅斯方塊
強(qiáng):-)
作者: ohwww    時間: 2004-12-01 09:32
標(biāo)題: shell版俄羅斯方塊
在Tru64 UNIX下怎么不可以呢?可能是定義數(shù)組的時候Tru64 UNIX跟樓主的不同
作者: zergtree    時間: 2004-12-24 14:10
標(biāo)題: shell版俄羅斯方塊
牛XX!!!!!

sc1.jpg (4.91 KB, 下載次數(shù): 116)

sc1.jpg

作者: wjs2634    時間: 2004-12-25 04:13
標(biāo)題: shell版俄羅斯方塊
好利害,好快啊,死得也快?
level 0 都過不了。?!?

Tetris_Game2.jpg (8.66 KB, 下載次數(shù): 95)

死了。。。?

死了。。。?

Tetris_Game.jpg (11.57 KB, 下載次數(shù): 97)

運(yùn)行截圖。。

運(yùn)行截圖。。

作者: wjs2634    時間: 2004-12-25 04:25
標(biāo)題: shell版俄羅斯方塊
真是高人啊, 這樣的shell也能寫出來。讀也讀不懂,有些變量類型都沒見過?!
box=(${box0[@]} ${box1[@]} ${box2[@]} ${box3[@]} ${box4[@]} ${box5[@]} ${box6[@]})
這索什么類型??
作者: twen345    時間: 2004-12-25 12:17
標(biāo)題: shell版俄羅斯方塊
玩過了,強(qiáng)人啊
作者: flw    時間: 2004-12-25 17:33
標(biāo)題: shell版俄羅斯方塊
佩服地一塌糊涂!
作者: 子科    時間: 2004-12-27 11:52
標(biāo)題: shell版俄羅斯方塊
收藏起來, 謝謝
作者: vivamo    時間: 2005-01-18 01:30
標(biāo)題: shell版俄羅斯方塊
PF。∫嗌倌旯αΣ趴梢赃@樣NB。
作者: sleetdrop    時間: 2005-05-15 17:46
標(biāo)題: shell版俄羅斯方塊
汗~~大汗,都脫水了。
作者: yannankai    時間: 2005-05-16 08:44
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: freeboy8218    時間: 2005-05-28 10:50
標(biāo)題: shell版俄羅斯方塊
牛B,強(qiáng)人,
作者: nkoldbug    時間: 2005-05-31 15:50
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: YGC    時間: 2005-06-12 10:50
標(biāo)題: shell版俄羅斯方塊
強(qiáng)。。。。
作者: oxing    時間: 2005-06-13 11:43
標(biāo)題: shell版俄羅斯方塊
GNU bash, version 2.05b.0(1)-release (i686-pc-linux-gnu)
報錯咧
GNU bash, version 2.05a.0(1)-release (i686-pc-linux-gnu)
暈呀,就高級了那么一點點
作者: rockamong    時間: 2005-06-13 15:59
標(biāo)題: shell版俄羅斯方塊
弓雖,就一個字
作者: 我是胖胖    時間: 2005-06-13 20:57
標(biāo)題: shell版俄羅斯方塊
pf的五體投地。。?上抑挥衧co玩不了。。
作者: munllnum    時間: 2005-07-05 20:35
標(biāo)題: shell版俄羅斯方塊
不錯!
作者: munllnum    時間: 2005-07-05 21:57
標(biāo)題: shell版俄羅斯方塊
大哥,請問if [ $key = $cESC ]&&[ ${aKey[1]} = $cESC ]和if [[ $key == $cESC && ${aKey[1]} == $cESC ]]有什么區(qū)別?您為什么總是用后者?
作者: yttlovezxx    時間: 2005-09-14 23:55
標(biāo)題: shell版俄羅斯方塊
佩服的一塌糊涂!55555555555。看來我白活了這么久了。。。
作者: cyaln    時間: 2006-11-01 09:34
慢慢研究~
作者: cocoa1227    時間: 2006-11-01 17:09
好強(qiáng)啊啊啊
作者: jlus    時間: 2006-11-20 15:04
牛人,超級PF,好好學(xué)習(xí),那天爭取也弄一個玩玩
作者: snowwolflake    時間: 2006-12-01 10:43
太強(qiáng)了!!!!!!!!!!!!!!!!!!!111
佩服!。。。。。。。。。。。。。。。。。。。。。。。。。
作者: 231053469    時間: 2006-12-01 10:48
我的天~~~~~~~~~
簡直是天書
作者: feiyuw    時間: 2007-06-13 19:41
為什么我在ubuntu7.04上執(zhí)行不能繪制圖形呢?顯示成這個樣子:

\33[3;30H        \33[4;30H        \33[5;30H        \33[6;30H        \33[1m\33[7m\33[35m\33[45m\33[3;32H[]\33[4;30H[]\33[4;32H[]
作者: h0000001    時間: 2007-06-18 12:11
強(qiáng)人。。。PFPF
作者: jacky22109    時間: 2007-06-18 13:32
好東西

收藏
作者: sunceenjoy    時間: 2007-07-18 13:08
我建議樓主介紹一下自己的學(xué)習(xí)經(jīng)歷,給大家講講怎么到達(dá)這樣的境界。
作者: mkchengang    時間: 2007-07-18 16:17
太厲害了
作者: insolaris    時間: 2007-07-18 16:28
標(biāo)題: Good
收藏 研究
作者: StallmanRichard    時間: 2007-07-18 20:01
標(biāo)題: 一斑斑而已
一斑斑而已
作者: 什么名    時間: 2007-07-18 20:09
原帖由 StallmanRichard 于 2007-7-18 20:01 發(fā)表
一斑斑而已

原來是RMS如是說  那當(dāng)然一般般拉
作者: RobinWang    時間: 2007-07-19 09:36
雖然玩不了,但非常佩服

GNU bash, version 3.00.15(1)-release (i686-redhat-linux-gnu)
Copyright (C) 2004 Free Software Foundation, Inc.
作者: opiopuiopoi    時間: 2007-07-27 19:13
nb!
作者: whuang9527    時間: 2007-07-28 14:11
能不能稍微講解一下,
作者: lemboyz    時間: 2007-07-28 14:44
試了一下,簡直太牛X了。不得不服啊。shell能寫到這個程度不是一般的牛。
作者: everlasting_188    時間: 2007-07-28 23:00
有空玩玩!
作者: leonevictor    時間: 2007-07-30 09:58
不看不知道,一看嚇一跳,要好好學(xué)學(xué)!
作者: forgood    時間: 2007-08-02 14:38
厲害啊   剛試完了下.....
作者: paub    時間: 2007-08-02 16:25
標(biāo)題: 回復(fù) #1 飛灰橙 的帖子
5年前我就看到臺灣的一哥們編過,估計有抄襲的可能
作者: loveflag    時間: 2007-08-02 22:19
不看不知道  一看跳一跳  嘿嘿
作者: motse    時間: 2007-08-03 01:30
太有才了,不頂不行啊
作者: whn3375    時間: 2007-08-03 10:29
這個網(wǎng)上到處都有!
作者: wooqooo    時間: 2007-08-17 14:27
請問在hp-unix 可以運(yùn)行嗎
我再xmanger下面運(yùn)行顯示這樣.

[ 本帖最后由 wooqooo 于 2007-8-17 14:31 編輯 ]

111.GIF (44.9 KB, 下載次數(shù): 49)

111.GIF





歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2