设计需求
基础功能
实现windows扫雷游戏初级的全部功能
扫雷尺寸99 方格 每一个方格尺寸3030
游戏初始化时,随机分布10个地雷
当左键点击雷区任意方格时,则游戏开始
鼠标左键点击为翻开方格,为雷则游戏失败,非雷则显示其周围一圈地雷的数量(0-8)
鼠标右键单击标记为旗帜,此时左键单击无效。
鼠标右键再次单击标记为旗帜的方格,则标记转为问号,代表疑问,此时左键单击有效。
第一步 默认不能踩雷 (若是是雷,强制从新随机分布直至为非雷)windows
点开一片区域
当左键点击方格时,若是为非雷且其周围一圈的地雷数量为0,则自动翻开其周围一圈的方格,再检测是否还存在数量为0的方格,若有则继续翻开其周围一圈方格,直至没有数量为0的方格为止。(视觉效果上至关于点开一片区域)数组
当鼠标左键和右键同时单击一块方格时:
1) 未翻开方格点击无效
2) 已翻开方格,获取方格的数字(1-8),而后检测其周围8个方格中
剩余未翻开方格 == 当前方格数字,则自动标记为旗帜
剩余未翻开方格 > 当前方格数字,无动做
剩余未翻开方格中已标记旗帜数量 == 当前方格数字,则自动翻开其它剩余未翻开方格,若是有雷则游戏失败
剩余未翻开方格中已标记旗帜数量 != 当前方格数字,无动做dom
其它功能
计时器:方格第一步左键翻开以后即开始计时,直至游戏结束(成功或失败)
雷数:每标记一个旗帜则雷数减1,雷数容许为负值
游戏状态:游戏开始为normal脸,游戏成功为smile脸,游戏失败为cry脸。任意时刻点击任意状态的脸都将重置游戏svg
游戏失败断定:左键翻开方格为雷或者左键右键同时点击自动翻开未翻开方格时有雷则断定游戏失败
游戏成功断定:正确使用旗帜标记出全部地雷,且雷数显示为0(即没有多标旗帜)函数
主要功能模块实现思路
1) 如何检测鼠标左键和右键同时按下
设置鼠标每一个键(左键,右键,滚轮)的状态位,检测其按下和松开两个状态
当鼠标左键按下且未松开时,检测到右键按下时,则认为两键同时按下
反之同理.net
2)随机雷分布
经过列表生成式生成二维数组,表示地雷分布的row和line值。
随机生成的二维数组可能存在重复值,因此须要先将列表转换为tuple,再经过set去重
去重后数组可能小于10,因此为简化操做,一开始生成12组数值,若是去重后小于10则重复生成直到生成的去重数组大于10为止。
实际只取前10组数据。
参考代码以下:设计
#生成大于10个不重复的二维数组,若是数组长度小于10则再次生成直到数组长度大于10为止
num = 0
while num <10:
random_number_0 = [[random.randint(0,8) for i in range(2)] for j in range(12)]
#将列表转换为tuple,再经过set去重复数据
random_number = list(set([tuple(t) for t in random_number_0]))
num = len(random_number)
3)点开一片区域
利用 递归函数
先获取周围方格的坐标,而后计算周围方格的地雷数量,不为0则显示相应的数字,为0的话,则调用递归函数,继续计算。直至没有数量为0的方格为止code
4)左右键同时按下的操做orm
未翻开方格点击无效
已翻开方格,获取方格的数字(1-8),而后检测其周围8个方格中
剩余未翻开方格 == 当前方格数字,则自动标记为旗帜
剩余未翻开方格 > 当前方格数字,无动做
剩余未翻开方格中已标记旗帜数量 == 当前方格数字,则自动翻开其它剩余未翻开方格,若是有雷则游戏失败
剩余未翻开方格中已标记旗帜数量 != 当前方格数字,无动做
5)第一步就是雷的状况
若是第一次左键单击的方格就是雷,则强制从新执行随机雷分布,并不断检测点击的方格是否仍有地雷,若是仍是有雷,则反复执行,直到该点击方格无雷为止