键盘监听,让按A就可以显示原图
由于之前上下键的时候用过,就不用再写一边键盘监听,我们可以在键盘按下时,显示全图,键盘松开时可以显示原来玩到的地方,
//按下不松时会调用这个方法
@Override
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if(code==65){
//将界面中所有图片删除
this.getContentPane().removeAll();
//加载一张完整的图片
JLabel all = new JLabel(new ImageIcon(path + "all.jpg"));
all.setBounds(83,134,420,420);
this.getContentPane().add(all);
//加载背景图片
JLabel background = new JLabel(new ImageIcon("puzzlegame\\image\\background.png"));
background.setBounds(40,40,508,560);
this.getContentPane().add(background);
this.getContentPane().repaint();
}
}
图片松开时:
else if(code == 65){
initImage();
}
按W就可以直接显示答案
再键盘松开那里再添加一个关于w的条件判断
else if(code == 87){
x=3;
y=3;
date = new int[][]{
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,0}
};
initImage();
}
直接new 一个 正确图片的数组给我们的二维数组
因为之前说了二维数组是写在了成员变量位置
我们再实现一个胜利的效果而且胜利后不能继续动的代码
判断是否胜利抽取出来的代码
如果胜利了我们再把胜利的图像也显示再界面上边
public boolean victory(){
for (int i = 0; i < date.length; i++) {
for (int j = 0; j < date[i].length; j++) {
//有一个不一样返回false
if(date[i][j] != win[i][j]){
return false;
}
}
}
return true;
}
if (victory()) {
JLabel winJLabel = new JLabel(new ImageIcon("C:\\Users\\137111\\IdeaProjects\\Study\\puzzlegame\\image\\win.png"));
winJLabel.setBounds(203,283,197,73);
this.getContentPane().add(winJLabel);
}
在键盘松开那里,再把如果胜利了,就return(也就是不移动的意思)
按菜单栏的选项实现对应业务逻辑(用到动作监听,鼠标单击实现)
公众号,和重新游戏,重新登录,退出游戏的业务逻辑实现
注意实现这个鼠标点击的接口,因为我们只要鼠标点击就可以,所以选的动作监听
注意把这几个选项下的条目放在外边,因为我们实现的时候还要重写对应的代码
老样子,实现监听
@Override
public void actionPerformed(ActionEvent e) {
//获取当前被点击的条目对象
Object obj = e.getSource();
if(obj == replayItem){
System.out.println("重新游戏");
//计数器清零,再加载图片
count = 0;
//打乱二维数组
initDate();
//重新加载图片
initImage();
}else if(obj == reLoginItem){
System.out.println("重新登录");
//关闭当前界面
this.setVisible(false);
//打开登录界面
new LoginJFrame();
}else if(obj == closeItem){
System.out.println("关闭游戏");
System.exit(0);
}else if(obj == accountItem){
System.out.println("公众号");
JDialog jDialog = new JDialog();
//创建一个管理图片的容器jlabbel
JLabel jLabel = new JLabel(new ImageIcon("C:\\Users\\137111\\IdeaProjects\\Study\\puzzlegame\\image\\qq_pic_merged_1677995525146.jpg"));
jLabel.setBounds(0,0,350,350);
jDialog.getContentPane().add(jLabel);
jDialog.setSize(400,400);
jDialog.setAlwaysOnTop(true);
jDialog.setLocationRelativeTo(null);
//使写完后必须要先关闭窗口才能移动主界面
jDialog.setModal(true);
jDialog.setVisible(true);
}
}
关于这个jDialog 大家可以理解为类似JFrame的窗口,不过他是临时的,具体设置也和JFrame一样
实现记步数这个功能
再成员变量中定义一个count,在移动时++,在重新游戏时清零