基于JAVA的简单扫雷

先放上最后的效果图:在这里插入图片描述
做了右键插旗和右键自动打开周围方格,但没做右键两次插问号,毕竟我自己扫雷也不太经常用问号,干脆就不做了。
最后有github链接。

界面设计

主体
上面的剩余数量,时间和用于重新开始的笑脸按钮:在这里插入图片描述
扫雷区域:
在这里插入图片描述

数据结构

    //用一个二位数组来和JButton二维数组对应,存储雷的数据
    Mine[][] mines=new Mine[ROW][COL];
    JButton[][] btns=new JButton[ROW][COL];
    
    int ROW =17;		//行数
    int COL =30;		//列数
    int MINES=99;		//雷的数量
    int unopen=99;		//还没标记的雷的数量
    int opend=0;		//已经翻开的格子的数量
    int seconds=0;		//用于计时
    boolean flag=false;		//用于标记是否开始

    其中Mine是自己定义的类
    public class Mine{
    int data;
    boolean isOpen;
    boolean isFlag;
    Mine() {
        data = 0;
        isOpen = false;
        isFlag=false;
    }
}

需要处理的事件

按事件发生顺序排列

  • 随及分配雷给各个格子
  • 根据雷生成周围格子的数
  • 点击格子后计时器开始
  • 格子数为0时自动展开周围为0的格子
  • 右键插旗,再次点击取消插旗
  • 失败或成功后计时器停止
  • 失败后所有格子不能再点击
  • 点击笑脸重新开始游戏

遇到的一些问题

  • JButton的isEnabled()设置对MouseListener无效,所以设置了false后还是可以点击,于是干脆就在打开格子的条件里加上了isEnabled()。
  • 放在格子里的icon如果不设置大小会出现满处Button的情况,但ImageIcon并没有自己的设置大小的函数,所以就要用awt.Image中的getScaledInstance(),以笑脸为例:
ImageIcon smile=new ImageIcon("D:\\sya\\eclipse-work-space\\saolei\\src\\smile.png");
smile.setImage(smile.getImage().getScaledInstance(40, 40, Image.SCALE_DEFAULT));
     //40,40即为需要调整的大小

附上gitbub链接:
https://github.com/drbbr/saolei

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页