直接上代碼吧,並不是特別難以理解的東西 就不多說了
開始類:
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都是可以的。
效果圖: