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();//循环播放 } }