前言
扫雷是一款单人益智游戏,玩家需要在一个方格区域内,通过点击方格来揭示数字或者地雷,以推断地雷的位置并避免踩雷。
文章目录
游戏规则
1.游戏目标
揭示所有没有地雷的方格,而不揭示任何地雷。
2.游戏界面
游戏界面是一个方格区域,每个方格可能包含数字、地雷或者是空白。
数字表示周围8个方格内的地雷数量。
空白方格表示周围没有地雷。
点击包含地雷的方格会导致游戏失败。
3.游戏流程
1.游戏开始时,玩家选择一个方格揭示。
2.如果揭示的是地雷,则游戏结束,玩家失败。
3.如果揭示的是数字,则显示该数字,表示周围地雷的数量。
4.如果揭示的是空白方格,则揭示周围的方格,直到遇到数字方格为止。
5.玩家根据揭示的数字来推断周围地雷的位置,并标记潜在的地雷。
6.游戏继续进行,直到所有没有地雷的方格都被揭示。
实现关键点
1.二维列表
扫雷游戏板通常是一个二维列表,用于存储方格的状态。
随机数生成:
初始化扫雷游戏板时,需要随机生成地雷的位置。
2.递归算法
当揭示到空白方格时,需要使用递归算法来揭示周围的空白方格。
3.条件语句和循环语句
使用条件语句和循环语句来实现游戏的逻辑,例如判断游戏是否结束、揭示方格时的处理等。
4.用户输入和输出
通过输入来接收玩家的操作,例如揭示的行和列。
通过输出来显示游戏板的状态,以及游戏的结果。
5.函数封装
将游戏的不同功能封装成函数,提高代码的可读性和复用性。
6.错误处理
需要处理玩家的错误操作,例如输入无效的行和列。
具体实现
1.导入模块
import random
导入了Python标准库中的random模块,用于生成随机数。
2.初始化游戏板函数
def initialize_board(rows, cols, num_mines):
board = [[' ' for _ in range(cols)] for _ in range(rows)]
mines_placed = 0
while mines_placed < num_mines:
row = random.randint(0, rows - 1)
col = random.randint(0, cols - 1)
if board[row][col] != '*':
board[row][col] = '*'
mines_placed += 1
return board
这个函数创建了一个大小为 rows x cols 的二维列表,表示扫雷游戏板。然后它使用 random.randint() 函数在游戏板上随机放置了 num_mines 个地雷,并返回了初始化后的游戏板。
3.计算周围地雷数量函数
def count_adjacent_mines(board, row, col):
count = 0
for i in range(max(0, row - 1), min(len(board), row + 2)):
for j in range(max(0, col - 1), min(len(board[0]), col + 2)):
if board[i][j] == '*':
count += 1
return count
这个函数接收游戏板 board 以及坐标 (row, col),并计算出该坐标周围的地雷数量。
4.打印游戏板函数
def print_board(board):
for row in board:
print(' '.join(row))
这个函数用于打印游戏板,将其以可读的格式输出到终端上。
5.揭示函数
def reveal(board, row, col, rows, cols):
if row < 0 or col < 0 or row >= rows or col >= cols:
return
if board[row][col] != ' ':
return
mines = count_adjacent_mines(board, row, col)
board[row][col] = str(mines) if mines > 0 else ' '
if mines == 0:
for i in range(row - 1, row + 2):
for j in range(col - 1, col + 2):
reveal(board, i, j, rows, cols)
这个函数用于揭示游戏板上的方块。如果 (row, col) 处的方块为空白,则递归地揭示周围的方块,直到遇到有数字的方块或边界。
6.游戏函数
def play(rows, cols, num_mines):
board = initialize_board(rows, cols, num_mines)
print_board(board)
while True:
row = int(input('Enter row: '))
col = int(input('Enter column: '))
if board[row][col] == '*':
print('Game Over!')
print_board(board)
break
else:
reveal(board, row, col, rows, cols)
print_board(board)
这个函数用于执行游戏的主循环。它首先初始化游戏板,然后要求玩家输入要揭示的行和列。如果玩家揭示到地雷,则游戏结束;否则揭示该位置,并显示当前游戏板。
完整代码
import random
def initialize_board(rows, cols, num_mines):
board = [[' ' for _ in range(cols)] for _ in range(rows)]
mines_placed = 0
while mines_placed < num_mines:
row = random.randint(0, rows - 1)
col = random.randint(0, cols - 1)
if board[row][col] != '*':
board[row][col] = '*'
mines_placed += 1
return board
def count_adjacent_mines(board, row, col):
count = 0
for i in range(max(0, row - 1), min(len(board), row + 2)):
for j in range(max(0, col - 1), min(len(board[0]), col + 2)):
if board[i][j] == '*':
count += 1
return count
def print_board(board):
for row in board:
print(' '.join(row))
def reveal(board, row, col, rows, cols):
if row < 0 or col < 0 or row >= rows or col >= cols:
return
if board[row][col] != ' ':
return
mines = count_adjacent_mines(board, row, col)
board[row][col] = str(mines) if mines > 0 else ' '
if mines == 0:
for i in range(row - 1, row + 2):
for j in range(col - 1, col + 2):
reveal(board, i, j, rows, cols)
def play(rows, cols, num_mines):
board = initialize_board(rows, cols, num_mines)
print_board(board)
while True:
row = int(input('Enter row: '))
col = int(input('Enter column: '))
if board[row][col] == '*':
print('Game Over!')
print_board(board)
break
else:
reveal(board, row, col, rows, cols)
print_board(board)
# 测试游戏
rows = 5
cols = 5
num_mines = 5
play(rows, cols, num_mines)