在数字时代,我们习惯于使用图形用户界面(GUI)来与计算机互动,但命令行界面(CLI)仍然是一个强大的工具,特别是在Linux和Unix系统中。Bash是一种广泛使用的shell,它允许用户通过命令行执行各种任务。今天,我们将一起探索如何使用Bash脚本创建一个简单的扫雷游戏,这样你就可以在命令行中享受游戏的乐趣。

什么是扫雷游戏?

扫雷游戏是一种经典的逻辑游戏,玩家需要在一张网格中找出所有的雷而不触发它们。每块网格可能有一个雷,也可能没有。如果玩家选中的网格有雷,游戏就结束了。如果玩家选中的网格没有雷,他们需要根据周围的雷的数量来猜测其他网格是否安全。

创建Bash扫雷脚本

1. 初始化游戏网格

首先,我们需要创建一个网格,这个网格将包含雷和非雷。我们可以使用Bash的随机数生成器来随机放置雷。

#!/bin/bash

# 游戏网格的大小
GRID_SIZE=10

# 创建一个空网格
declare -a grid
for ((i=0; i<GRID_SIZE*GRID_SIZE; i++)); do
  grid[i]="-"
done

# 随机放置雷
for ((i=0; i<GRID_SIZE*GRID_SIZE/10; i++)); do
  # 生成随机位置
  pos=$((RANDOM % (GRID_SIZE*GRID_SIZE)))
  # 确保位置不是雷
  while [[ "${grid[pos]}" == "X" ]]; do
    pos=$((RANDOM % (GRID_SIZE*GRID_SIZE)))
  done
  grid[pos]="X"
done

2. 显示网格

接下来,我们需要一个函数来显示网格。

# 显示网格
function display_grid {
  for ((i=0; i<GRID_SIZE*GRID_SIZE; i++)); do
    echo -n "${grid[i]} "
    if [[ $((i+1)) == $((GRID_SIZE*GRID_SIZE/GRID_SIZE+1)) ]]; then
      echo
    fi
  done
}

3. 玩家交互

现在我们需要一个循环,让玩家输入坐标来猜测是否是雷。

# 玩家交互
while true; do
  echo "Enter row and column (e.g., 1 2):"
  read row col
  row=$((row-1))
  col=$((col-1))
  pos=$((row*GRID_SIZE+col))

  if [[ "${grid[pos]}" == "X" ]]; then
    echo "Boom! You hit a mine!"
    break
  else
    echo "No mine at (${row+1} ${col+1})."
  fi
done

4. 游戏结束

最后,我们需要一个函数来处理游戏结束的情况。

# 游戏结束
function game_over {
  echo "Game over! You've found all the mines."
  display_grid
}

5. 完整脚本

将以上所有代码组合在一起,我们得到了一个完整的扫雷游戏脚本。

#!/bin/bash

# 游戏网格的大小
GRID_SIZE=10

# 创建一个空网格
declare -a grid
for ((i=0; i<GRID_SIZE*GRID_SIZE; i++)); do
  grid[i]="-"
done

# 随机放置雷
for ((i=0; i<GRID_SIZE*GRID_SIZE/10; i++)); do
  # 生成随机位置
  pos=$((RANDOM % (GRID_SIZE*GRID_SIZE)))
  # 确保位置不是雷
  while [[ "${grid[pos]}" == "X" ]]; do
    pos=$((RANDOM % (GRID_SIZE*GRID_SIZE)))
  done
  grid[pos]="X"
done

# 显示网格
function display_grid {
  for ((i=0; i<GRID_SIZE*GRID_SIZE; i++)); do
    echo -n "${grid[i]} "
    if [[ $((i+1)) == $((GRID_SIZE*GRID_SIZE/GRID_SIZE+1)) ]]; then
      echo
    fi
  done
}

# 玩家交互
while true; do
  echo "Enter row and column (e.g., 1 2):"
  read row col
  row=$((row-1))
  col=$((col-1))
  pos=$((row*GRID_SIZE+col))

  if [[ "${grid[pos]}" == "X" ]]; then
    echo "Boom! You hit a mine!"
    display_grid
    break
  else
    echo "No mine at (${row+1} ${col+1})."
  fi
done

# 游戏结束
function game_over {
  echo "Game over! You've found all the mines."
  display_grid
}

# 检查是否找到所有雷
function check_mines {
  local mines_found=0
  for ((i=0; i<GRID_SIZE*GRID_SIZE; i++)); do
    if [[ "${grid[i]}" == "X" ]]; then
      ((mines_found++))
    fi
  done
  if [[ $mines_found -eq GRID_SIZE*GRID_SIZE/10 ]]; then
    game_over
  fi
}

# 检查是否找到所有非雷
function check_safe {
  local safe_found=0
  for ((i=0; i<GRID_SIZE*GRID_SIZE; i++)); do
    if [[ "${grid[i]}" != "X" ]]; then
      ((safe_found++))
    fi
  done
  if [[ $safe_found -eq GRID_SIZE*GRID_SIZE-mines_found ]]; then
    game_over
  fi
}

# 开始游戏
display_grid
while true; do
  check_mines
  check_safe
done

运行游戏

将以上脚本保存为 minesweeper.sh,然后在终端中运行:

chmod +x minesweeper.sh
./minesweeper.sh

现在,你就可以在命令行中玩扫雷游戏了!这个简单的脚本是一个很好的起点,你可以根据自己的喜好添加更多的功能,比如计时器、不同的难度级别或者改进用户界面。享受你的命令行游戏时光吧!