pygame扫雷小游戏

一、核心功能

  1. 随机雷区生成
    • 棋盘由方格构成
    • 首次点击的格子必为空,无雷且自动展开安全区域
  2. 数字提示系统
    • 点击空白方格后,显示数字表示周围8个相邻格子中的地雷数量
    • 无雷自动翻开所有相邻安全区域
  3. 标记与探测
    • 左键单击:翻开格子(若翻开地雷则游戏失败)
    • 右键单击:标记红旗(疑似地雷)、问号(不确定)
    • 双击已显示数字的格子:自动翻开周围未标记的格子(当标记数与提示数匹配时)

二、玩法规则

游戏目标

以最短时间翻开所有非雷格子,并正确标记所有地雷的位置

操作逻辑
  1. 开局策略

    • 优先点击棋盘中心或边界,快速展开大面积安全区域
    • 利用首个展开区域的数字推断周围雷分布
      示例: 若点击后显示数字3 → 相邻8格中有3颗雷
  2. 推理与排除

    • 矛盾排查:当两格数字重叠区域存在不同雷数需求,结合两者推导雷的位置
    • 连锁反应:展开无雷区域后生成的新数字需与前序推导逻辑一致
      示例:
    1  1  1  
    █  █  2  ← 外围已标记1颗雷 → 剩余1雷在右下两格中  
    
  3. 决胜关键

    • 概率博弈:后期可能存在无法100%推断的雷区,需依赖逻辑排除后的最小风险选择
    • 路径记忆:追踪已排除区域的标记状态,避免重复操作

三、胜利与失败判定

  • 成功条件

    1. 所有非雷格子均被翻开
    2. 所有地雷位置正确标记(红旗数量与雷数严格一致)
  • 失败条件

    1. 误触地雷(立即终止游戏)
    2. 错误标记超过实际雷数且无法纠正时系统判定逻辑漏洞

首先,游戏定义了扫雷游戏的难度切换功能,在初始化时设置难度:

    DIFFICULTIES = {
        'beginner': (9, 9, 10),
        'intermediate': (16, 16, 40),
        'expert': (30, 16, 99)
    }
    
    
    def __init__(self, difficulty='beginner'):
            self.current_difficulty = difficulty  # 添加当前难度属性
            self.rows, self.cols, self.mine_count = DIFFICULTIES[difficulty]
            self.cell_size = 30
            self.width = self.cols * self.cell_size
            self.height = self.rows * self.cell_size + 60
            self.grid = []
            self.game_over = False
            self.victory = False
            self.flags = self.mine_count
            self.init_grid()
            

    下面布置雷区,使用random.sample确保地雷位置随机且不重复,地雷数量由难度设置决定。并实现安全首次点击:确保玩家第一次点击的位置及其周围8个格子都没有地雷,避免第一次就踩到地雷的情况。3x3安全区域:使用双重循环遍历(-1,0,1)创建3x3的安全区域,检查边界确保安全区域不超出游戏板。初始化完成标记:设置mines_generated标志表示地雷已生成,计算每个格子周围的地雷数量。

    格子不同状态显示

    未翻开:灰色背景
    已翻开:浅灰色背景
    踩雷:红色背景
    标记:旗子或问号

    def generate_mines(self, safe_pos):
            """生成地雷(避开安全位置周围3x3区域)"""
            safe_row, safe_col = safe_pos
            exclude = set()
            for dr in (-1,0,1):
                for dc in (-1,0,1):
                    r = safe_row + dr
                    c = safe_col + dc
                    if 0 <= r < self.rows and 0 <= c < self.cols:
                        exclude.add((r,c))
                        
            candidates = [(r,c) for r in range(self.rows) for c in range(self.cols)
                         if (r,c) not in exclude]
            mines = random.sample(candidates, self.mine_count)
            
            for r, c in mines:
                self.grid[r][c]['mine'] = True
                
            self.calculate_neighbors()
            self.mines_generated = True

    下面一次绘制背景层、格子层、内容层(数字/地雷/标记)和状态栏层。

    首先主界面背景:

    def draw(self, screen):
        screen.fill(COLORS['bg'])  # 填充背景色
        # 绘制雷区
        for r in range(self.rows):
            for c in range(self.cols):
                self.draw_cell(screen, r, c)
        # 绘制状态栏        
        self.draw_status(screen)
        pygame.display.flip()  # 更新显示

    单元格绘制 draw_cell():

    def draw_cell(self, screen, row, col):
        cell = self.grid[row][col]
        x = col * self.cell_size
        y = row * self.cell_size + 60  # 顶部60像素留给状态栏
        
        # 设置背景色
        color = COLORS['revealed'] if cell['revealed'] else COLORS['hidden']
        if self.game_over and cell['mine']:
            color = (255,0,0)  # 踩雷格子显示红色
            
        # 绘制格子和边框
        pygame.draw.rect(screen, color, (x, y, self.cell_size, self.cell_size))
        pygame.draw.rect(screen, COLORS['grid'], (x, y, self.cell_size, self.cell_size), 1)

    地雷绘制 draw_mine():

    def draw_mine(self, screen, x, y):
        # 绘制一个黑色圆形表示地雷
        pygame.draw.circle(
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    席子哥哥的代码库

    你的鼓励是我最大的动力!

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

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

    余额充值