免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 27132 | 回复: 45

shell游戏:扫雷  关闭 [复制链接]

论坛徽章:
0
发表于 2005-10-26 11:29 |显示全部楼层
shell游戏:扫雷

期待各位帮忙测试,如有BUG,请及时告知,谢谢
转载请保持版权声明完整,十分感谢

下载代码:
http://bitbull.cn/works/mine.sh

屏幕截图:
*

运行环境:
bash
80x24终端

usage:
$chmod 755 mine.sh
$./mine.sh

按1-3选择对应难度,4退出

方向:
上:w 下:s 左:a 右:d
标识地雷:
FLAG:f
挖:
DIG:j
重玩
NEWGAME:n
退出
EXIT

规则:
玩家可用方向键移动指针,按j挖雷,若挖到地雷,则游戏结束.否则,游戏将在你所挖方块内显示该方块周围8个方块内所有地雷数.若怀疑某方块为地雷,可按f键进行标识,以避免误挖.挖开地图内所有非雷方块则获胜.

代码:
  1. #!/bin/bash
  2. #-------------CopyRight-------------
  3. #   Name:Mine Sweeping
  4. #   Version Number:1.00
  5. #   Type:game
  6. #   Language:bash shell
  7. #   Date:2005-10-26
  8. #   Author:BitBull
  9. #   Email:BitBull.cn(at)gmail.com
  10. #------------Environment------------
  11. #   Terminal: column 80 line 24
  12. #   Linux 2.6.9 i686
  13. #   GNU Bash 3.00.15
  14. #-----------------------------------

  15. #---------------Define--------------
  16. ECHO="echo -ne"
  17. ESC="\033["

  18. OK=0
  19. FALSE=1
  20. #--------------Variable--------------
  21. #ANSI ESC action
  22. FLASH=5
  23. REV=7

  24. #color
  25. NULL=0
  26. BLACK=30
  27. RED=31
  28. GREEN=32
  29. ORANGE=33
  30. BLUE=34
  31. PURPLE=35
  32. SBLUE=36
  33. GREY=37

  34. #back color
  35. BBLACK=40
  36. BRED=41
  37. BGREEN=42
  38. BORANGE=43
  39. BBLUE=44
  40. BPURPLE=45
  41. BSBLUE=46
  42. BGREY=47

  43. MINE='@'
  44. FLAG='F'
  45. NUL=' '
  46. SHADOW='X'

  47. X=0
  48. Y=0
  49. CurX=1 #cur's X
  50. CurY=1 #cur's Y
  51. OCurX=1 #old cur's X
  52. OCurY=1 #old cur's Y
  53. MCount=0 #count mine
  54. FCount=0 #count flag
  55. SCount=0 #count shadow
  56. MXYp=0 #MXY Array's ptr
  57. #---------------Array----------------

  58. #if ${XY[]} == M { mine }
  59. #if ${XY[]} == F { flag }
  60. #if ${XY[]} == N { null }
  61. #if ${XY[]} == S { shadow }
  62. #if ${XY[]} == [1-8] { tip_num }
  63. #${XY[]} init in XYInit(i)

  64. MXY[0]=""

  65. #--------------Function--------------

  66. function SttyInit ()
  67. {
  68.         stty_save=$(stty -g) #backup stty

  69.         clear
  70.         trap "GameExit;" 2 15
  71.         stty -echo

  72.         $ECHO "${ESC}?25l" #hidden cursor
  73.        
  74.         return $OK
  75. }

  76. function GameExit ()
  77. {
  78.         stty $stty_save
  79.         stty echo
  80.         clear
  81.         trap 2 15
  82.         $ECHO "${ESC}?25h${ESC}0;0H${ESC}0m"

  83.         exit $OK
  84. }

  85. #print help
  86. function Help ()
  87. {
  88.         msg="Move:w s a d Dig:j Flag:f NewGame:n Exit:x   --CopyRight-- -2005-10-28 BitBull--"
  89.         $ECHO "${ESC}${REV};${RED}m${ESC}24;1H${msg}${ESC}${NULL}m"

  90.         return $OK
  91. }

  92. #print dialog window in screen
  93. function PMsg ()
  94. {
  95.         local title="$1" content="$2" greeting="$3"

  96.         $ECHO "${ESC}${RED}m"
  97.         $ECHO "${ESC}11;20H ------------------------------------------- "
  98.         $ECHO "${ESC}12;20H|         ======>$title<======           |"
  99.         $ECHO "${ESC}13;20H|         $content          |"
  100.         $ECHO "${ESC}14;20H|         ======>$greeting<======           |"
  101.         $ECHO "${ESC}15;20H ------------------------------------------- "
  102.         $ECHO "${ESC}${NULL}m"

  103.         return $OK
  104. }

  105. #print menu and player choose level,then ${X,Y,MCount,FCount,SCount} init
  106. function Menu ()
  107. {
  108.         local key

  109.         $ECHO "${ESC}6;1H${ESC}${RED}m"
  110. cat<<MENUEND
  111.                        +++++++++++++++++++++++++++++
  112.                        +        (1) Easy           +
  113.                        +        (2) Normal         +
  114.                        +        (3) Hardly         +
  115.                        +        (4) Exit           +
  116.                        +++++++++++++++++++++++++++++
  117. MENUEND
  118.         $ECHO "${ESC}${NULL}m"

  119.         while read -s -n 1 key
  120.         do
  121.                 case $key in
  122.                 1) X=10;Y=10;MCount=10;FCount=10;SCount=100;break
  123.                 ;;
  124.                 2) X=20;Y=14;MCount=28;FCount=28;SCount=280;break
  125.                 ;;
  126.                 3) X=36;Y=18;MCount=65;FCount=65;SCount=648;break
  127.                 ;;
  128.                 4) GameExit
  129.                 ;;
  130.                 esac
  131.         done

  132.         return $OK
  133. }       

  134. #receive CurX CurY,put it into XY[CurX+X*(CurY-1))]
  135. #if $# == 3;write into XY[]
  136. #if $# == 2;read from XY[]
  137. function XYFormat ()
  138. {
  139.         local XTmp=$1 YTmp=$2

  140.         if [[ $# -eq 3 ]]
  141.         then XY[$XTmp+$X*($YTmp-1)]=$3
  142.         else echo ${XY[$XTmp+$X*($YTmp-1)]}
  143.         fi       
  144.        
  145.         return $OK
  146. }

  147. function DrawInit ()
  148. {
  149.         local DIline DIline2

  150.         DIline=$( for (( i=1; i<$((X*2)); i++ )) do $ECHO '-';done )
  151.         DIline2=$( for (( i=0; i<X; i++ )) do $ECHO "|${ESC}${SBLUE}mX${ESC}${NULL}m";done )

  152.         clear
  153.         Help
  154.        
  155.         $ECHO "${ESC}1;1H+${DIline}+"
  156.         for (( i=0; i<Y; i++ ))
  157.         do
  158.                 $ECHO "${ESC}$((i+2));1H${DIline2}|"
  159.         done
  160.         $ECHO "${ESC}$((Y+2));1H+${DIline}+"

  161.         return $OK
  162. }

  163. #${XY[*]}=S
  164. function XYInit ()
  165. {
  166.         for (( i=1; i<=$X; i++ ))
  167.         do
  168.                 for (( j=1; j<=$Y; j++ ))
  169.                 do
  170.                         XYFormat $i $j S
  171.                 done
  172.         done
  173.         return $OK
  174. }

  175. #check X Y
  176. function CheckXY ()
  177. {
  178.         local XYTmp="$1 $2"

  179.         for(( i=0; i<MXYp; i++ ))
  180.         do
  181.                 if [[ "${MXY[i]}" == "$XYTmp" ]]
  182.                 then return $FALSE
  183.                 fi
  184.         done

  185.         return $OK
  186. }

  187. #RANDOM mine's X Y
  188. function XYRand ()
  189. {
  190.         local XTmp YTmp

  191.         for(( i=0; i<MCount; i++ ))
  192.         do
  193.                 while :
  194.                 do
  195.                         XTmp=$(( RANDOM % ( X - 1 ) + 1 ))
  196.                         YTmp=$(( RANDOM % ( Y - 1 ) + 1 ))
  197.                         CheckXY $XTmp $YTmp

  198.                         if [[ "$?" == "$OK" ]]
  199.                         then
  200.                                 XYFormat $XTmp $YTmp M
  201.                                 MXY[i]="$XTmp $YTmp"
  202.                                 (( ++MXYp ))
  203.                                 break
  204.                         else continue
  205.                         fi
  206.                 done
  207.         done
  208.        
  209.         return $OK
  210. }

  211. #DEBUG
  212. # print ${XY[*]} into ./mine.tmp
  213. #you can read mine.tmp to know where is mine,xixi~~:)
  214. #M is mine
  215. function DEBUGPXY ()
  216. {
  217.         rm mine.tmp>/dev/null 2>&1
  218.         for(( i=1; i<=$Y; i++ ))
  219.         do
  220.                 for(( j=1; j<=$X; j++))
  221.                 do
  222.                         $ECHO "$(XYFormat $j $i)">>mine.tmp
  223.                 done
  224.                 $ECHO "\n">>mine.tmp
  225.         done

  226.         return $OK
  227. }

  228. #move cur
  229. #usage:CurMov [UP|DOWN|LEFT|RIGHT]
  230. function CurMov ()
  231. {
  232.         local direction=$1 Xmin=1 Ymin=1 Xmax=$X Ymax=$Y

  233.         OCurX=$CurX
  234.         OCurY=$CurY

  235.         case $direction        in
  236.         "UP")        if [[ $CurY -gt $Ymin ]];then (( CurY-- ));fi
  237.         ;;
  238.         "DOWN")        if [[ $CurY -lt $Ymax ]];then (( CurY++ ));fi
  239.         ;;
  240.         "LEFT") if [[ $CurX -gt $Xmin ]];then (( CurX-- ));fi
  241.         ;;
  242.         "RIGHT")if [[ $CurX -lt $Xmax ]];then (( CurX++ ));fi
  243.         ;;
  244.         esac

  245.         if [[ $CurX != $OCurX || $CurY != $OCurY ]]
  246.         then DrawPoint $CurX $CurY CUR
  247.         fi

  248.         return $OK
  249. }

  250. #display point
  251. #include cur,flag,mine,shadow,nul,tip [1-8]
  252. function DrawPoint ()
  253. {
  254.         local TCurX=$(( $1 * 2 )) TCurY=$(( $2 + 1 )) Type=$3
  255.         local TOCurX=$(( OCurX * 2 )) TOCurY=$(( OCurY + 1 ))
  256.         local colr=0 osign=0 sign=0
  257.        
  258.         case $Type in
  259.         "CUR")
  260.                 case $(XYFormat $OCurX $OCurY) in
  261.                 F)        colr=$PURPLE;osign=$FLAG;;
  262.                 N)        colr=$NULL;osign=$NUL;;
  263.                 [1-8])        colr=$ORANGE;osign=$(XYFormat $OCurX $OCurY);;
  264.                 [SM])        colr=$SBLUE;osign=$SHADOW;;
  265.                 esac

  266.                 case $(XYFormat $CurX $CurY) in
  267.                 F)      sign=$FLAG;;
  268.                 N)      sign=$NUL;;
  269.                 [1-8])        sign=$(XYFormat $CurX $CurY);;
  270.                 [SM])     sign=$SHADOW;;
  271.                 esac

  272.                 $ECHO "${ESC}${colr}m${ESC}${TOCurY};${TOCurX}H${osign}${ESC}${NULL}m"
  273.                 $ECHO "${ESC}${REV};${FLASH};${ORANGE}m${ESC}${TCurY};${TCurX}H${sign}${ESC}${NULL}m"
  274.         ;;
  275.         "SHADOW")
  276.                 $ECHO "${ESC}${SBLUE}m${ESC}${TCurY};${TCurX}H${SHADOW}${ESC}${NULL}m"
  277.         ;;
  278.         "MINE")
  279.                 $ECHO "${ESC}${REV};${RED}m${ESC}${TCurY};${TCurX}H${MINE}${ESC}${NULL}m"
  280.         ;;
  281.         "FLAG")
  282.                 $ECHO "${ESC}${TCurY};${TCurX}H${ESC}${PURPLE}m${FLAG}${ESC}${NULL}m"
  283.         ;;
  284.         [1-8])
  285.                 $ECHO "${ESC}${TCurY};${TCurX}H${ESC}${ORANGE}m${Type}${ESC}${NULL}m"
  286.         ;;
  287.         "NUL")
  288.                 $ECHO "${ESC}${TCurY};${TCurX}H${NUL}"
  289.         esac       

  290.         return $OK
  291. }

  292. #check xy
  293. function Loop ()
  294. {
  295.         local XYTmp="$1 $2"

  296.         for (( i=0; i<MXYp; i++ ))
  297.         do
  298.                 if [[ "$XYTmp" == "${MXY[i]}" ]]
  299.                 then $ECHO 1
  300.                 fi
  301.         done

  302.         return $OK
  303. }

  304. #count around mine
  305. #A B C
  306. #D X E
  307. #F G H
  308. #return mine's number
  309. function CountM ()
  310. {
  311.         local Xmin=1 Ymin=1 Xmax=$X Ymax=$Y minecount=0 n=0
  312. #A
  313.         if [[ ( $CurX -gt $Xmin ) && ( $CurY -gt $Ymin ) ]]
  314.         then
  315.                 n=$( Loop $((CurX-1)) $((CurY-1)) )
  316.                 (( minecount += n ))
  317.                 n=0
  318.         fi
  319. #B
  320.         if [[ $CurY -gt $Ymin ]]
  321.         then
  322.                 n=$( Loop $CurX $((CurY-1)) )
  323.                 (( minecount += n ))
  324.                 n=0
  325.         fi
  326. #C
  327.         if [[ ( $CurX -lt $Xmax ) && ( $CurY -gt $Ymin ) ]]
  328.         then
  329.                 n=$( Loop $((CurX+1)) $((CurY-1)) )
  330.                 (( minecount += n ))
  331.                 n=0
  332.         fi
  333. #D
  334.         if [[ $CurX -gt $Xmin ]]
  335.         then
  336.                 n=$( Loop $((CurX-1)) $CurY )
  337.                 (( minecount += n ))
  338.                 n=0
  339.         fi
  340. #E
  341.         if [[ $CurX -lt $Xmax ]]
  342.         then
  343.                 n=$( Loop $((CurX+1)) $CurY )
  344.                 (( minecount += n ))
  345.                 n=0
  346.         fi
  347. #F
  348.         if [[ ( $CurX -gt $Xmin ) && ( $CurY -lt $Ymax ) ]]
  349.         then
  350.                 n=$( Loop $((CurX-1)) $((CurY+1)) )
  351.                 (( minecount += n ))
  352.                 n=0
  353.         fi
  354. #G
  355.         if [[ $CurY -lt $Ymax ]]
  356.         then
  357.                 n=$( Loop $CurX $((CurY+1)) )
  358.                 (( minecount += n ))
  359.                 n=0
  360.         fi
  361. #H
  362.         if [[ ( $CurX -lt $Xmax ) && ( $CurY -lt $Ymax ) ]]
  363.         then
  364.                 n=$( Loop $((CurX+1)) $((CurY+1)) )
  365.                 (( minecount += n ))
  366.                 n=0
  367.         fi

  368.         return $minecount
  369. }

  370. #dig
  371. #if mine ,gameover
  372. #else tip around mine's number
  373. function Dig ()
  374. {
  375.         local key minenum=0

  376.         case $(XYFormat $CurX $CurY) in
  377.         M)
  378.                 DrawPoint $CurX $CurY MINE
  379.                 read -s -n 1 key
  380.                 GameOver "Game Over"
  381.         ;;
  382.         S)
  383.                 CountM
  384.                 minenum=$?
  385.                 if [[ $minenum -eq $NULL ]]
  386.                 then
  387.                         XYFormat $CurX $CurY N
  388.                         DrawPoint $CurX $CurY NUL
  389.                 else
  390.                         XYFormat $CurX $CurY $minenum
  391.                         DrawPoint $CurX $CurY $minenum
  392.                 fi
  393.        
  394.                 (( SCount-- ))
  395.                 if [[ $SCount -eq $MCount ]]
  396.                 then GameOver "Well Done"
  397.                 fi       
  398.         ;;
  399.         esac
  400.         DrawPoint $CurX $CurY CUR

  401.         return $OK
  402. }

  403. #draw flag's number
  404. function DrawFCount ()
  405. {
  406.         $ECHO "${ESC}22;34H${ESC};${PURPLE}mFLAG=${FCount}  ${ESC}${NULL}m"
  407. }

  408. #sign mine
  409. function Flag ()
  410. {
  411.         local XYTmp="$CurX $CurY";stat=$FALSE

  412.         case $(XYFormat $CurX $CurY) in
  413.         F)
  414.                 for (( i=1; i<MXYp; i++ ))
  415.                 do
  416.                         if [[ "${MXY[i]}" == "$XYTmp" ]]
  417.                         then XYFormat $CurX $CurY M;stat=$OK;break
  418.                         fi
  419.                 done
  420.                 if [[ $stat == $FALSE ]]
  421.                 then XYFormat $CurX $CurY S
  422.                 fi

  423.                 DrawPoint $CurX $CurY SHADOW
  424.                 (( FCount++ ))
  425.                 DrawFCount
  426.         ;;
  427.         [SM])       
  428.                 if [[ $FCount -eq $NULL ]]
  429.                 then return $FALSE
  430.                 fi

  431.                 DrawPoint $CurX $CurY FLAG
  432.                 XYFormat $CurX $CurY F
  433.                 (( FCount-- ))
  434.                 DrawFCount
  435.         ;;
  436.         esac
  437.         DrawPoint $CurX $CurY CUR

  438.         return $OK
  439. }

  440. function GameOver ()
  441. {
  442.         local key msgtitle=$1

  443.         PMsg "$msgtitle" "Do you want replay?<y/n>" "Thank You"
  444.         while read -s -n 1 key
  445.         do
  446.                 case $key in
  447.                 [yY])        exec $(dirname $0)/$(basename $0);;
  448.                 [nN])        GameExit;;
  449.                 *)        continue;;
  450.                 esac
  451.         done

  452.         return $OK       
  453. }
  454.        
  455. #main
  456. #drawscreen and control
  457. function Main ()
  458. {
  459.         local key

  460.         XYInit
  461.         XYRand
  462. ############################
  463. # if you enable DEBUGPXY,
  464. #you can know where is mine
  465. #        DEBUGPXY  #delete this line's #
  466. #then cat ./mine.tmp
  467. ############################       

  468.         DrawPoint $CurX $CurY CUR
  469.         DrawFCount       

  470.         while read -s -n 1 key
  471.         do
  472.                 case $key in
  473.                 [wW])        CurMov UP;;
  474.                 [sS])        CurMov DOWN;;
  475.                 [aA])        CurMov LEFT;;
  476.                 [dD])        CurMov RIGHT;;
  477.                 [jJ])        Dig;;
  478.                 [fF])        Flag;;
  479.                 [nN])        exec $(dirname $0)/$(basename $0);;
  480.                 [xX])        GameExit;;
  481.                 esac
  482.         done

  483.         return $OK
  484. }
  485. #---------------Main-----------------

  486. SttyInit
  487. Menu #X Y MCount FCount SCount OK!
  488. DrawInit
  489. Main

复制代码

论坛徽章:
0
发表于 2005-10-26 11:34 |显示全部楼层

shell游戏:扫雷

很久没摸SHELL,继续shell游戏系列当练手,感觉技术没什么新颖,就是在程序风格上有点进步.

现在回头看
shell游戏:老虎机
shell游戏:贪吃蛇
都感觉风格写得很糟糕

也许当第4个shell游戏出来后,又会觉得这个很糟糕了,呵呵

论坛徽章:
0
发表于 2005-10-26 11:44 |显示全部楼层

shell游戏:扫雷

强阿
可是怎么不能挖雷呢???
空格都快按爆了

论坛徽章:
0
发表于 2005-10-26 14:07 |显示全部楼层

shell游戏:扫雷

j挖雷,哥们没看帮助?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
发表于 2005-10-26 14:38 |显示全部楼层

shell游戏:扫雷

MR.bitbull---A shell master !!!

论坛徽章:
0
发表于 2005-10-26 14:47 |显示全部楼层

shell游戏:扫雷

烈火兄老给我戴高帽,惭愧...........

这段上网很不方便,所以很少来,给各位老朋友问安了

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
发表于 2005-10-26 14:55 |显示全部楼层

shell游戏:扫雷

原帖由 "bitbull" 发表:
烈火兄老给我戴高帽,惭愧...........

这段上网很不方便,所以很少来,给各位老朋友问安了

老兄的三个shell game:
shell游戏:老虎机
shell游戏:贪吃蛇
shell游戏:扫雷

堪称shell之经典呀~~~  

论坛徽章:
0
发表于 2005-10-26 14:57 |显示全部楼层

shell游戏:扫雷

把shell玩到这份上,,,,,佩服

论坛徽章:
0
发表于 2005-10-26 16:16 |显示全部楼层

shell游戏:扫雷

老兄的想法,毅力,实力实在是高,把shell写到这程度,作为一个shell的fans,我佩服的一塌糊涂。。。顺手收藏先。。。

论坛徽章:
0
发表于 2005-10-26 16:20 |显示全部楼层

shell游戏:扫雷

高人!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP