从零实现Python自动扫雷(五):扫雷主程序

一、主程序和其他模块

除了前面介绍的核心功能模块(地图管理、窗口控制、图像识别、扫雷策略等)外,程序还包括:

  1. 主程序(main.py) - 系统调度中枢
  2. 配置模块(conf.py) - 全局参数管理
  3. 日志模块(mylogger.py) - 系统运行监控
1
2
3
4
5
6
7
8
9
10
11
12
项目根目录
├── conf.py # 配置文件,包含全局变量和常量定义
├── CursorClick.py # 鼠标点击操作模块,用于模拟鼠标点击
├── main.py # 主程序入口,负责程序的整体流程控制
├── MineCleaner.py # 扫雷逻辑模块,负责扫雷过程中的清理操作
├── MineGroup.py # 雷区分组模块,用于管理雷区的分组逻辑
├── MineMap.py # 雷区地图模块,用于管理雷区地图的状态
├── mylogger.py # 日志模块,用于记录程序运行过程中的日志信息
├── WindowManager.py # 窗口管理模块,负责管理游戏窗口的定位和截图
├── Classify.py # 图像分类模块,用于识别雷区格子的状态
├── my_model.h5 # TensorFlow 模型文件,用于图像分类
└── my_project.log # 日志文件,记录程序运行过程中的日志信息
MARKDOWN
收起代码

二、主程序解析

2.1 main.py - 系统主程序

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
from MineMap import MineMap
from WindowManager import WindowManager
from Classify import OcrClassifier
import time
from mylogger import logger
from MineCleaner import MineCleaner
import sys

class_name = "TkTopLevel"
title_name = "扫雷小游戏"

def main():
try:
map = MineMap(16, 16)
window = WindowManager(class_name, title_name)
ocr = OcrClassifier(window, map)
op = MineCleaner(window, map)
start_time = time.time()
classfiy_time = 0
clean_time = 0
# 截图,每个都插入初始图片
ocr.classify_all()
# 开始,随机点一个
time1 = time.time()
classfiy_time += time1 - start_time
op.start_up()
time2 = time.time()
clean_time += time2 - time1
c = 0
while True:
time3 = time.time()
ocr.classify_all()
time4 = time.time()
classfiy_time += time4 - time3
op.clean_mine()
time5 = time.time()
clean_time += time5 - time4
if window.check_main_window():
break
c += 1
# if c > 6:
# break
except Exception as e:
logger.error(e)
finally:
elapsed_time = time.time() - start_time
logger.info("成功扫雷总用时:{}s, 识别用时:{}s, 扫雷用时:{}s".format(round(elapsed_time,2), round(classfiy_time,2), round(clean_time,2)))
sys.exit(0)
if __name__ == "__main__":
main()
PYTHON
收起代码

2.1.1 初始化流程

1
2
3
4
5
def main():
map = MineMap(16, 16) # 16x16地图初始化
window = WindowManager(class_name, title_name) # 游戏窗口控制
ocr = OcrClassifier(window, map) # 图像识别引擎
op = MineCleaner(window, map) # 扫雷策略引擎
PYTHON

2.1.2 主循环逻辑

1
2
3
4
5
6
7
8
9
10
11
while True:
ocr.classify_all() # 全图识别
op.clean_mine() # 执行扫雷

# 检查游戏结束条件
if window.check_main_window():
break

# 性能监控
c += 1
# if c > 6: break # 调试用循环限制
PYTHON

2.2 conf.py - 系统配置

2.2.1 显示配置

1
2
zoomRate = 1.25  # 屏幕缩放比例
block_width, block_height = 20, 20 # 格子基准尺寸
PYTHON

2.2.2 游戏参数

1
2
mineNumAll = 40  # 总雷数
blocks_x = blocks_y = 0 # 当前区块尺寸
PYTHON

2.2.3 路径配置

1
2
3
ReferPath = "./Image/Reference/"  # 参考图像路径
ErrorPath = "./Image/Error/" # 错误图像保存路径
LowAcPath = "./Image/Low_Accuracy/" # 低识别率图像路径
PYTHON

2.3 mylogger.py - 日志管理系统

2.3.1 日志配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def setup_logger():
logger = logging.getLogger('my_project')
logger.setLevel(logging.DEBUG)

# 文件日志handler
file_handler = logging.FileHandler('my_project.log')

# 控制台日志handler
console_handler = logging.StreamHandler()

# 统一日志格式
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
PYTHON
收起代码

三、主程序关键点

3.1 性能监控体系

1
2
3
4
5
6
7
8
9
10
11
12
13
start_time = time.time()
classfiy_time = 0
clean_time = 0

while True:
time3 = time.time()
ocr.classify_all() # 图像识别
time4 = time.time()
classfiy_time += time4 - time3 # 累计识别耗时

op.clean_mine() # 扫雷操作
time5 = time.time()
clean_time += time5 - time4 # 累计扫雷耗时
PYTHON
收起代码

3.2 异常处理机制

1
2
3
4
5
6
7
8
9
10
try:
# 主业务流程
except Exception as e:
logger.error(e) # 错误日志记录
finally:
# 性能报告输出
logger.info(f"总用时:{round(elapsed_time,2)}s, "
f"识别用时:{round(classfiy_time,2)}s, "
f"扫雷用时:{round(clean_time,2)}s")
sys.exit(0) # 安全退出
PYTHON

3.3 游戏流程控制

1
2
3
4
5
6
7
# 初始点击策略
op.start_up() # 随机选择起始点

# 主循环控制
while not window.check_main_window(): # 直到游戏结束
ocr.classify_all() # 状态识别
op.clean_mine() # 策略执行
PYTHON

四、运行流程

  1. 初始化阶段

    • 创建游戏地图模型
    • 连接游戏窗口
    • 加载识别模型
    • 初始化策略引擎
  2. 启动阶段

    • 全图初始识别
    • 随机起始位置点击
  3. 主循环阶段

    • 实时图像识别
    • 智能策略决策
    • 自动点击操作
    • 状态监控
  4. 结束阶段

    • 游戏结束检测
    • 性能统计分析
    • 系统安全退出

从零实现Python自动扫雷(五):扫雷主程序
https://blog.cngo.xyz/posts/6061.html
作者
cngo
发布于
2024年12月21日
许可协议