Chinaunix首页 | 论坛 | 博客
  • 博客访问: 219437
  • 博文数量: 33
  • 博客积分: 256
  • 博客等级:
  • 技术积分: 300
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-14 18:39
个人简介

前方的路,充满了艰辛。-

文章分类
文章存档

2014年(1)

2013年(27)

2012年(5)

分类: LINUX

2013-04-23 12:42:09

欢迎转载,请注明原处,版权个人所有,不得用于商业用途,违者将追求起法律责任。  chengyaogen.blog.chinaunix.net
前面我们已经可以随机产生俄罗斯方块了,今天我们让它随键盘而改变

  1. #!/bin/bash

  2. #七中不同的方块的定义
  3. #通过旋转,每种方块的显示的样式可能有几种
  4. box0=(0 0 0 1 1 0 1 1)
  5. box1=(0 2 1 2 2 2 3 2 1 0 1 1 1 2 1 3)
  6. box2=(0 0 0 1 1 1 1 2 0 1 1 0 1 1 2 0)
  7. box3=(0 1 0 2 1 0 1 1 0 0 1 0 1 1 2 1)
  8. 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)
  9. 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)
  10. 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)

  11. #把所有盒子放在box中
  12. box=(${box0[@]} ${box1[@]} ${box2[@]} ${box3[@]} ${box4[@]} ${box5[@]} ${box6[@]})

  13. #每个盒子在box中的偏移
  14. boxOffset=(0 1 3 5 7 11 15)

  15. #旋转次数
  16. rotateCount=(1 2 2 2 4 4 4)

  17. #颜色数组
  18. colourArry=(31 32 33 34 35 36 37)

  19. #选装类型
  20. rotateType=-1

  21. #盒子标号
  22. boxNum=-1

  23. #新盒子
  24. newBox=()

  25. #边缘距离
  26. top=3
  27. left=3

  28. #当前x,y坐标
  29. currentX=15
  30. currentY=2

  31. #信号
  32. SigA=20
  33. SigS=21
  34. SigD=22
  35. SigW=23
  36. sig=0

  37. #随机产生盒子
  38. function Random_Box()
  39. {
  40.     #随机产生盒子号
  41.     (( boxNum = $RANDOM % 7 ))    
  42.     #随机长生盒子的类型
  43.     ((rotateType = $RANDOM % ${rotateCount[boxNum]}))
  44.     #随机产生颜色
  45.     ((colourNum = $RANDOM % ${#colourArry[*]}))

  46.     #找到所在box中的起始位置
  47.     ((j = ${boxOffset[boxNum]} * 8 + rotateType * 8))

  48.     for(( i = 0 ;i < 8;i ++))
  49.     do
  50.         ((newBox[i] = ${box[j+i]}))
  51.     done
  52. }


  53. function Draw_Box()
  54. {
  55.     local i j x y


  56.     if (($1 == 0))
  57.     then
  58.         for ((i = 0;i < 8;i += 2))
  59.         do
  60.             ((x = left + 3 * (currentX + ${newBox[i]})))
  61.             ((y = top + currentY + ${newBox[i+1]}))

  62.             echo -e "\033[${y};${x}H "
  63.         done
  64.     else
  65.         echo -e "\033[${colourArry[$colourNum]}m\033[1m"
  66.         for ((i = 0;i < 8;i += 2))
  67.         do
  68.             ((x = left + 3 * (currentX + ${newBox[i]})))
  69.             ((y = top + currentY + ${newBox[i+1]}))

  70.             echo -e "\033[${y};${x}H[*]"
  71.         done
  72.     fi

  73.     echo -e "\033[0m"
  74. }

  75. function move_left()
  76. {    
  77.     local temp

  78.     if (( currentX == 0 ))
  79.     then
  80.         return 1
  81.     fi
  82.     
  83.     #先清除以前的方块
  84.     Draw_Box 0
  85.     
  86.     #改变x坐标
  87.     (( currentX -- ))
  88.     
  89.     #画出新的方块
  90.     Draw_Box 1

  91.     return 0
  92. }


  93. function move_right()
  94. {    

  95.     if ((currentX > 20 ))
  96.     then
  97.         return 1;
  98.     fi

  99.     #先清除以前的方块
  100.     Draw_Box 0
  101.     
  102.     #改变x坐标
  103.     (( currentX ++ ))
  104.     
  105.     #画出新的方块
  106.     Draw_Box 1

  107.     return 0;
  108. }

  109. #记录已经旋转的方块次数
  110. tempCount=0

  111. #按下w键旋转处理
  112. function box_rotate()
  113. {
  114.     local start_post
  115.     
  116.     ((tempCount ++))
  117.     #echo ${rotateCount[boxNum]}
  118.     if ((tempCount >= ${rotateCount[boxNum]}))
  119.     then
  120.         ((tempCount = 0))
  121.     fi

  122.     #每个盒子在box中的始位置
  123.     ((start_post = ${boxOffset[boxNum]} * 8 + tempCount * 8))

  124.     for ((i = 0;i < 8;i ++))
  125.     do
  126.         ((newBox[i] = ${box[start_post+i]}))
  127.     done

  128.     return 0
  129. }

  130. function move_rotate()
  131. {    

  132.     if ((currentY == 0 ))
  133.     then
  134.         return 1;
  135.     fi

  136.     #先清除以前的方块
  137.     Draw_Box 0
  138.     
  139.     #改变当前方块的形状
  140.     box_rotate
  141.         
  142.     #画出新的方块
  143.     Draw_Box 1

  144.     return 0;
  145. }


  146. function move_down()
  147. {    

  148.     if ((currenty > 20 ))
  149.     then
  150.         return 1;
  151.     fi

  152.     #先清除以前的方块
  153.     Draw_Box 0
  154.     
  155.     #改变x坐标
  156.     (( currentY ++ ))
  157.     
  158.     #画出新的方块
  159.     Draw_Box 1

  160.     return 0;
  161. }


  162. function Register_Signal()
  163. {
  164.     trap "sig=$SigA;" $SigA
  165.     trap "sig=$SigS;" $SigS
  166.     trap "sig=$SigD;" $SigD
  167.     trap "sig=$SigW;" $SigW
  168. }

  169. function Recive_Signal()
  170. {

  171.     Random_Box
  172.     Draw_Box 1
  173.     Register_Signal

  174.     while true
  175.     do
  176.         sigThis=$sig

  177.         case "$sigThis" in
  178.             "$SigA")
  179.                 move_left
  180.                 sig=0
  181.                 ;;

  182.             "$SigS")
  183.                 move_down
  184.                 sig=0
  185.                 ;;

  186.             "$SigD")
  187.                 move_right
  188.                 sig=0
  189.                 ;;

  190.             "$SigW")
  191.                 move_rotate
  192.                 sig=0
  193.                 ;;
  194.         esac
  195.         
  196.     done
  197. }

  198. function Kill_Signal()
  199. {
  200.     local sigThis

  201.     while :
  202.     do
  203.         read -s -n 1 key
  204.         
  205.         case "$key" in

  206.             "W"|"w")
  207.                 kill -$SigW $1
  208.                 ;;
  209.             "S"|"s")
  210.                 kill -$SigS $1
  211.                 ;;
  212.             "A"|"a")
  213.                 kill -$SigA $1
  214.                 ;;
  215.             "D"|"d")
  216.                 kill -$SigD $1
  217.                 ;;
  218.             "Q"|"q")
  219.                 kill -9 $1
  220.                 exit
  221.      esac

  222.     done
  223. }

  224. if [[ "$1" == "--show" ]]
  225. then
  226.     Recive_Signal
  227. else
  228.     bash $0 --show &
  229.     Kill_Signal $!
  230. fi
效果图:
 
红色部分是我们今天写的代码,思路是使用随机产生的盒子号确定此盒子在box中的位置,然后从此位置开始,把它的所有造型在屏幕上挨个画出来。
到现在为止,我们可以随机产生俄罗斯方块,并且可以移动和改变,下一节我们在屏幕上画出一个矩阵,让盒子从矩阵的顶部自动下落,到矩阵的底部停止。
 
阅读(4001) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~