shell游戏:扫雷

http://bbs.chinaunix.net/thread-634271-1-1.html

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:x

规则:
玩家可用方向键移动指针,按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<
  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

  152.         clear
  153.         Help
  154.        
  155.         $ECHO "${ESC}1;1H+${DIline}+"
  156.         for (( i=0; 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
  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
  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
  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
  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?" "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


++++++++++++++++++++++++++++++++++++++


#!/bin/bash
#-------------CopyRight-------------
#   Name:Mine Sweeping
#   Version Number:1.00
#   Type:game
#   Language:bash shell
#   Date:2005-10-26
#   Author:BitBull
#   Email:BitBull.cn(at)gmail.com
#------------Environment------------
#   Terminal: column 80 line 24
#   Linux 2.6.9 i686
#   GNU Bash 3.00.15
#-----------------------------------

#---------------Define--------------
ECHO="echo -ne"
ESC="\033["

OK=0
FALSE=1
#--------------Variable--------------
#ANSI ESC action
FLASH=5
REV=7

#color
NULL=0
BLACK=30
RED=31
GREEN=32
ORANGE=33
BLUE=34
PURPLE=35
SBLUE=36
GREY=37

#back color
BBLACK=40
BRED=41
BGREEN=42
BORANGE=43
BBLUE=44
BPURPLE=45
BSBLUE=46
BGREY=47

MINE='@'
FLAG='F'
NUL=' '
SHADOW='X'

X=0
Y=0
CurX=1 #cur's X
CurY=1 #cur's Y
OCurX=1 #old cur's X
OCurY=1 #old cur's Y
MCount=0 #count mine
FCount=0 #count flag
SCount=0 #count shadow
MXYp=0 #MXY Array's ptr
#---------------Array----------------

#if ${XY[]} == M { mine }
#if ${XY[]} == F { flag }
#if ${XY[]} == N { null }
#if ${XY[]} == S { shadow }
#if ${XY[]} == [1-8] { tip_num }
#${XY[]} init in XYInit(i)

MXY[0]=""

#--------------Function--------------

function SttyInit ()
{
        stty_save=$(stty -g) #backup stty

        clear
        trap "GameExit;" 2 15
        stty -echo

        $ECHO "${ESC}?25l" #hidden cursor
       
        return $OK
}

function GameExit ()
{
        stty $stty_save
        stty echo
        clear
        trap 2 15
        $ECHO "${ESC}?25h${ESC}0;0H${ESC}0m"

        exit $OK
}

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

        return $OK
}

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

        $ECHO "${ESC}${RED}m"
        $ECHO "${ESC}11;20H ------------------------------------------- "
        $ECHO "${ESC}12;20H|         ======>$title<======           |"
        $ECHO "${ESC}13;20H|         $content          |"
        $ECHO "${ESC}14;20H|         ======>$greeting<======           |"
        $ECHO "${ESC}15;20H ------------------------------------------- "
        $ECHO "${ESC}${NULL}m"

        return $OK
}

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

        $ECHO "${ESC}6;1H${ESC}${RED}m"
cat<                        +++++++++++++++++++++++++++++
                       +        (1) Easy           +
                       +        (2) Normal         +
                       +        (3) Hardly         +
                       +        (4) Exit           +
                       +++++++++++++++++++++++++++++
MENUEND
        $ECHO "${ESC}${NULL}m"

        while read -s -n 1 key
        do
                case $key in
                1) X=10;Y=10;MCount=10;FCount=10;SCount=100;break
                ;;
                2) X=20;Y=14;MCount=28;FCount=28;SCount=280;break
                ;;
                3) X=36;Y=18;MCount=65;FCount=65;SCount=648;break
                ;;
                4) GameExit
                ;;
                esac
        done

        return $OK
}       

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

        if [[ $# -eq 3 ]]
        then XY[$XTmp+$X*($YTmp-1)]=$3
        else echo ${XY[$XTmp+$X*($YTmp-1)]}
        fi       
       
        return $OK
}

function DrawInit ()
{
        local DIline DIline2

        DIline=$( for (( i=1; i<$((X*2)); i++ )) do $ECHO '-';done )
        DIline2=$( for (( i=0; i
        clear
        Help
       
        $ECHO "${ESC}1;1H+${DIline}+"
        for (( i=0; i         do
                $ECHO "${ESC}$((i+2));1H${DIline2}|"
        done
        $ECHO "${ESC}$((Y+2));1H+${DIline}+"

        return $OK
}

#${XY[*]}=S
function XYInit ()
{
        for (( i=1; i<=$X; i++ ))
        do
                for (( j=1; j<=$Y; j++ ))
                do
                        XYFormat $i $j S
                done
        done
        return $OK
}

#check X Y
function CheckXY ()
{
        local XYTmp="$1 $2"

        for(( i=0; i         do
                if [[ "${MXY[i]}" == "$XYTmp" ]]
                then return $FALSE
                fi
        done

        return $OK
}

#RANDOM mine's X Y
function XYRand ()
{
        local XTmp YTmp

        for(( i=0; i         do
                while :
                do
                        XTmp=$(( RANDOM % ( X - 1 ) + 1 ))
                        YTmp=$(( RANDOM % ( Y - 1 ) + 1 ))
                        CheckXY $XTmp $YTmp

                        if [[ "$?" == "$OK" ]]
                        then
                                XYFormat $XTmp $YTmp M
                                MXY[i]="$XTmp $YTmp"
                                (( ++MXYp ))
                                break
                        else continue
                        fi
                done
        done
       
        return $OK
}

#DEBUG
# print ${XY[*]} into ./mine.tmp
#you can read mine.tmp to know where is mine,xixi~~:)
#M is mine
function DEBUGPXY ()
{
        rm mine.tmp>/dev/null 2>&1
        for(( i=1; i<=$Y; i++ ))
        do
                for(( j=1; j<=$X; j++))
                do
                        $ECHO "$(XYFormat $j $i)">>mine.tmp
                done
                $ECHO "\n">>mine.tmp
        done

        return $OK
}

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

        OCurX=$CurX
        OCurY=$CurY

        case $direction        in
        "UP")        if [[ $CurY -gt $Ymin ]];then (( CurY-- ));fi
        ;;
        "DOWN")        if [[ $CurY -lt $Ymax ]];then (( CurY++ ));fi
        ;;
        "LEFT") if [[ $CurX -gt $Xmin ]];then (( CurX-- ));fi
        ;;
        "RIGHT")if [[ $CurX -lt $Xmax ]];then (( CurX++ ));fi
        ;;
        esac

        if [[ $CurX != $OCurX || $CurY != $OCurY ]]
        then DrawPoint $CurX $CurY CUR
        fi

        return $OK
}

#display point
#include cur,flag,mine,shadow,nul,tip [1-8]
function DrawPoint ()
{
        local TCurX=$(( $1 * 2 )) TCurY=$(( $2 + 1 )) Type=$3
        local TOCurX=$(( OCurX * 2 )) TOCurY=$(( OCurY + 1 ))
        local colr=0 osign=0 sign=0
       
        case $Type in
        "CUR")
                case $(XYFormat $OCurX $OCurY) in
                F)        colr=$PURPLE;osign=$FLAG;;
                N)        colr=$NULL;osign=$NUL;;
                [1-8])        colr=$ORANGE;osign=$(XYFormat $OCurX $OCurY);;
                [SM])        colr=$SBLUE;osign=$SHADOW;;
                esac

                case $(XYFormat $CurX $CurY) in
                F)      sign=$FLAG;;
                N)      sign=$NUL;;
                [1-8])        sign=$(XYFormat $CurX $CurY);;
                [SM])     sign=$SHADOW;;
                esac

                $ECHO "${ESC}${colr}m${ESC}${TOCurY};${TOCurX}H${osign}${ESC}${NULL}m"
                $ECHO "${ESC}${REV};${FLASH};${ORANGE}m${ESC}${TCurY};${TCurX}H${sign}${ESC}${NULL}m"
        ;;
        "SHADOW")
                $ECHO "${ESC}${SBLUE}m${ESC}${TCurY};${TCurX}H${SHADOW}${ESC}${NULL}m"
        ;;
        "MINE")
                $ECHO "${ESC}${REV};${RED}m${ESC}${TCurY};${TCurX}H${MINE}${ESC}${NULL}m"
        ;;
        "FLAG")
                $ECHO "${ESC}${TCurY};${TCurX}H${ESC}${PURPLE}m${FLAG}${ESC}${NULL}m"
        ;;
        [1-8])
                $ECHO "${ESC}${TCurY};${TCurX}H${ESC}${ORANGE}m${Type}${ESC}${NULL}m"
        ;;
        "NUL")
                $ECHO "${ESC}${TCurY};${TCurX}H${NUL}"
        esac       

        return $OK
}

#check xy
function Loop ()
{
        local XYTmp="$1 $2"

        for (( i=0; i         do
                if [[ "$XYTmp" == "${MXY[i]}" ]]
                then $ECHO 1
                fi
        done

        return $OK
}

#count around mine
#A B C
#D X E
#F G H
#return mine's number
function CountM ()
{
        local Xmin=1 Ymin=1 Xmax=$X Ymax=$Y minecount=0 n=0
#A
        if [[ ( $CurX -gt $Xmin ) && ( $CurY -gt $Ymin ) ]]
        then
                n=$( Loop $((CurX-1)) $((CurY-1)) )
                (( minecount += n ))
                n=0
        fi
#B
        if [[ $CurY -gt $Ymin ]]
        then
                n=$( Loop $CurX $((CurY-1)) )
                (( minecount += n ))
                n=0
        fi
#C
        if [[ ( $CurX -lt $Xmax ) && ( $CurY -gt $Ymin ) ]]
        then
                n=$( Loop $((CurX+1)) $((CurY-1)) )
                (( minecount += n ))
                n=0
        fi
#D
        if [[ $CurX -gt $Xmin ]]
        then
                n=$( Loop $((CurX-1)) $CurY )
                (( minecount += n ))
                n=0
        fi
#E
        if [[ $CurX -lt $Xmax ]]
        then
                n=$( Loop $((CurX+1)) $CurY )
                (( minecount += n ))
                n=0
        fi
#F
        if [[ ( $CurX -gt $Xmin ) && ( $CurY -lt $Ymax ) ]]
        then
                n=$( Loop $((CurX-1)) $((CurY+1)) )
                (( minecount += n ))
                n=0
        fi
#G
        if [[ $CurY -lt $Ymax ]]
        then
                n=$( Loop $CurX $((CurY+1)) )
                (( minecount += n ))
                n=0
        fi
#H
        if [[ ( $CurX -lt $Xmax ) && ( $CurY -lt $Ymax ) ]]
        then
                n=$( Loop $((CurX+1)) $((CurY+1)) )
                (( minecount += n ))
                n=0
        fi

        return $minecount
}

#dig
#if mine ,gameover
#else tip around mine's number
function Dig ()
{
        local key minenum=0

        case $(XYFormat $CurX $CurY) in
        M)
                DrawPoint $CurX $CurY MINE
                read -s -n 1 key
                GameOver "Game Over"
        ;;
        S)
                CountM
                minenum=$?
                if [[ $minenum -eq $NULL ]]
                then
                        XYFormat $CurX $CurY N
                        DrawPoint $CurX $CurY NUL
                else
                        XYFormat $CurX $CurY $minenum
                        DrawPoint $CurX $CurY $minenum
                fi
       
                (( SCount-- ))
                if [[ $SCount -eq $MCount ]]
                then GameOver "Well Done"
                fi       
        ;;
        esac
        DrawPoint $CurX $CurY CUR

        return $OK
}

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

#sign mine
function Flag ()
{
        local XYTmp="$CurX $CurY";stat=$FALSE

        case $(XYFormat $CurX $CurY) in
        F)
                for (( i=1; i                 do
                        if [[ "${MXY[i]}" == "$XYTmp" ]]
                        then XYFormat $CurX $CurY M;stat=$OK;break
                        fi
                done
                if [[ $stat == $FALSE ]]
                then XYFormat $CurX $CurY S
                fi

                DrawPoint $CurX $CurY SHADOW
                (( FCount++ ))
                DrawFCount
        ;;
        [SM])       
                if [[ $FCount -eq $NULL ]]
                then return $FALSE
                fi

                DrawPoint $CurX $CurY FLAG
                XYFormat $CurX $CurY F
                (( FCount-- ))
                DrawFCount
        ;;
        esac
        DrawPoint $CurX $CurY CUR

        return $OK
}

function GameOver ()
{
        local key msgtitle=$1

        PMsg "$msgtitle" "Do you want replay?" "Thank You"
        while read -s -n 1 key
        do
                case $key in
                [yY])        exec $(dirname $0)/$(basename $0);;
                [nN])        GameExit;;
                *)        continue;;
                esac
        done

        return $OK       
}
       
#main
#drawscreen and control
function Main ()
{
        local key

        XYInit
        XYRand
############################
# if you enable DEBUGPXY,
#you can know where is mine
#        DEBUGPXY  #delete this line's #
#then cat ./mine.tmp
############################       

        DrawPoint $CurX $CurY CUR
        DrawFCount       

        while read -s -n 1 key
        do
                case $key in
                [wW])        CurMov UP;;
                [sS])        CurMov DOWN;;
                [aA])        CurMov LEFT;;
                [dD])        CurMov RIGHT;;
                [jJ])        Dig;;
                [fF])        Flag;;
                [nN])        exec $(dirname $0)/$(basename $0);;
                [xX])        GameExit;;
                esac
        done

        return $OK
}
#---------------Main-----------------

SttyInit
Menu #X Y MCount FCount SCount OK!
DrawInit
Main
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(512) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~
评论热议
posted @ 2016-03-30 10:02  张同光  阅读(110)  评论(0编辑  收藏  举报