免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3145 | 回复: 9
打印 上一主题 下一主题

Shell版 推箱子[游戏] [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-11-16 15:27 |只看该作者 |倒序浏览

  1. #!/bin/sh
  2. ########################################
  3. #
  4. #作者:Minuit
  5. #时间:2006年11月15日 星期三 14时44分27秒
  6. #文件名:blocktest.sh
  7. #描述:
  8. ########################################
  9. #结构
  10. level=1  #游戏级别
  11. blockmap1=0
  12. blockmap2=0
  13. blockmap3=0
  14. blockmap4=0
  15. blockmap5=0
  16. blockmap6=0
  17. blockmap7=0
  18. blockmap8=0
  19. blockmap9=0
  20. blockmap10=0
  21. blockmap11=0
  22. cursor=0
  23. blockkey1=0
  24. blockkey2=0
  25. blockkey3=0
  26. block=0

  27. #图形描述
  28. #坐标值
  29. TTYCOL=$(tput cols)
  30. blocksize=11    #每个小方块组的元素个数
  31. blocknumber=0 #小方块组的数量
  32. if (( TTYCOL>80 ))
  33. then
  34. blockhigth=2  #方块高度
  35. blockwidth=4   #方块宽度
  36. initx=3        #起始x坐标值
  37. inity=20       #起始y坐标值
  38. else
  39. blockhigth=1   #方块高度
  40. blockwidth=2   #方块宽度
  41. initx=3        #起始x坐标值
  42. inity=20       #起始y坐标值
  43. fi
  44. #color
  45. blockblack='\033[1;40m \033[0m'
  46. blockred='\033[1;41m \033[0m'
  47. blockgreen='\033[1;42m \033[0m'
  48. blockyellow='\033[1;43m \033[0m'
  49. blockblue='\033[1;44m \033[0m'
  50. blockpuce='\033[1;45m \033[0m'
  51. blockmidblue='\033[1;46m \033[0m'
  52. blockgray='\033[1;47m \033[0m'
  53. blockwhite=' '
  54. blocktxt='*'
  55. blockbg1=$blockblack #背景彩色值1
  56. blockbg2=$blockgreen #背景彩色值2
  57. blockbg3=$blockpuce
  58. blockbg4=$blockred
  59. black=1
  60. red=2
  61. green=3
  62. yellow=4
  63. blue=5
  64. gray=6
  65. white=0
  66. txt=9

  67. #
  68. clear=$( tput clear )
  69. cursor_off=$( tput civis )
  70. cursor_on=$( tput cnorm )

  71. #游戏状态和按键计数
  72. drawx=0
  73. drawy=0
  74. savedrawx=0
  75. savedrawy=0
  76. savecursor=0
  77. Game_state=1
  78. key_count=0
  79. save_key=""


  80. trap "Game_state=0" 1 2 3 15

  81. #定位函数
  82. function gotoxy()
  83. {
  84. tput cup  $1 $2
  85. }

  86. #初始化全局地图,级别和玩家光标位置
  87. function block_map()
  88. {
  89. case $level in
  90.         1)
  91.                 blockmap1=(1 1 1 1 1 1 1 1 1 1 1 )
  92.                 blockmap2=(1 1 1 1 1 1 1 1 1 1 1 )
  93.                 blockmap3=(1 1 1 1 1 1 1 3 0 0 1 )
  94.                 blockmap4=(1 1 1 1 1 1 1 3 1 0 1 )
  95.                 blockmap5=(1 1 1 1 1 1 1 3 1 0 1 )
  96.                 blockmap6=(1 0 0 0 2 0 2 0 2 0 1 )
  97.                 blockmap7=(1 0 1 0 1 0 1 0 1 1 1 )
  98.                 blockmap8=(1 0 0 0 0 0 0 0 1 1 1 )
  99.                 blockmap9=(1 1 1 1 1 1 1 1 1 1 1 )
  100.                 blockmap10=(1 1 1 1 1 1 1 1 1 1 1 )
  101.                 blockmap11=(1 1 1 1 1 1 1 1 1 1 1 )
  102.         cursor=58
  103.                 blockkey1=29
  104.                 blockkey2=40
  105.                 blockkey3=51
  106.                 ;;
  107.         2)
  108.                 blockmap1=(1 1 1 1 1 1 1 1 1 1 1 )
  109.                 blockmap2=(1 1 1 1 1 1 1 1 1 1 1 )
  110.                 blockmap3=(1 1 1 1 0 0 1 1 1 1 1 )
  111.                 blockmap4=(1 0 0 0 0 0 1 1 1 1 1 )
  112.                 blockmap5=(1 0 2 0 1 0 0 3 0 1 1 )
  113.                 blockmap6=(1 0 0 1 0 0 0 3 0 0 1 )
  114.                 blockmap7=(1 1 0 1 2 2 1 3 0 0 1 )
  115.                 blockmap8=(1 1 0 0 0 0 1 1 1 1 1 )
  116.                 blockmap9=(1 0 0 0 1 1 1 1 1 1 1 )
  117.                 blockmap10=(1 0 0 0 1 1 1 1 1 1 1 )
  118.                 blockmap11=(1 1 1 1 1 1 1 1 1 1 1 )
  119.         cursor=91
  120.                 blockkey1=51
  121.                 blockkey2=62
  122.                 blockkey3=73
  123.                 ;;
  124.         3)
  125.                 blockmap1=(1 1 1 1 1 1 1 1 1 1 1 )
  126.                 blockmap2=(1 1 1 1 0 1 1 1 1 1 1 )
  127.                 blockmap3=(1 1 1 0 0 1 1 1 0 0 1 )
  128.                 blockmap4=(1 1 0 2 0 0 0 0 0 0 1 )
  129.                 blockmap5=(1 0 0 0 0 2 0 1 0 0 1 )
  130.                 blockmap6=(1 1 1 0 2 1 1 1 0 0 1 )
  131.                 blockmap7=(1 1 1 0 0 1 3 3 0 0 1 )
  132.                 blockmap8=(1 1 1 0 1 1 3 1 0 1 1 )
  133.                 blockmap9=(1 1 0 0 0 0 0 0 1 1 1 )
  134.                 blockmap10=(1 1 0 0 0 0 0 1 1 1 1 )
  135.                 blockmap11=(1 1 1 1 1 1 1 1 1 1 1 )
  136.         cursor=49
  137.                 blockkey1=72
  138.                 blockkey2=73
  139.                 blockkey3=83
  140.                 ;;
  141.                 *);;
  142. esac
  143. block=(${blockmap1[@]} ${blockmap2[@]} ${blockmap3[@]} ${blockmap4[@]} ${blockmap5[@]} ${blockmap6[@]} ${blockmap7[@]} ${blockmap8[@]} ${blockmap9[@]} ${blockmap10[@]} ${blockmap11[@]})
  144. blocknumber=$(( ${#block[@]}/blocksize ))  #小方块组的数量
  145. }

  146. #检查游戏状态
  147. function check_state()
  148. {
  149. #判断箱子是否移最终位置
  150. if (( block[blockkey1]==2 && block[blockkey2]==2 && block[blockkey3]==2 ))
  151.   then
  152.           #如果没有穿关那继续下一关重新初始化地图按键计数和级别
  153.                   tput clear
  154.                   gotoxy  10 $(( TTYCOL/2-10 ))
  155.                   (( ++level ))
  156.                   if (( level==4 ))
  157.             then
  158.                       echo "恭喜您已经把本游戏穿关了!!!"
  159.                       sleep 1
  160.                       Game_state=0
  161.                         else
  162.                       echo "成功过第"$(( level-1 ))"关!!!"
  163.                       sleep 1
  164.                           key_count=0
  165.                       block_map  
  166.               initmap
  167.           fi
  168. else
  169.         #否则检查最终位置是否被覆盖
  170.                 (( block[blockkey1]!=2 )) && (( block[blockkey1]=3 ))
  171.                 (( block[blockkey2]!=2 )) && (( block[blockkey2]=3 ))
  172.                 (( block[blockkey3]!=2 )) && (( block[blockkey3]=3 ))
  173. fi
  174. }

  175. #画地图
  176. function depict_block()
  177. {
  178. x=$initx       #x坐标值
  179. y=$inity       #y坐标值
  180. for (( i=0;i<blocknumber;i++ ))
  181. do
  182.    for(( j=0;j<blocksize;j++ ))
  183.    do
  184.        (( ${block[$(( i*blocksize+j ))]} ))&& drawcolor=$blockbg1||drawcolor=$blockbg2
  185.        (( ${block[$(( i*blocksize+j ))]}==2 ))&& drawcolor=$blockbg3
  186.        (( ${block[$(( i*blocksize+j ))]}==3 ))&& drawcolor=$blockbg4
  187.         for(( k=0;k<blockhigth;k++ ))
  188.         do
  189.                           for(( l=0;l<blockwidth;l++ ))
  190.               do
  191.                      echo -e "\033[$(( x+k ));$(( y+l ))H${drawcolor}\033[0m"
  192.               done
  193.         done
  194.            (( y+=blockwidth ))
  195.    done
  196. (( y=inity ))
  197. (( x+=blockhigth ))
  198. done
  199. }

  200. #画方块
  201. #第一个参数是block数组索引第二个是彩色值默认恢复背景彩色值
  202. function drawblock()
  203. {
  204. drawx=$(( $1/blocksize*blockhigth+initx ))
  205. drawy=$(( $1%blocksize*blockwidth+inity ))
  206. savedrawx=$drawx
  207. savedrawy=$drawy
  208. if (( $2 ))
  209. then
  210. case $2 in
  211.        1) drawcolor=$blockblack;;
  212.        2) drawcolor=$blockred;;
  213.        3) drawcolor=$blockgreen;;
  214.        4) drawcolor=$blockyellow;;
  215.        5) drawcolor=$blockblue1;;
  216.        6) drawcolor=$blockgray;;
  217.        7) drawcolor=$blockpuce;;
  218.        8) drawcolor=$blockmidblue;;
  219.        9) drawcolor=$blocktxt;;
  220.        *) drawcolor=$blockwhite;;
  221. esac
  222. else
  223.      (( block[$1] )) && drawcolor=$blockbg1 ||drawcolor=$blockbg2
  224.      (( block[$1]==2 )) && drawcolor=$blockbg3
  225.      (( block[$1]==3 ))&& drawcolor=$blockbg4
  226. fi
  227.   for(( k=0;k<blockhigth;k++ ))
  228.     do
  229.       for(( l=0;l<blockwidth;l++ ))
  230.         do
  231.            echo -e "\033[$(( drawx+k ));$(( drawy+l ))H${drawcolor}\033[0m"
  232.         done
  233.     done
  234. }

  235. #移动箱子同时恢复上一次移动位置背景
  236. function runkey()
  237. {
  238. flags=0
  239. tmp=0
  240. gotoxy  $initx $inity
  241. echo -e "\033[4;30m级别\033[0m:\033[1;35m${level}\033[0m \033[4;30m步数\033[0m:\033[1;35m$key_count\033[0m"
  242.      case "$1" in
  243.                    'left')
  244.                        if (( cursor-1>=0 )) && (( cursor%blocksize!=1 )) && (( block[cursor-2] !=1 ))
  245.                then
  246.                                           if (( block[cursor-2]==2 )) && (( block[cursor-3]==0 ||block[cursor-3]==3 ))
  247.                       then
  248.                                             (( block[cursor-3]=2 ))
  249.                                                 drawblock $(( cursor-3 ))
  250.                                                 (( block[cursor-2]=0 ))
  251.                                                 drawblock $(( cursor-2 ))
  252.                                           fi
  253.                                              (( flags=1 ))&&(( block[cursor-2]!=2 ))&&(( cursor-- ))
  254.                                              drawblock $savecursor
  255.                                   
  256.                fi
  257.                        ;;
  258.                    'right')
  259.                            if (( cursor+1<=blocksize*blocknumber )) && (( cursor%blocksize!=0 )) && (( block[cursor]!=1 ))
  260.                then
  261.                                          if (( block[cursor]==2 )) &&(( block[cursor+1]==0|| block[cursor+1]==3 ))
  262.                       then
  263.                                             (( block[cursor+1]=2 ))
  264.                                                 drawblock $(( cursor+1 ))
  265.                                                 (( block[cursor]=0 ))
  266.                                                 drawblock $(( cursor ))
  267.                                           fi
  268.                                           (( flags=1 ))&&(( block[cursor]!=2 ))&&(( cursor++ ))
  269.                                           drawblock $savecursor
  270.                fi
  271.                            ;;
  272.                    'up')
  273.                            if (( cursor-blocksize >=0 )) && (( block[cursor-blocksize-1] !=1 ))
  274.                then
  275.                                           if (( block[cursor-blocksize-1]==2 )) &&(( block[cursor-blocksize*2-1]==0 || block[cursor-blocksize*2-1]==3 ))
  276.                       then
  277.                                                  (( block[cursor-blocksize*2-1]=2 ))
  278.                                                  drawblock $(( cursor-blocksize*2-1 ))
  279.                                                  (( block[cursor-blocksize-1]=0 ))
  280.                                                  drawblock $(( cursor-blocksize-1 ))
  281.                       fi
  282.                                           (( flags=1 ))&&(( block[cursor-blocksize-1]!=2 ))&&(( cursor-=blocksize ))
  283.                                           drawblock $savecursor
  284.                        fi
  285.                            ;;
  286.                  'down')
  287.                            if (( cursor+blocksize<=blocksize*blocknumber )) && (( block[cursor+blocksize-1]!=1 ))
  288.                then
  289.                                           if (( block[cursor+blocksize-1]==2 ))&&(( block[cursor+blocksize*2-1]==0 || block[cursor+blocksize*2-1]==3 ))
  290.                       then
  291.                                                  (( block[cursor+blocksize*2-1]=2 ))
  292.                                                  drawblock $(( cursor+blocksize*2-1 ))
  293.                                              (( block[cursor+blocksize-1]=0 ))
  294.                                                  drawblock $(( cursor+blocksize-1 ))
  295.                       fi
  296.                                           (( flags=1 )) &&(( block[cursor+blocksize-1]!=2 ))&&(( cursor+=blocksize ))
  297.                                           drawblock $savecursor
  298.                fi
  299.                                  ;;
  300.      esac
  301. if (( flags ))
  302. then
  303.    savecursor=$(( cursor-1 ))
  304.    drawblock $(( cursor-1 ))  $txt
  305.    (( key_count++ ))
  306.    check_state
  307. fi
  308. }

  309. #初始化地图
  310. function initmap()
  311. {
  312. depict_block
  313. drawblock $(( cursor-1 )) $txt
  314. savecursor=$(( cursor-1 ))
  315. }

  316. #解释按键
  317. function tran_key()
  318. {
  319.       case "$1" in
  320.                         'a'|'A')
  321.                             if [ "$save_key" == '[' ]
  322.                               then
  323.                                 runkey 'up'
  324.                               else
  325.                                 runkey 'left'
  326.                              fi
  327.                              ;;
  328.                         'd'|'D')
  329.                                if [ "$save_key" == '[' ]
  330.                                                            then
  331.                                                              runkey 'left'
  332.                                                            else
  333.                                                              runkey 'right'
  334.                                                            fi
  335.                              ;;
  336.                         'w'|'W') runkey 'up' ;;
  337.                          's'|'S') runkey 'down' ;;
  338.                             'B') runkey 'down' ;;
  339.                             'C') runkey 'right' ;;
  340.                             '')
  341.                                                                 # ^[ ESC按键处理 C-v [ 组合
  342.                                                                 if [ "$save_key" == '' ]
  343.                                                               then
  344.                                                                                  Game_state=0
  345.                                                                    fi
  346.                                                           ;;
  347.        esac
  348. }



  349. echo $clear
  350. echo $cursor_off
  351. block_map
  352. initmap
  353. #主循环
  354. while (( Game_state ))
  355. do
  356.    read -s -n 1 key
  357.    tran_key "$key"
  358.    save_key=$key
  359. done
  360. echo $cursor_on
  361. echo $clear
  362. gotoxy 0 0
  363. echo "Game Over!"
复制代码


最新比较忙没时间上CU还真难受^_^
昨天写了一个推箱子游戏贴上来给让大家批评一下
说实在我也是第一次写游戏写不好尽量提出我乐意接受,很多地方可能有更好的方法实现
本来想写俄罗斯方块的可是已经有人写过了只要重新来一个

[ 本帖最后由 lovesaka 于 2006-11-16 19:00 编辑 ]

评分

参与人数 1可用积分 +1 收起 理由
waker + 1

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2006-11-16 15:31 |只看该作者
推箱子的也有shell版了,期待perl版

论坛徽章:
0
3 [报告]
发表于 2006-11-16 15:49 |只看该作者
如果用perl写的话就那可能比这简单些可以用tk模块写个图形的但是我对这不熟有时间看看能不能整一个出来
刚看了一下原来有人已经用sed的写了一个我五体投地^_^

论坛徽章:
0
4 [报告]
发表于 2006-11-16 15:57 |只看该作者
是啊!pf!
shell得偶也不会,pf!

论坛徽章:
0
5 [报告]
发表于 2006-11-16 18:00 |只看该作者
強帖

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
6 [报告]
发表于 2006-11-16 18:58 |只看该作者
强人强贴

论坛徽章:
0
7 [报告]
发表于 2006-11-16 19:00 |只看该作者
原帖由 lovesaka 于 2006-11-16 15:27 发表
[code]
#/bin/sh
########################################
#
#作者:Minuit
#时间:2006年11月15日 星期三 14时44分27秒
#文件名:blocktest.sh
#描述:
########################################
#结构
...

sorry.编辑没把#!/bin/sh中的!给打上
改正一下

论坛徽章:
0
8 [报告]
发表于 2006-11-16 19:03 |只看该作者
我的这点小知识都是像你们楼上这些老大学得^_^

论坛徽章:
0
9 [报告]
发表于 2006-11-17 10:46 |只看该作者
偶忍不住,运行调试了一下,但是只能够,移动不能推箱子呀。。

还有楼主最好写个,说明,我是看脚本内容才知道有ADSW的。5555,推不动箱子,到底红的是箱子,还是黑的是箱子了,最好做点特别的标记。

论坛徽章:
0
10 [报告]
发表于 2006-11-17 13:09 |只看该作者
原帖由 mokai 于 2006-11-17 10:46 发表
偶忍不住,运行调试了一下,但是只能够,移动不能推箱子呀。。

还有楼主最好写个,说明,我是看脚本内容才知道有ADSW的。5555,推不动箱子,到底红的是箱子,还是黑的是箱子了,最好做点特别的标记。


因为是第一次写这玩意没留意这东西谢谢提醒

使用方法
[aA]  左
[dD]  右
[wW]  上
[sS]     下
方向键左      左
方向键右     右
方向键上                   上
方向键下          下
按两下ESC退出
见下图白色为玩家方块
黄色为箱子
所有关里红色为终点
黒色为背景
绿色为可移动区域(包括红色)
还有它会跟据终端的初始大小来改变游戏显示大图还是小图

[ 本帖最后由 lovesaka 于 2006-11-17 13:26 编辑 ]

抓图13.png (9.02 KB, 下载次数: 42)

抓图13.png

抓图15.png (6.97 KB, 下载次数: 43)

抓图15.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP