Python实现扫雷游戏

扫雷是一款经典的单人电脑游戏,玩家在一个隐藏有地雷的方格中探测安全区域,目标是在尽可能少的点击中找出所有没有地雷的方格。通过这篇文章,我们将学习如何使用Python编写一个简单的扫雷游戏,了解其基本逻辑,并通过代码示例加深理解。

1. 游戏规则简介

在扫雷游戏中,玩家的目标是揭开格子,直到找到所有没有地雷的格子。每个格子可以是以下三种状态之一:

  1. 安全格:周围有若干地雷,显示数字。
  2. 雷区:点击后游戏结束。
  3. 空白格:周围没有地雷,点击后会自动展开附近安全格。

2. 程序设计流程

我们可以将扫雷游戏的基本逻辑简化为以下几个步骤:

flowchart TD
    A[开始游戏] --> B[初始化游戏区域]
    B --> C[放置地雷]
    C --> D[计算周围地雷数量]
    D --> E[玩家点击方格]
    E -->|安全格| F[显示数字或展开]
    E -->|雷区| G[游戏结束]
    F --> E
    F --> H[检查胜利条件]
    H -->|胜利| I[显示胜利信息]
    H -->|未胜利| E

3. 代码实现

接下来,我们将分步骤实现扫雷游戏的代码。以下是Python实现的基本框架:

3.1 初始化游戏区域

首先我们需要创建一个游戏区域,可以用二维列表表示。我们还需要定义区域的宽度、高度和地雷数量。

import random

def create_board(width, height, num_mines):
    board = [[' ' for _ in range(width)] for _ in range(height)]
    mines = set()

    while len(mines) < num_mines:
        mine_position = (random.randint(0, height-1), random.randint(0, width-1))
        if mine_position not in mines:
            mines.add(mine_position)
            board[mine_position[0]][mine_position[1]] = 'M'
    
    return board, mines

3.2 计算周围地雷数量

每个非地雷方格都需要显示周围地雷的数量。我们可以通过遍历每个方格,检查其邻近的方格实现。

def count_mines(board):
    height = len(board)
    width = len(board[0])
    for row in range(height):
        for col in range(width):
            if board[row][col] == 'M':
                continue
            mine_count = 0
            for r in range(row-1, row+2):
                for c in range(col-1, col+2):
                    if 0 <= r < height and 0 <= c < width and board[r][c] == 'M':
                        mine_count += 1
            board[row][col] = str(mine_count) if mine_count > 0 else ' '

3.3 玩家操作

玩家可以点击方格,我们需要判断玩家的点击结果是安全格还是地雷。如果是安全格且没有周围地雷,自动展开相邻的方格。

def reveal_square(board, revealed, row, col):
    if (row < 0 or col < 0 or row >= len(board) or col >= len(board[0]) or revealed[row][col]):
        return
        
    revealed[row][col] = True
    if board[row][col] == ' ':
        for r in range(row-1, row+2):
            for c in range(col-1, col+2):
                reveal_square(board, revealed, r, c)

3.4 主要游戏循环

我们将以上功能结合成主游戏逻辑,包括显示界面、处理用户输入和检查游戏状态。

def play_game(width, height, num_mines):
    board, mines = create_board(width, height, num_mines)
    count_mines(board)
    revealed = [[False] * width for _ in range(height)]
    
    while True:
        for row in revealed:
            print(' '.join(cell if revealed[r][c] else '#' for c, cell in enumerate(row)))
        user_input = input("请输入行和列以点击: ").split()
        row, col = int(user_input[0]), int(user_input[1])

        if (row, col) in mines:
            print("游戏结束,你踩到了雷!")
            break
        
        reveal_square(board, revealed, row, col)
        if all(revealed[r][c] or (r, c) in mines for r in range(height) for c in range(width)):
            print("恭喜你,赢得了游戏!")
            break

4. 总结

通过这段代码,我们实现了一个简易的扫雷游戏,它涵盖了游戏的各项基本功能。玩家可以在一个指定的范围内点击格子,程序会根据游戏的状态更新显示内容,直到玩家找到所有安全格或点击到地雷。

这不仅是一个有趣的游戏,也是学习编程基本逻辑的绝佳项目。希望这篇文章能激发你进一步探索Python编程的兴趣,挑战更复杂的项目,并不断提高你的编程能力。