直接上代码吧,并不是特别难以理解的东西 就不多说了
开始类:
public class demo extends JFrame{
static demo jfr = new demo();
static String path = "";
//拼图矩阵
static Icon[][] icon = new ImageIcon[3][3];
static int map[][] = new int[3][3];
//初始设置
static JButton[][] button = new JButton[3][3];
static JMenuBar menubar = new JMenuBar();
static JMenu menu = new JMenu("开始");
static JMenuItem menuitem = new JMenuItem("重置");
public static void main(String[] args){
jfr.setSize(400,400);
jfr.setLayout(new GridLayout(4,4));
demo.init_Frame();
menu.add(menuitem);
menubar.add(menu);
jfr.setJMenuBar(menubar);
jfr.setTitle("Game");
jfr.setVisible(true);
jfr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private static void init_Frame(){
int i,j = 0,x=0;
int count = 0;
int x1 = 0;
//初始化矩阵数组
for(i=0;i<button.length;i++)
for(j=0;j<button[i].length;j++){
map[i][j] = x1++;
}
//初始化按钮并设置图片
for(i=0;i<button.length;i++)
for(j=0;j<button[i].length;j++){
path = "src//pic//"+String.valueOf(count++)+".png";
icon[i][j] = new ImageIcon(path);
button[i][j] = new JButton(icon[i][j]);
}
//添加监听者
for(i=0;i<button.length;i++)
for(j=0;j<button[i].length;j++)
button[i][j].addActionListener(new Mylistener());
//加入按钮
for(i=0;i<button.length;i++)
for(j=0;j<button[i].length;j++)
jfr.add(button[i][j]);
//重置游戏事件
menuitem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
demo.resetGame();
}
});
}
private static void resetGame(){
int i,j = 0,x=0;
int count = 0;
int x1 = 0;
//初始化矩阵数组
for(i=0;i<button.length;i++)
for(j=0;j<button[i].length;j++){
map[i][j] = x1++;
}
for(i=0;i<button.length;i++)
for(j=0;j<button[i].length;j++){
button[i][j].setIcon(icon[i][j]);
}
}
public static JButton[][] getButton(){
return button;
}
public static int[][] getMap(){
return map;
}
}
事件监听:拼图控制
public class Mylistener implements ActionListener {
JButton jbt;
JButton[][] button;
Icon[][] icon;
Icon temp1,temp2,temp3;
String str;
//数组矩阵地图
int[][] map;
int maptemp;
public void actionPerformed(ActionEvent e){
int i,j = 0;
int flag = 0;
int row,col = 0;
map = demo.getMap();
jbt = (JButton)e.getSource();
button = demo.getButton();
//获取空白图像的坐标
for(i=0;i<map.length;i++){
for(j=0;j<map[i].length;j++){
if(map[i][j]==0){
flag = 1;
break;
}
}
if(flag == 1) break;
}
flag = 0;
System.out.println("数组矩阵坐标:"+i+" "+j);
//获取点击事件对象的坐标
for(row=0;row<button.length;row++){
for(col=0;col<button[row].length;col++){
if(jbt==button[row][col]){
flag = 1;
break;
}
}
if(flag==1) break;
}
System.out.println("点击按钮坐标:"+row+" "+col);
//判断空白处是否在点击按钮的上下左右位置,如果是则交换
if((row==i-1 && col==j)||(row==i+1 && col==j)
||(row==i && col==j+1)||(row==i && col==j-1)){
//对矩阵中的值进行交换
maptemp = map[row][col];
map[row][col] = 0;
map[i][j] = maptemp;
//交换图像
temp1 = jbt.getIcon();
temp2 = button[i][j].getIcon();
jbt.setIcon(temp2);
button[i][j].setIcon(temp1);
System.out.println(temp1);
}
}
}
缺点还是有一些的。这个代码并不能直接的对一个完整的图像进行分割,而是我将图片分割好放进去的。工程目录如下
图片名字设置为1到16主要是为了初始化能用循环方便一些。
但是该代码只需要对矩阵的大小进行修改,便可将其从3*3转化为4*4,甚至10*10都是可以的。
效果图: