继承按钮类:square
属性1、是否有矿 bool HasMine
属性2、获取周围地雷数量 int AroudMineCount
属性3、获取当前网格状态枚举State
方法一、打开网格Open
方法2:标记正方形
方法三、去掉标记Reset
//还没有实现它
B.雷区类:自定义控件
活动1、游戏成功
事件2,游戏失败
方法一、初始化雷区:每边有多少个雷
方法二、显示雷区DisPlayAll的所有内容
方法三、显示DisPlayArround周围没有地雷的区域
]]
方法一、初始化雷区:
//如何抽象逻辑
//大概步骤:
//实现这些步骤需要多少行代码? 复杂吗?
//某个函数可以在其他实现中共享
//第一步,用方块填充雷区(根据指定数量构造一个方块实例)
//第2步材质材料,排列方块(布局)
//3步,随机我的
//第四步,显示每个方格周围的地雷数量AroudMineCount
]]]]
//1步,
//根据指定的数量构造一个网格实例:
//多少? 每边有多少个正方形?
//构造一个网格实例
//将方块添加到当前Controls中: this.Controls.Add(pane);
//现在Pane叠加了,现在是第二步,需要布局网格
//第2步,布局网格
//正方形需要2个嵌套循环
//不是特别复杂,不用拿出来
//但是当窗体大小改变时,位置发生改变,即布局重新布局
//方法可以重用:初始化和改变表单大小时
//新方法:LayoutPans - 布局网格
//实现LayontPans
//设置网格的大小和位置:1次循环
//2个嵌套循环
//逐行扫描
//获取有多少列 panLineNum:当前Controls中所有控件数量的平方根
//循环遍历每一列
//将每一行嵌套循环
//在循环最里面做两件事:设置网格的大小和位置
//设置正方形的大小:宽度和高度(外侧)
//Width:当前Controls/panLineNum的宽度
//Height:当前Controls的高度/panLineNum
//放置当前方块:Pane pane = this.Controls[paneIndex] as pane
//返回窗格类型
//paneIndex处理的是哪一点? 默认为0音乐音效,每次处理完会自动+1。
//设置正方形的大小:pane.size=new size(width, height)
//横坐标和纵坐标:x,y
//top: 当前行 * 宽度
//左:当前列*高度
//设置网格的位置:pane.Location=new Point(横坐标,纵坐标)
//现在可以安排了
//设置锚点
//当前窗体大小需要改变时的重新布局
//查找当前雷区的事件
//SizeChanged事件调用布局LayoutPane()
//表单在初始初始化时也会改变大小。
//需要验证this.Controls.count为0时不需要布局
//继续3步,随机挖矿
//方法或算法可能会改变,需要重新抽象
//方法mine:LayMines指定地雷数量
//循环放置地雷
//放置地雷
//窗格pane =(Pane)this.Controls[index]
//pane.Haspane=true;
//索引是随机的
//随机地雷看不到
]]
实现方法2,显示雷区DisPlayAll的所有内容
//通过点击按钮实现
//实现方式是打开所有的方块
//pane.Open //遍历
//判断之前是否已经打开过
//Open未实现,三种方法实现Pane
//Pane是继承button的方法,设置图像拉伸
//需要使用图片作为资源
//方法一:双击--选择资源--添加资源--鼠标拖动
//属性.资源。
//先实现Mark方法
//只需将背景设置为Marked
//设置Pane的状态
//重置方法正好相反,取消
//恢复状态
//再次设置Open方法
//分为状态
//1,什么都没有
//2、地雷
//3、显示数字
//首先判断是否有地雷
//不看ArroundMineCount的数量
//切换...大小写
//完成后就不能再点击 this.enable = NONE;
//完成3个方法
//周围区域1、2、3、4不显示
]]]]
//AroudMineCount未实现,将在初始化时实现
//AroudMineCount为第四步初始化
//每个方格周围的地雷数量
//遍历所有窗格
//需要一个方法,GetAroudMineCount(pane)
//获取当前方格周围的地雷数量
]]]]]]
//实现方法GetAroudMineCount(pane)返回int
//你还需要一个方法来获取当前方块周围的方块列表。
//列表
GetAronndPanes(窗格)
//列表
结果 = 新列表
();
//当前窗格的宽度和高度
每个窗格的变量:foreach(Pane p in this.Controls)
//先求左右两边:高度相同且位置差为1 绝对值Math.Abs
//再次找到顶部和底部:
//再次找到对角:
列表.add(p)
返回结果
//实现GetAroudMineCount(pane)方法
//调用方法
列表
窗格 = this.GetAronndPanes(Pane)
//检查是否有地雷
//返回地雷数量
]]
实现 DisPlayAround 方法
//首先检查当前方格是否开放或者有地雷
//首先自己打开.open
//找到周围的Panes并调用this.GetAronndPanes方法
//遍历周围的窗格扫雷游戏制作扫雷游戏制作,查看周围的地雷数量
//如果为0,则递归复用DisPlayAround方法
//有地雷吗?
//查看是否处于Open状态以及是否有地雷
//打开
//动态事件绑定
//鼠标按下和点击事件
//pane.MouseDown += 自动出来
//括号内定义方法pane_MouseDown
//执行DisPlayArround方法,但是没有实现。
]]
//实现pane_MouseDown方法
//去除非鼠标左键点击和鼠标右键点击事件
//获取当前方块
//左键点击时:1,有地雷,2,没有地雷
//右键时:有标记、无标记
//判断是否扫雷成功
//添加方法IsAllMineSweeped
//执行:
//1、地雷数量和标记数量是否相等
//标记的是否是地雷
//继续执行判断是否扫雷成功
//扫码成功
文章来源:https://blog.csdn.net/weixin_34221036/article/details/94123767