java 移动图 java拼图拖动图片_java 移动图

 

 

package java拼图;

import java.awt.Rectangle;

import javax.swing.Icon;
import javax.swing.JButton;

public class Cell extends JButton{
    public static final int IMAGEWIDTH=100;
    public static final int IMAGEHEIGHT=100;//图片宽度
    private int place;//图片位置
    public Cell(Icon icon,int palce) {
        this.setSize(IMAGEWIDTH,IMAGEWIDTH);
        this.setIcon(icon);
        this.place=place;
    }
    
    //移动图片单元的办法
    public void move(Direction dir) {
        Rectangle rec=this.getBounds();//获取图片的rectangle对象
        //Rectangle 指定坐标空间中的一个区域,通过坐标空间中 Rectangle 对象左上方的点 (x,y)、宽度和高度可以定义这个区域。
        switch(dir){
            case UP:
                this.setLocation(rec.x,rec.y-IMAGEWIDTH);
                break;
            case DOWN:
                this.setLocation(rec.x,rec.y+IMAGEWIDTH);
                break;
            case LEFT:
                this.setLocation(rec.x-IMAGEWIDTH, rec.y);
                break;
            case RIGHT:
                this.setLocation(rec.x+IMAGEWIDTH, rec.y);
                break;
        }
    }
    
    public int getX() {
        return this.getBounds().x;//获取单元图片的x坐标
        
    }
    public int getY() {
        return this.getBounds().y;
    }
    public int getPlace() {
        return place;
    }
    
    
    
    
//定义一个枚举类型表示移动方向
    public  enum Direction{UP,DOWN,LEFT,RIGHT}
    
}
package java拼图;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import java拼图.Cell.Direction;

public class GamePanel extends JPanel implements MouseListener{
       Icon icon=null;
        private Cell[] cells=new Cell[9];
        private Cell  cellBlank=null;
        public GamePanel() {
            super();
            setLayout(null);
            init();
        }
        public void init() {
            int x=0,y=0,w=50,h=50;
            BufferedImage src=null;
            BufferedImage newpic=null;
            try {
                src=ImageIO.read(new File("images\\link.jpg"));
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            int num=0;//图片序号
            Cell cell=null;//单元图片对象
            for(int i=0;i<3;i++) {//分割图片时的行
                for(int j=0;j<3;j++) {//列
                    num=i*3+j;
                    x=j*100;
                    y=i*100;
                    newpic=src.getSubimage(x, y, w, h);
                    if(num+1==9)
                        icon=new ImageIcon("images\\图片9.png");
                    else
                        icon=new ImageIcon(newpic);
                    cell=new Cell(icon,num);
                    cell.setLocation(j*cell.IMAGEWIDTH,i*Cell.IMAGEHEIGHT);
                    cells[num]=cell;
                    
                }
            }
            for(int i=0;i<cells.length;i++) {
                this.add(cells[i]);
            }
        }
        
        
        
        
        //对图片进行随机排序
        public void random() {
            Random random=new Random();
            int m,n,x,y;
            if(cellBlank==null) {
                cellBlank=cells[cells.length-1];
                for(int i=0;i<cells.length;i++) {
                    if(i!=cells.length-1) {
                        cells[i].addMouseListener(this);
                    }
                }
            }
            for(int i=0;i<cells.length;i++) {
                m=random.nextInt(cells.length);
                n=random.nextInt(cells.length);
                x=cells[m].getX();
                y=cells[m].getY();
                cells[m].setLocation(cells[n].getX(),cells[n].getY());
                cells[n].setLocation(x,y);
                
            }
        }
        @Override
        public void mouseClicked(MouseEvent e) {
            // TODO Auto-generated method stub
            Cell cell=(Cell)e.getSource();//获取触发事件的对象
            int x=cells[8].getX();
            int y=cells[8].getY();
            if((x-cell.getX())==Cell.IMAGEWIDTH&&cell.getY()==y) {//左右移动
                cell.move(Direction.RIGHT);
                cellBlank.move(Direction.LEFT);
            }
            if((x-cell.getX())==-Cell.IMAGEWIDTH&&cell.getY()==y) {
                cell.move(Direction.LEFT);
                cellBlank.move(Direction.RIGHT);
            }
            if((cell.getX())==x&&cell.getY()-y==Cell.IMAGEHEIGHT) {//上下移动
                cell.move(Direction.UP);
                cellBlank.move(Direction.DOWN);
            }
            if((cell.getX())==x&&cell.getY()-y==-Cell.IMAGEHEIGHT) {//上下移动
                cell.move(Direction.DOWN);
                cellBlank.move(Direction.UP);
            }
            //判断是否成功
            if(isSuccess()) {
                int i=JOptionPane.showConfirmDialog(this,"win!Do you want play again?","win",JOptionPane.YES_NO_OPTION);
                if(i==JOptionPane.YES_OPTION) {
                    random();//重新开始一局
                }
            }
            
        }
        @Override
        public void mouseEntered(MouseEvent e) {
            // TODO Auto-generated method stub
            
        }
        @Override
        public void mouseExited(MouseEvent e) {
            // TODO Auto-generated method stub
            
        }
        @Override
        public void mousePressed(MouseEvent e) {
            // TODO Auto-generated method stub
            
        }
        @Override
        public void mouseReleased(MouseEvent e) {
            // TODO Auto-generated method stub
            
        }
        
        
        public boolean isSuccess() {
            for(int i=0;i<cells.length;i++) {
                int x=cells[i].getX();
                int y=cells[i].getY();
                if(i!=0) {
                    if(y/Cell.IMAGEHEIGHT*3+x/Cell.IMAGEWIDTH!=cells[i].getPlace()) {
                        return false;
                    }
                }
            }
            return true;
        }
        
        
        
        
        
        
        
        
        
        
        
        
        
}
package java拼图;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MainFrame extends JFrame {
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            //EventQueue 是一个与平台无关的类,它将来自于底层同位体类和受信任的应用程序类的事件列入队列。
            //invokeLater

//public static void invokeLater(Runnable runnable)
//导致 runnable 的 run 方法在 the system EventQueue 的指派线程中被调用。
            public void run() {
                MainFrame frame=new MainFrame();
                new Music();
                frame.setVisible(true);
            }
        });
    }
    public MainFrame() {
        super();
        getContentPane().setLayout(new BorderLayout());
        setTitle("拼图游戏");
        setBounds(300,300,358,414);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JPanel panel=new JPanel();
        getContentPane().add(panel, BorderLayout.NORTH);
        final GamePanel gamePanel=new GamePanel();
        getContentPane().add(gamePanel, BorderLayout.CENTER);
        final JButton button=new JButton();
        button.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent arg0) {
                // TODO Auto-generated method stub
                gamePanel.random();
                
            }
        });
        button.setText("开始");
        panel.add(button);
        
    }

}
package java拼图;

import java.applet.Applet;
import java.applet.AudioClip;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;

public class Music {//在游戏里导入音乐的方法!!!!!!!
  File f;
  URI uri;
  URL url;
  Music(){
      f=new File("D:/1.wav");
      uri=f.toURI();
      try {
        url=uri.toURL();
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
      AudioClip auu;//AudioClip 接口是用于播放音频剪辑的简单抽象。多个 AudioClip 项能够同时播放,得到的声音混合在一起可产生合成声音。
      auu=Applet.newAudioClip(url);
      auu.loop();//循环播放
      
  }
}