fork download
  1. #!/bin/bash
  2. MAX_H=8
  3. MAX_H_1=$(( MAX_H -1 ))
  4. MAX_W=8
  5. MAX_W_1=$(( MAX_W -1 ))
  6. TOTAL=$(( MAX_H * MAX_W ))
  7. res=$TOTAL
  8. MINUS_NUM=10
  9. cur_x=0
  10. cur_y=0
  11. map=( m m m m m m m m
  12. m m 0 0 0 0 0 0
  13. 0 0 0 0 0 0 0 0
  14. 0 0 0 0 0 0 0 0
  15. 0 0 0 0 0 0 0 0
  16. 0 0 0 0 0 0 0 0
  17. 0 0 0 0 0 0 0 0
  18. 0 0 0 0 0 0 0 0)
  19.  
  20. map2=( u u u u u u u u
  21. u u u u u u u u
  22. u u u u u u u u
  23. u u u u u u u u
  24. u u u u u u u u
  25. u u u u u u u u
  26. u u u u u u u u
  27. u u u u u u u u)
  28. draw(){
  29. tput cup $(($MAX_H+1)) 0
  30. for(( i=0; i<TOTAL; i+=MAX_W ))
  31. do
  32. printf "%s %s %s %s %s %s %s %s\n" "${map[@]:$i:8}"
  33. done
  34. }
  35. draw2(){
  36. local c=$(($cur_y * MAX_W + $cur_x))
  37. tput cup 0 0
  38. for(( i=0; i<TOTAL; i+=MAX_W ))
  39. do
  40. printf "%s %s %s %s %s %s %s %s\n" "${map2[@]:$i:8}"
  41. done
  42. tput cup $cur_y $(($cur_x<<1))
  43. echo -ne "\033[1;47m${map2[$c]}\033[m"
  44. }
  45. random(){
  46. local tmp i j
  47. for (( i=0; i<MINUS_NUM; i++))
  48. do
  49. (( j = $RANDOM % TOTAL))
  50. tmp=${map[$i]}
  51. map[$i]=${map[$j]}
  52. map[$j]=$tmp
  53. done
  54. }
  55. modify(){
  56. local i j c u d l r ul ur dl dr
  57. for (( i=0; i<MAX_W; i++))
  58. do
  59. for (( j=0; j<MAX_H; j++))
  60. do
  61. c=$((j * MAX_W + i))
  62.  
  63. if (( j != 0 )) ; then
  64. u=$((c - MAX_W))
  65. (( i != 0 )) && ul=$((u - 1 )) || ul=
  66. (( i < MAX_W_1 )) && ur=$((u + 1 )) || ur=
  67. else u= ul= ur=
  68. fi
  69. if (( j < MAX_H_1 )) ; then
  70. d=$((c + MAX_W))
  71. (( i != 0 )) && dl=$((d - 1 )) || ul=
  72. (( i < MAX_W_1 )) && dr=$((d + 1 )) || ur=
  73. else d= dl= dr=
  74. fi
  75. (( i != 0 )) && l=$((c - 1 )) || l=
  76. (( i < MAX_W_1 )) && r=$((c + 1 )) || r=
  77.  
  78.  
  79. if [ ${map[$c]} = m ] ; then
  80. [ -n "$u" ] && [[ "${map[$u]}" =~ [0-8] ]] && (( map[$u]++ ))
  81. [ -n "$d" ] && [[ "${map[$d]}" =~ [0-8] ]] && (( map[$d]++ ))
  82. [ -n "$l" ] && [[ "${map[$l]}" =~ [0-8] ]] && (( map[$l]++ ))
  83. [ -n "$r" ] && [[ "${map[$r]}" =~ [0-8] ]] && (( map[$r]++ ))
  84. [ -n "$ul" ] && [[ "${map[$ul]}" =~ [0-8] ]] && (( map[$ul]++ ))
  85. [ -n "$ur" ] && [[ "${map[$ur]}" =~ [0-8] ]] && (( map[$ur]++ ))
  86. [ -n "$dl" ] && [[ "${map[$dl]}" =~ [0-8] ]] && (( map[$dl]++ ))
  87. [ -n "$dr" ] && [[ "${map[$dr]}" =~ [0-8] ]] && (( map[$dr]++ ))
  88. fi
  89. done
  90. done
  91. }
  92. modify2(){
  93. # cur_x
  94. # cur_y
  95. # echo \($1, $2\)
  96. local c=$(( $2 * MAX_W + $1 )) u d l r ul ur dl dr
  97. if [[ "${map2[$c]}" = u ]] ; then
  98.  
  99. if (( $2 != 0 )) ; then
  100. u=$((c - MAX_W))
  101. (( $1 != 0 )) && ul=$((u - 1 )) || ul=
  102. (( $1 < MAX_W_1 )) && ur=$((u + 1 )) || ur=
  103. else u= ul= ur=
  104. fi
  105. if (( $2 < MAX_H_1 )) ; then
  106. d=$((c + MAX_W))
  107. (( $1 != 0 )) && dl=$((d - 1 )) || dl=
  108. (( $1 < MAX_W_1 )) && dr=$((d + 1 )) || dr=
  109. else d= dl= dr=
  110. fi
  111. (( $1 != 0 )) && l=$((c - 1 )) || l=
  112. (( $1 < MAX_W_1 )) && r=$((c + 1 )) || r=
  113.  
  114.  
  115. if [[ "${map[$c]}" = m ]] ; then
  116. draw
  117. echo you dead. && exit
  118. elif [[ "${map[$c]}" =~ [1-8] ]] ; then
  119. map2[$c]=${map[$c]}
  120. (( res-- ))
  121. elif [[ "${map[$c]}" = 0 ]] ; then
  122. map2[$c]=' '
  123. (( res-- ))
  124. [ -n "$u" ] && [[ "${map2[$u]}" = u ]] && modify2 $1 $(( $2-1 ))
  125. [ -n "$ul" ] && [[ "${map2[$ul]}" = u ]] && modify2 $(( $1-1 )) $(( $2-1 ))
  126. [ -n "$ur" ] && [[ "${map2[$ur]}" = u ]] && modify2 $(( $1+1 )) $(( $2-1 ))
  127.  
  128. [ -n "$d" ] && [[ "${map2[$d]}" = u ]] && modify2 $1 $(( $2+1 ))
  129. [ -n "$dl" ] && [[ "${map2[$dl]}" = u ]] && modify2 $(( $1-1 )) $(( $2+1 ))
  130. [ -n "$dr" ] && [[ "${map2[$dr]}" = u ]] && modify2 $(( $1+1 )) $(( $2+1 ))
  131.  
  132. [ -n "$l" ] && [[ "${map2[$l]}" = u ]] && modify2 $(( $1-1 )) $2
  133. [ -n "$r" ] && [[ "${map2[$r]}" = u ]] && modify2 $(( $1+1 )) $2
  134. fi
  135. fi
  136. }
  137. open_all(){
  138. local c=$(( $2 * MAX_W + $1 )) tmp
  139.  
  140. if [[ "${map[$c]}" = m ]] ; then
  141. draw
  142. echo $1, $2
  143. echo you dead. && exit
  144. fi
  145. tmp=${map[$c]}
  146. map[$c]=0
  147. if [[ ${map2[$c]} != u ]] ; then
  148. ((++res))
  149. map2[$c]=u
  150. fi
  151. modify2 $1 $2
  152. map[$c]=$tmp
  153. [[ $tmp = 0 ]] && map2[$c]=' ' || map2[$c]=$tmp
  154. }
  155. check(){
  156. [[ $res = $MINUS_NUM ]]
  157. }
  158. input(){
  159. echo -ne "\033[?25l"
  160. local aKey=(0 0 0 0)
  161. local cESC=`echo -ne "\033"`
  162. local index c
  163. while :
  164. do
  165. read -s -n 1 key
  166. aKey=( "${aKey[@]:1}" "$key")
  167. if [[ $key${aKey[2]} == $cESC$cESC ]] ; then break
  168. elif [ "${aKey[@]:1:2}$key" = "${cESC} [A" -a $cur_y != 0 ] ; then (( cur_y-- )) # up
  169. elif [ "${aKey[@]:1:2}$key" = "${cESC} [B" -a $cur_y != $MAX_H_1 ] ; then (( cur_y++ )) # down
  170. elif [ "${aKey[@]:1:2}$key" = "${cESC} [C" -a $cur_x != $MAX_W_1 ] ; then (( cur_x++ )) # right
  171. elif [ "${aKey[@]:1:2}$key" = "${cESC} [D" -a $cur_x != 0 ] ; then (( cur_x-- )) # left
  172. elif [ "$key" = "" ] ; then modify2 $cur_x $cur_y # space
  173. elif [ "$key" = "a" ] ; then open_all $cur_x $cur_y
  174. elif [ "$key" = "m" ] ; then
  175. c=$((cur_y*MAX_W+cur_x))
  176. if [[ ${map2[$c]} = u ]] ; then
  177. map2[$c]=M
  178. elif [[ ${map2[$c]} = M ]] ; then
  179. map2[$c]='?'
  180. elif [[ ${map2[$c]} = '?' ]] ; then
  181. map2[$c]=u
  182. fi
  183. else continue
  184. fi
  185. draw2
  186. #draw
  187. check && break
  188. done
  189. echo -ne "\033[?25h"
  190. }
  191. clear
  192. random
  193. modify
  194. draw2
  195. #draw
  196. input
  197. draw2
  198. draw
  199. tput cup $(( (MAX_H<<1) + 2 )) 0
  200. check && echo Clear time is ${SECONDS}s. || echo Quit by user.
  201.  
  202.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty