python扫雷的代码及原理_python实现文字版扫雷

本文针对会基本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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值