先放上最后的效果图:
做了右键插旗和右键自动打开周围方格,但没做右键两次插问号,毕竟我自己扫雷也不太经常用问号,干脆就不做了。
最后有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