A.
继承按钮的类:方格
属性1,是否有地雷 bool HasMine
属性2,获取周围的地雷数 int AroudMineCount
属性3,获取当前方格状态 枚举 State
方法1,打开方格 Open
方法2标记方格 Mark
方法3,去除标记 Reset
//先不实现
B.雷区类:自定义控件
事件1,游戏成功
事件2,游戏失败
方法1,初始化雷区:每边多少个,多少个地雷
方法2,显示雷区所有内容DisPlayAll
方法3,显示周围没有雷的区域DisPlayArround
]]
方法1,初始化雷区:
//如何抽象逻辑
//大概步骤:
//实现步骤有多少行代码?是否复杂
//某段函数在别的实现里可以共用
//1步,用方格填充雷区(根据指定数量构建方格实例)
//2步,排列方格(布局)
//3步,随机布雷
//4步,显示每个方格周围的地雷数AroudMineCount
]]]]
//1步,
//根据指定数量构建方格实例:
//多少个?每边多少个的平方
//构建方格实例
//将方格添加到当前Controls里面:this.Controls.Add(pane);
//现在Pane是叠加的,现在就是第2步了,需要布局方格了
//2步,布局方格
//正方形需要2次嵌套循环
//不是特别复杂,不用拿出去
//但是改变窗体大小的时候,位置是变化的,即重新布局
//方法可以重用:初始化和改变窗体大小的时候
//新建方法:LayoutPans - 布局方格
//实现LayontPans
//设置方格的大小和位置:1个循环
//2次嵌套循环
//逐行扫描
//获取有多少列panLineNum:当前Controls里所有控件的数量开平方
//每一列进行循环
//嵌套每一行进行循环
//在循环的最里面做2件事情:设置方格的大小和位置
//设置方格的大小:宽度和高度(外面)
//宽度:当前Controls的宽度/panLineNum
//高度:当前Controls的高度/panLineNum
//放置当前方格:Pane pane = this.Controls[paneIndex] as pane
//返回pane类型
//paneIndex是处理哪一个点?默认为0,每次处理完自动+1
//设置方格的大小:pane.size=new size(宽度,高度)
//横坐标和纵坐标:x,y
//top:当前行*宽度
//left:当前列*高度
//设置方格的位置:pane.Location= new Point(横坐标,纵坐标)
//现在已经可以排列开了
//设置锚点
//需要改变当前form大小时重新布局
//找到当前雷区的事件
//SizeChanged事件调用布局LayoutPane()
//窗体最开始初始化时也是改变大小
//需要验证this.Controls.count为0时不需要布局
//继续进行3步,随机布雷
//方法或者算法有可能会改变需要重新抽象
//方法布雷:LayMines 指定地雷的数量
//循环放置地雷
//放置地雷
//Pane pane =(Pane)this.Controls[index]
//pane.Haspane=true;
//index是随机
//随机布雷看不出来
]]
实现方法2,显示雷区所有内容DisPlayAll
//通过点击按钮实现
//实现就是把所有的方格都翻开
//pane.Open //遍历
//判断之前是否被翻开
//Open未实现,去实现Pane的3个方法
//Pane是继承button的方法,设置图像拉伸
//图像需要作为资源
//方法1:双击--选择资源---添加资源---鼠标拖地
//Properties.Resources.
//先实现Mark方法
//设置背景为Marked就可以了
//设置Pane的状态
//Reset方法正好相反,取消
//恢复状态
//再次设置Open方法
//分状态
//1,什么也没有
//2,地雷
//3,显示数字
//先判断是否有地雷
//没有看ArroundMineCount的个数
//Switch...case
//完成后就不能再点击了 this.enable = NONE;
//完成3个方法了
//四周1,2,3,4没有显示出来
]]]]
//AroudMineCount没有实现,在初始化去实现
//AroudMineCount是初始化的第4步
//每个方格周围的地雷数
//遍历全部pane
//需要一个方法,GetAroudMineCount(pane)
//获取当前方格四周的地雷数
]]]]]]
//实现方法GetAroudMineCount(pane)返回int
//还需要获取当前方格周围方格的列表的方法
//List<Pane> GetAronndPanes(Pane)
//list<Pane> result = new List<pane>();
//当前的pane的宽度和高度
变量每一个Pane:foreach(Pane p in this.Controls)
//先找左右边:高度相同,位置相差1 绝对值 Math.Abs
//再找上下边:
//再找对角:
list.add(p)
返回result
//实现GetAroudMineCount(pane)方法
//调用方法
List<Pane>panes = this.GetAronndPanes(Pane)
//查看是否有地雷
//返回地雷数
]]
实现DisPlayAround方法
//先查看当前方格是否被打开或者有地雷
//首先是自己翻开.open
//找到四周的Panes,调用this.GetAronndPanes方法
//遍历四周的panes,看他四周的地雷数
//如为0,重用方法DisPlayAround方法递归
//有地雷呢?
//看看是否是Open状态和是否有地雷
//打开
//动态的事件绑定
//鼠标按下和点击的事件
//pane.MouseDown += 自动出来
//定义括号里的方法 pane_MouseDown
//执行DisPlayArround方法,但是都没有实现
]]
//实现pane_MouseDown方法
//去除非鼠标左键点击和鼠标右键点击事件
//获取当前方格
//左键时:1,有地雷,2无地雷
//右键时:标记,无标记
//判断扫雷是否成功
//添加方法IsAllMineSweeped
//实现方法:
//1,地雷的数量和标记的数量是否相等
//被标记的是否是地雷
//继续实现判断扫雷是否成功
//扫除成功