• 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="33["

    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 " ">>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="33["

    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 " ">>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) |
    给主人留下些什么吧!~~
    评论热议
  • 相关阅读:
    分页类
    验证码扭曲类
    model 概念(笔记)
    php单例模式
    php 无限极分类查找家谱树
    数组的合并
    无限极分类之查找子孙树
    android xml中的xliff属性
    android 悬浮覆盖状态栏的相关建议
    【jzoj】20190323比赛总结
  • 原文地址:https://www.cnblogs.com/ztguang/p/12647805.html
Copyright © 2020-2023  润新知