shell 游戏

#!/bin/bash   

#shell游戏:贪吃蛇
#
#期待各位帮忙测试,如有BUG,请及时告知,谢谢
#转载请保持版权声明完整,十分感谢
#
#下载代码:
#http://bitbull.cn/works/snake
#
#六关卡屏幕截图:
#http://bitbull.cn/pic/blog/2005072801.jpg
#http://bitbull.cn/pic/blog/2005072802.jpg
#http://bitbull.cn/pic/blog/2005072803.jpg
#http://bitbull.cn/pic/blog/2005072804.jpg
#http://bitbull.cn/pic/blog/2005072805.jpg
#http://bitbull.cn/pic/blog/2005072806.jpg
#
#[color=red]由于程序运行过程中会产生己个临时文件,
#请先确定/tmp目录可写可读..如果权限不够或无此目录,请把游戏
#cpath="/tmp/snake_ctrl_pid.tmp"
#dpath="/tmp/snake_disply_pid.tmp"
#vartmp="/tmp/snake_var_tmpfile.tmp"
#改到有权限读写的目录[/color]
#
#测试环境:
#RHEL4 AS
#bash 3.0
#80x24终端
#
#usage:
#w上 s下 a左 d右
#p暂停
#n新游戏
#q退出
#
#规则:
#吃完屏幕上所有的红色果实即可过关,共有6个关卡.碰到任何障碍蛇都将死亡,玩家有4次生命.
#
#代码:

 

#-------------CopyRight-------------
#   Name:Snake
#   Version Number:1.00
#   Type:game
#   Language:bash shell
#   Date:2005-07-28
#   Author:BitBull
#   Email:wengjianyi@tom.com
#------------Environment------------
#   Terminal: column 80 line 24
#   Linux 2.6.9 i686
#   GNU Bash 3.00.15
#-----------------------------------


#--------------variable--------------
#game variable
level=1
score=0
life=3
length=8
runtime=0.15
fruitspare=8

#game kernel variable
x=2 #init snake x=2 y=2
y=2
direction=0
shead=1 #snake's head in snake[]
stail=1 #snake's tail in snake[]
mappoint=1 #point exactmap[] bottom
state=on #snake run or stop
run=off  #if run=on,snake shadow is working
displaypid=""
controlpid=""

#game temp file;if your system's /tmp unwrite or unread, you can change to home
cpath="/tmp/snake_ctrl_pid.tmp"
dpath="/tmp/snake_disply_pid.tmp"
vartmp="/tmp/snake_var_tmpfile.tmp"

#rename kill sign
pause=23
newgame=24
gameover=25
gameexit=26
up=27
down=28
left=29
right=22
#---------------array---------------                                          
#init exactmap
exactmap=()

#map format: y x HowLong "-- or |" ( 1=| 2=-- )
map1=("6 14 6 2" "6 50 6 2" "14 14 6 2" "14 50 6 2")
map2=("2 16 10 1" "2 48 10 1" "7 32 10 1" "7 64 10 1")
map3=("4 16 24 2" "10 16 24 2" "16 16 24 2" "4 16 11 1")
map4=("10 4 34 2" "4 20 12 1" "4 40 12 1" "4 60 12 1")
map5=("5 10 29 2" "15 10 29 2" "5 16 7 1" "7 60 6 1" )
map6=("8 4 35 2" "2 50 5 1" "10 4 36 2" "11 30 5 1" )

#where is fruit? format:y x
fruit1=("14 10" "13 56" "2 40" "3 8" "17 50" "18 76" "14 30" "6 66")
fruit2=("4 14" "2 40" "14 48" "12 68" "9 30" "18 6" "3 76" "18 78")
fruit3=("7 14" "18 4" "15 40" "11 24" "5 18" "9 56" "3 76" "17 64")
fruit4=("11 10" "11 62" "9 38" "9 72" "6 58" "14 26" "17 58" "3 6")
fruit5=("6 14" "16 14" "3 40" "6 22" "14 58" "12 34" "8 50" "9 62")
fruit6=("2 52" "7 40" "7 60" "4 70" "11 28" "11 32" "15 22" "17 78" )

#--------------function--------------
#draw screen
function Draw_line () {

 local i=1

 while [ "$i" -le "80" ]
 do
  echo -ne "/33[${1};${i}H*"
  (( i++ ))
 done
}
function Draw_row () {

 local i=2

 while [ "$i" -le "22" ]
 do
  echo -ne "/33[${i};${1}H*"
  (( i++ ))
 done
}
function Draw_help () {

 echo -ne "/33[7;31m/33[24;1HPlay:w s a d Pause:p Newgame:n Quit:q      -- CopyRight -- 2005-07-28 BitBull --/33[0m" 

function Screen () {

        echo -ne "/33[37;44m"
        Draw_line 1
        Draw_line 19
        Draw_line 23
        Draw_row 1
        Draw_row 80
        echo -ne "/33[0m"
        Draw_help
}

#init
function Init () {

        stty_save=$(stty -g) #backup stty
        clear
        trap "Game_exit;" 2 15
        stty -echo

        echo -ne "/33[?25l"  #hidden cursor

#exit
function Game_exit () {

    kill -9 $displaypid>/dev/null 2>&1 #kill display function

 #restore
 stty $stty_save
 stty echo
 clear
 trap 2 15
 echo -ne "/33[?25h/33[0;0H/33[0m"
 rm -f $cpath $dpath >/dev/null 2>&1

 exit 0
}

#draw level score life SnakeLong
function Draw_ls () {

        echo -ne "/33[31m"
        echo -ne "/33[21;10HLevel=$level         Score=$score        /
 Life=$life        Snake=$length"
        echo -ne "/33[0m"
}

#output info to player
function Info () {
  
 title="$1"
 content="$2"
 greeting="$3"
 
        printf "/33[31m"
        printf "/33[11;20H ------------------------------------------- "
        printf "/33[12;20H|         ======>$title<======           |"
        printf "/33[13;20H|         $content          |"
        printf "/33[14;20H|         ======>$greeting<======           |"
        printf "/33[15;20H ------------------------------------------- "
        printf "/33[0m"

}

#square:draw square in screen.you can define X Y COLOR LETTER
function Square () {

 local color=$1;line=$2;row=$3;pic=$4

 echo -ne "/33[34444;${color}m/33[${line};${row}H${pic}/33[0m"
}

#show fruit
function Show_fruits () {
 
 local red=45;fruitxy=""
 
 for (( i = 0; i < 8; i++ ))
 do
  fruitxy="$(printf "/${fruit%s[$i]}" $level)"
  eval Square $red $fruitxy '@@'
 done
}

#exact map:calculate mapXY into exactmap[]
function Exact_map () {

 local mapin xtmp ytmp long line_row
 
 for (( i = 0; i < 4; i++ ))
 do
  mapin="$(printf "/${map%s[$i]}" $level)"
  xtmp=$(eval echo $mapin|cut -d" " -f2)
                ytmp=$(eval echo $mapin|cut -d" " -f1)
                long=$(eval echo $mapin|cut -d" " -f3)
                line_row=$(eval echo $mapin|cut -d" " -f4)

  exactmap[$mappoint]="$ytmp $xtmp"
  (( mappoint++ ))

  #judge mapline | or --
  if [[ "$line_row" == "1" ]]
  then
   for (( j = 0; j <= long; j++ ))
   do
    (( ytmp++ ))
    exactmap[$mappoint]="$ytmp $xtmp"
    (( mappoint++ ))
   done
  else
   for (( k = 0; k <= long; k++ ))
   do
    (( xtmp += 2 ))
    exactmap[$mappoint]="$ytmp $xtmp"
    (( mappoint++ ))
   done
  fi
 done
}


#show map
function Show_map () {

 local mapxy="";blue=46

 Exact_map

 for (( i = 1; i < mappoint; i++ ))
 do
  eval Square $blue ${exactmap[$i]} '[]'
 done   
}

#test snake is ok ?
function Test_snake () {

#snake self
 for (( i = 1; i <= length; i++ ))
 do
  if [[ "${snake[$i]}" == "$y $x" ]]
  then Dead
  fi
 done
#borderline
 if [[ $x -lt 2 || $x -gt 79 || $y -lt 2 || $y -gt 18 ]]
 then Dead
 fi
#map line
 for (( i = 0; i < mappoint; i++ ))
 do
  if [[ "${exactmap[$i]}" == "$y $x" ]]
  then Dead
  fi
 done
}

#eat
function Eat () {

 local fruitxy="";xyvalue="";nowarray=""

 for (( i = 0; i < 8; i++ ))
 do
  fruitxy="$(printf "/${fruit%s[$i]}" $level)"
  xyvalue="$(eval echo $fruitxy)"

  if [[ "$xyvalue" = "$y $x" ]]
  then
   nowarray="$(printf "fruit%s[$i]=" $level)"
   eval $nowarray""
   (( score++ ))
   (( fruitspare-- ))
   Draw_ls
  fi
 done
 if [[ $fruitspare == 0 ]]
 then Next_level
 fi
}

#if snake dead
function Dead () {

 state=off

 if (( "$life" == "0" ))
 then
  kill -$gameover $controlpid
 else
  (( life-- ))
  Info "SnakeDead" "OH!shit!You are a idiot!" "F**k  You"
  sleep 1  
  New_game
 fi
}

#next level
function Next_level () {

 (( level++ ))
 (( length += 6 ))
 if [[ $level -gt 6 ]]
 then
  Info "Well Done" "   WOW!Congratulation!  " "Thank You"
  sleep 4
  kill -$gameexit $controlpid
 else
  Info "Well Done" "Level Update! Go Level $level" ".Loading."
  sleep 3
  New_game
 fi
}

#newgame
function New_game () {
 
 kill -9 $displaypid >/dev/null 2>&1

 if [[ "$1" == "over" ]]
 then
  exec $0
 else
  echo "$level $score $life $length $runtime" > $vartmp
  exec $0 display
 fi
}

#game over
function Game_over () {

 local y_n

 Info "Game Over" "Do you want replay?<y/n>" "Thank You"

 while read -s -n 1 y_n
 do
  case $y_n in
  [yY] ) New_game over
  ;;
  [nN] ) Game_exit
  ;;
  * ) continue
  ;;
  esac
 done
}


#main
function Main () {
 
 local green=42;count=0
 
 case $direction in
 "$up" ) (( y-- ))
 ;;
 "$down" ) (( y++ ))
 ;;
 "$left" ) (( x -= 2 ))
 ;;
 "$right" ) (( x += 2 ))
 ;;
 *):
 ;;
 esac 
 Test_snake
 Eat

 #go go go
 Square $green $y $x /#/#
 snake[$shead]="$y $x"
 (( shead++ ))
 
 if [[ "$shead" == "$length" ]]
 then
  shead=1
  run=on #snake shadow run
 fi
 
 #snake shadow,it can erase snake's tail,otherwise,snake will very long!
 if [[ "$run" == "on" ]]
 then
  Square 0 ${snake[$stail]} "  "
  (( stail++ ))
  if [[ "$stail" == "$length" ]]
  then
   stail=1
  fi
 fi
}

#state change:off=snake stop.on=snake run
function State_change () {
 if [[ $state == "on" ]]
 then state=off
 else state=on
 fi
}
#display
function Display () {

 trap "State_change;" $pause
 trap "direction=$up;" $up
 trap "direction=$down;" $down
 trap "direction=$left;" $left
 trap "direction=$right;" $right

 echo $$ > $dpath
 read controlpid < $cpath
 if [[ -e $vartmp ]]
 then
  read level score life length runtime< $vartmp
  rm -f $vartmp
 fi

 #drow all
 Init                                                             
 Screen
 Draw_ls
 Show_fruits
 Show_map
 Main
 #game main loop
 while :
 do
  if [[ ( "$state" == "on" ) && ( "$direction" != "0" ) ]]
  then
   Main
   sleep $runtime
  fi
 done
}


#control
function Control () {

 local sign=""

 echo $$ > $cpath
 
 trap "Game_over;" $gameover
 trap "Game_exit;" $gameexit

 while read -s -n 1 key
 do
  
  case $key in
  [wW]) sign="$up"
  ;;
  [sS]) sign="$down"
  ;;
  [aA]) sign="$left"
  ;;
  [dD]) sign="$right"
  ;;
  [pP]) sign="$pause"
  ;;
  [nN]) New_game over
  ;;
  [qQ]) Game_exit
  ;;
  * ) continue 2
  ;;
  esac
  
  eval displaypid=$(cat $dpath)
  kill -$sign $displaypid

 done
}


#------------main----------------
if [[ "$1" == "display" ]]
then
 Display
 exit
else
 bash $0 display&
 Control
 exit
fi

 


##################################################################

##################################################################

##################################################################

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键进行标识,以避免误挖.挖开地图内所有非雷方块则获胜.

代码:

#!/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<<MENUEND
                       +++++++++++++++++++++++++++++
                       +        (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<X; i++ )) do $ECHO "|${ESC}${SBLUE}mX${ESC}${NULL}m";done )

 clear
 Help
 
 $ECHO "${ESC}1;1H+${DIline}+"
 for (( i=0; i<Y; 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<MXYp; i++ ))
 do
  if [[ "${MXY}" == "$XYTmp" ]]
  then return $FALSE
  fi
 done

 return $OK
}

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

 for(( i=0; i<MCount; 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="$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<MXYp; i++ ))
 do
  if [[ "$XYTmp" == "${MXY}" ]]
  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<MXYp; i++ ))
  do
   if [[ "${MXY}" == "$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?<y/n>" "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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值