在数字时代,我们习惯于使用图形用户界面(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
现在,你就可以在命令行中玩扫雷游戏了!这个简单的脚本是一个很好的起点,你可以根据自己的喜好添加更多的功能,比如计时器、不同的难度级别或者改进用户界面。享受你的命令行游戏时光吧!
