Advertisement

【Python小游戏】扫雷

阅读量:

前言

扫雷是一款单人益智游戏,玩家需要在一个方格区域内,通过点击方格来揭示数字或者地雷,以推断地雷的位置并避免踩雷。

文章目录

  • 前言

  • 游戏规则

    • 1.游戏目标
    • 2.游戏界面
    • 3.游戏流程
  • 实现关键点

    • 1.二维列表
    • 2.递归算法
    • 3.条件语句和循环语句
    • 4.用户输入和输出
    • 5.函数封装
    • 6.错误处理
  • 具体实现

    • 1.导入模块
    • 2.初始化游戏板函数
    • 3.计算周围地雷数量函数
    • 4.打印游戏板函数
    • 5.揭示函数
    • 6.游戏函数
    • 完整代码

游戏规则

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)
    
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

全部评论 (0)

还没有任何评论哟~