加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码网 (https://www.900php.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Windows > 正文

通过编写扫雷游戏提高你的Bash技巧

发布时间:2019-10-10 11:19:45 所属栏目:Windows 来源:Abhishek Tamrakar
导读:副标题#e# 那些令人怀念的经典游戏可是提高编程能力的好素材。今天就让我们仔细探索一番,怎么用 Bash 编写一个扫雷程序。 我在编程教学方面不是专家,但当我想更好掌握某一样东西时,会试着找出让自己乐在其中的方法。比方说,当我想在 shell 编程方面更进

最后,为了保持游戏界面整齐好看,我会在每行用一个竖线作为结尾,并在最后结束行循环:

  1. printf '%sn' "|" # 显示出行分隔符
  2. printf ' %sn' "-----------------------------------------"
  3. # 结束行循环
  4. done
  5. printf 'nn'

完整的 plough 代码如下:

  1. plough()
  2. {
  3.   r=0
  4.   printf 'nn'
  5.   printf '%s' "     a   b   c   d   e   f   g   h   i   j"
  6.   printf 'n   %sn' "-----------------------------------------"
  7.   for row in $(seq 0 9); do
  8.     printf '%d  ' "$row"
  9.     for col in $(seq 0 9); do
  10.        ((r+=1))
  11.        is_null_field $r
  12.        printf '%s e[33m%se[0m ' "|" "${room[$r]}"
  13.     done
  14.     printf '%sn' "|"
  15.     printf '   %sn' "-----------------------------------------"
  16.   done
  17.   printf 'nn'
  18. }

我花了点时间来思考,is_null_field 的具体功能是什么。让我们来看看,它到底能做些什么。在最开始,我们需要游戏有一个固定的状态。你可以随便选择个初始值,可以是一个数字或者任意字符。我最后决定,所有单元格的初始值为一个点(.),因为我觉得,这样会让游戏界面更好看。下面就是这一函数的完整代码:

  1. is_null_field()
  2. {
  3. local e=$1 # 在数组 room 中,我们已经用过循环变量 'r' 了,这次我们用 'e'
  4. if [[ -z "${room[$e]}" ]];then
  5. room[$r]="." #这里用点(.)来初始化每一个单元格
  6. fi
  7. }

现在,我已经初始化了所有的格子,现在只要用一个很简单的函数就能得出当前游戏中还有多少单元格可以操作:

  1. get_free_fields()
  2. {
  3. free_fields=0 # 初始化变量
  4. for n in $(seq 1 ${#room[@]}); do
  5. if [[ "${room[$n]}" = "." ]]; then # 检查当前单元格是否等于初始值(.),结果为真,则记为空余格子。
  6. ((free_fields+=1))
  7.     fi
  8.   done
  9. }

这是显示出来的游戏界面,[a-j] 为列,[0-9] 为行。

通过编写扫雷游戏提高你的Bash技巧

Minefield

创建玩家逻辑

玩家操作背后的逻辑在于,先从 stdin 中读取数据作为坐标,然后再找出对应位置实际包含的值。这里用到了 Bash 的参数扩展,来设法得到行列数。然后将代表列数的字母传给分支语句,从而得到其对应的列数。为了更好地理解这一过程,可以看看下面这段代码中,变量 o 所对应的值。 举个例子,玩家输入了 c3,这时 Bash 将其分成两个字符:c3。为了简单起见,我跳过了如何处理无效输入的部分。

  1. colm=${opt:0:1} # 得到第一个字符,一个字母
  2. ro=${opt:1:1} # 得到第二个字符,一个整数
  3. case $colm in
  4. a ) o=1;; # 最后,通过字母得到对应列数。
  5. b ) o=2;;
  6.     c ) o=3;;
  7.     d ) o=4;;
  8.     e ) o=5;;
  9.     f ) o=6;;
  10.     g ) o=7;;
  11.     h ) o=8;;
  12.     i ) o=9;;
  13.     j ) o=10;;
  14.   esac

下面的代码会计算用户所选单元格实际对应的数字,然后将结果储存在变量中。

(编辑:源码网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读