整体代码:
建一个 “L” 游戏拼图类
package pintu;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.WindowConstants;
import javax.swing.border.BevelBorder;
public class L extends JFrame implements KeyListener,ActionListener{
int[][] data=new int[4][4];
int x,y;//表示空白图片的位置
JMenuItem j1=new JMenuItem("重新游戏");
JMenuItem j2=new JMenuItem("结束游戏");
public L() {
chuangti();
caidan();
daluan();
image();
this.addKeyListener(this);
this.setVisible(true);//可视化
}
//窗体搭建
public void chuangti() {
this.setTitle("拼图 游戏");//创建标题
this.setSize(700,650);//设置窗体大小
this.setAlwaysOnTop(true);//页面锁定置前
this.setLocationRelativeTo(null);//将页面居中
this.setDefaultCloseOperation(3);//设置关闭模式
this.setLayout(null);//取消默认的排列方式
}
//菜单搭建
public void caidan() {
JMenuBar jmbar=new JMenuBar();
JMenu jm=new JMenu("功能");
/* JFrame jFrame = new JFrame();
//设置界面宽高
jFrame.setSize(683,680);
//设置界面的标题
jFrame.setTitle("事件演示");
//设置界面置顶
jFrame.setAlwaysOnTop(true);
//设置界面居中
jFrame.setLocationRelativeTo(null);
//设置关闭模式
jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//取消默认的居中放置,只有取消了才会按照xy轴的形式添加组件
jFrame.setLayout(null);
//创建一个按钮对象
JButton jtb = new JButton("点我");
//设置位置和宽高
jtb.setBounds(0, 0, 100, 50);
//给按钮添加动作监听
//jtb:组件对象,便是你要给那个组件添加事件
//addActionListener:表示我要给组件添加哪个事件监听(动作监听包含鼠标左键点击,空格)
//参数:表示事件被触发之后要执行的代码
//jtb.addActionListener(new MyActionListener());
jtb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("哒咩~不要点我");
}
});
//把按钮添加到界面当中
jFrame.getContentPane().add(jtb);
jFrame.setVisible(true);
*/
j1.addActionListener(this);
j2.addActionListener(this);
jm.add(j1);
jm.add(j2);
jmbar.add(jm);
this.setJMenuBar(jmbar);
}
//加载图片
public void image() {
this.getContentPane().removeAll();;//删除原来的图片
//开始插入图片
for(int i=0;i<4;i++) {
for(int j=0;j<4;j++) {
ImageIcon imag=new ImageIcon("D:\\微信\\WeChat Files\\wxid_p2eptga2l6ci22\\FileStorage\\File\\2023-11\\拼图小游戏_image\\image\\animal\\animal1\\"+data[i][j]+".jpg");
JLabel jl=new JLabel(imag);
jl.setBounds(j*80+110,i*80+100,80,80);
jl.setBorder(new BevelBorder(1));
this.getContentPane().add(jl);
}
}
//插入背景图篇
ImageIcon im=new ImageIcon("D:\\拼图小游戏_image\\image\\background.png");
JLabel jl=new JLabel(im);
jl.setBounds(50,15,520,540);
this.getContentPane().add(jl);
this.repaint();//刷新
}
//打乱图片
public void daluan() {
int[] t={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
Random r=new Random();
for(int i=0;i<16;i++) {
int index=r.nextInt(16);
int c=t[index];
t[index]=t[i];
t[i]=c;
}
for(int i=0;i<16;i++) {
if(t[i]==0) {
x=i/4;
y=i%4;
}
data[i/4][i%4]=t[i];
}
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
int code=e.getKeyCode();//获得键盘
System.out.println(code);
if(code==40) {
//下
if(x==3) {
return ;
}
int c;
c=data[x][y];
data[x][y]=data[x+1][y];
data[x+1][y]=c;
x++;
image();
}
else if(code==39) {
//右
if(y==3) {
return ;
}
int c=data[x][y];
data[x][y]=data[x][y+1];
data[x][y+1]=c;
y++;
image();
}
else if(code==38) {
//上
if(x==0) {
return ;
}
int c=data[x][y];
data[x][y]=data[x-1][y];
data[x-1][y]=c;
x--;
image();//加载图片
}
else if(code==37) {
//左
if(y==0) {
return ;
}
int c=data[x][y];
data[x][y]=data[x][y-1];
data[x][y-1]=c;
y--;
image();
}
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Object s=e.getSource();//获取点击事件
if(s==j1) {
//重新游戏
System.out.println("点击了重新游戏");
daluan();
image();
}
else if(s==j2) {
//结束游戏
System.out.println("点击了结束游戏");
System.exit(0);
}
}
}
建立一个测试类:
package pingtu;
public class M{
public static void main(String[] args) {
new L();
}
}