本文针对会基本python语法的读者。
转载请注明,有问题可以留言一起探讨。
文章中代码运行的环境为Windows下 Python 2.7.14
1、实现的简单效果
pycharm上运行效果
注: [-]:未翻转; [1] 周边的地雷数量; [*]地雷,[ ]周边没有地雷
2、需求的简单分析
(1)先在windows的附件里面把扫雷游戏打开,来多玩几盘
(2)整理整个游戏需求的流程图:
需求简要分析流程图
注:初级9行*9列~10个雷,中级16*16~40,高级16*30~99,自定义行列尚未实现
3、关键代码分析
前置:
将每一格封装成一个类:CGameCell
用m_CellList记录整个画面中每个类的对象
用mineList记录布雷的位置(所在的行,列)
(1)布雷:
布雷的函数主体
思路:如在9*9~10的级别里,需要随机布置10个雷,这10个随机数需要在 [0 ~ 81)之间产生,之后在对每个随机数进行 r, c =divmod(index, self.m_ColBoard) 取模、取余的操作,模代表该雷所在的行,余代表该雷所在的列,再用mineList对所有的雷的位置进行记录。这样做的好处是,每次的布雷都是精准的,时间复杂度低。
(2)统计每格周边雷的数量:
统计每格周边雷的数量
思路:在mineList记录了雷的位置,以每个雷为中心,向其周边的八个方向(左上,正上,右上,正左,正右,左下,正下,右下)进行扩展(注意判断越界),判断该格是否为雷,非雷的话对该格记录的数据值+1。该做法比按照每格进行遍历,效率高出数量级.....
(3)非递归实现用户翻转指定格的效果,截图代码不完整,详细代码见后一章节:
非递归实现用户翻转格
思路:
新开两个数组一个是待检测列表(waitChecklist),一个是已检测数组(m_CellList);检查某个位置,如x,y时,先把它Point(x,y) append进待检查列表。然后循环while(待检测列表的长度>0){
count = round(point.x,point.y)
把point从待检测列表放到已经侧列表
如果count等于0,把point周围的八个point放进待检测列表
}
注意:如果已检测数组里面已经有那个point了,就不要把它加到待检测列表里面,不然会死循环,可参考广搜的原理和二叉树的非递归遍历。也可以用递归实现,但是公司一般不让用递归...
4、整体代码(首次用简书,代码粘贴进来有点奇怪)
# -*- coding: gbk -*-
# Created by zhoul