【Python小游戏】扫雷

前言

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

游戏规则

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)

  • 23
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值