从零实现Python自动扫雷(四):扫雷核心逻辑

一、系统架构总览

本扫雷AI系统由三个核心模块组成,形成完整的自动化扫雷解决方案:

  1. MineCleaner.py - 扫雷策略执行引擎
  2. MineGroup.py - 雷区关系链管理
  3. MineMap.py - 游戏地图状态维护

二、核心模块深度解析

2.1 MineMap.py - 游戏地图模型

2.1.1 格子状态设计

1
2
3
4
5
6
7
8
9
10
class MineGrid:
def __init__(self, x, y):
self.flag = -1 # 初始状态
# 状态编码:
# -1:未打开 0:已打开无雷
# 1-8:周围雷数 -4:标记为雷
# -2:待识别 -9:实际为雷
self.lastImg = None # 上次图像快照
self.newImg = None # 当前图像
self.isMine = False # 实际是否为雷

2.1.2 关键方法实现

1
2
3
4
def get_grid_info(self, x, y):
"""获取指定格子周围雷区信息"""
return (mines, unopened_num, marked_num, grids)
# 返回: 总雷数, 未打开数, 已标记数, 未打开格子坐标列表

2.2 MineGroup.py - 雷区关系链管理

2.2.1 链式结构设计

1
2
3
4
5
class MineChain:
"""表示一组相关联的未打开格子"""
def __init__(self, grids, mine_num):
self.grids = grids # 关联格子坐标列表
self.mine_num = mine_num # 这些格子中的雷数

2.2.2 核心算法逻辑

1
2
3
4
5
6
7
def insert(self, grids, mine_num):
"""插入新的雷区关系链"""
# 实现链的合并、拆分和冲突检测
if self.search_same(grids, mine_num): return
if self.search_parent(grids, mine_num): return
if self.search_child(grids, mine_num): return
self.chains[len(grids)].append(MineChain(grids, mine_num))

2.3 MineCleaner.py - 扫雷策略引擎

2.3.1 基础策略实现

1
2
3
4
5
6
7
8
9
10
11
12
13
def clean_mine(self):
"""核心扫雷逻辑"""
# 情况1: 未打开格子数=剩余雷数 → 全部标记为雷
if(mine_num == unopend_num + marked_num):
self.mark_all_mine(grids)

# 情况2: 已标记数=总雷数 → 安全打开剩余格子
elif(mine_num == marked_num):
self.open_all_grids(grids)

# 情况3: 不确定状态 → 加入关系链
else:
self.group.insert(grids, mine_num - marked_num)

2.3.2 概率决策机制

1
2
3
4
5
6
7
8
9
10
11
def random_open(self):
"""基于概率的随机开启策略"""
# 计算每个未打开格子的地雷概率权重
weights[x][y] = chain.mine_num / len(chain.grids)

# 选择概率最小的格子开启
min_weight = min(weights[x][y] for (x,y) in unopened_lst)
choices = [(x,y) for (x,y) in unopened_lst
if weights[x][y] == min_weight]
xx, yy = random.choice(choices)
self.open_grids(xx, yy)

三、关键技术亮点

3.1 动态关系链管理

  1. 链式存储结构:按格子数量分层存储,提高查询效率
  2. 智能合并拆分:自动处理父子链关系,维护最小完整链
  3. 实时状态传播:当某格子状态确定时,自动更新相关链

3.2 双重验证机制

1
2
3
4
5
6
def need_grid_classify(self, x, y):
"""判断是否需要重新识别格子"""
return (not grid.isMine and
not grid.flag == -4 and
(grid.flag == -2 or
not self.compare_grid_img(x, y)))

通过图像比对和状态标记双重验证,减少不必要的识别操作

3.3 渐进式决策流程

  1. 优先处理确定性情况(必为雷或必安全)
  2. 对不确定情况建立概率关系模型
  3. 当无确定解时,选择风险最低的格子开启

四、性能优化策略

4.1 图像缓存机制

1
2
3
def set_grid_img(self, x, y, img):
grid.lastImg = grid.newImg # 保留上一帧图像
grid.newImg = img # 更新当前图像

通过缓存历史图像,实现差异比对,减少处理量

4.2 分层链式存储

1
2
self.chains = [[],[],[],[],[],[],[],[],[],[],[],[]]
# 按链长度分层存储,提高查询效率

4.3 懒惰更新策略

仅在格子状态变化或图像更新时才触发重新识别

五、总结

本系统通过将扫雷问题转化为关系链管理问题,实现了高效可靠的自动化扫雷。其模块化设计使得各部分可独立优化,为后续功能扩展奠定了良好基础。


从零实现Python自动扫雷(四):扫雷核心逻辑
https://blog.cngo.xyz/posts/6060.html
作者
cngo
发布于
2024年12月20日
许可协议