用shell写俄罗斯方块(五)-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 217865
  • 博文数量: 33
  • 博客积分: 256
  • 博客等级:
  • 技术积分: 300
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-14 18:39
个人简介

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

文章分类
文章存档

2014年(1)

2013年(27)

2012年(5)

相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: linux

2013-04-23 12:42:09

原文地址: 作者:草根老师

欢迎转载,请注明原处,凯发k8官网下载客户端中心的版权个人所有,不得用于商业用途,违者将追求起法律责任。  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[ji]}))
  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[i1]}))

  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[i1]}))

  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_posti]}))
  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中的位置,然后从此位置开始,把它的所有造型在屏幕上挨个画出来。
到现在为止,我们可以随机产生俄罗斯方块,并且可以移动和改变,下一节我们在屏幕上画出一个矩阵,让盒子从矩阵的顶部自动下落,到矩阵的底部停止。
 
阅读(3956) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图