zoukankan      html  css  js  c++  java
  • c# 扫雷游戏制作步骤

    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,地雷的数量和标记的数量是否相等
    //被标记的是否是地雷
    //继续实现判断扫雷是否成功
    //扫除成功

  • 相关阅读:
    阿里消息队列中间件 RocketMQ 源码分析 —— Message 拉取与消费(上)
    数据库中间件 ShardingJDBC 源码分析 —— SQL 解析(三)之查询SQL
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 解析(六)之删除SQL
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 解析(五)之更新SQL
    消息队列中间件 RocketMQ 源码分析 —— Message 存储
    源码圈 300 胖友的书单整理
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 路由(一)分库分表配置
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 解析(四)之插入SQL
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 路由(二)之分库分表路由
    C#中Math类的用法
  • 原文地址:https://www.cnblogs.com/dyee/p/2321630.html
Copyright © 2011-2022 走看看