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

  • 相关阅读:
    Android虚拟机 修改IMEI
    Android 真机调试缺少sqlite3
    DouBan FM API
    MySQL 常用命令[不断更新中]
    通过QRCode生成二维码与解码
    Ant 批量打包Android Umeng多渠道版本
    Centos服务器常用配置集合
    MTU详解
    openvswitch-with-conntrack_nat
    NAT介绍及NAT设备类型
  • 原文地址:https://www.cnblogs.com/dyee/p/2321630.html
Copyright © 2020-2023  润新知