Jigsaw puzzle

From , 3 Years ago, written in Java, viewed 82 times.
URL https://pastebin.vip/view/81c8727c
  1. package org.vv.game.frame;  
  2.  
  3. import java.awt.AWTException;  
  4. import java.awt.Color;  
  5. import java.awt.Font;  
  6. import java.awt.Graphics;  
  7. import java.awt.Rectangle;  
  8. import java.awt.Robot;  
  9. import java.awt.Toolkit;  
  10. import java.awt.event.ComponentEvent;  
  11. import java.awt.event.ComponentListener;  
  12. import java.awt.event.KeyEvent;  
  13. import java.awt.event.KeyListener;  
  14. import java.awt.event.MouseEvent;  
  15. import java.awt.event.MouseListener;  
  16. import java.awt.event.MouseMotionListener;  
  17. import java.awt.image.BufferedImage;  
  18. import java.io.File;  
  19. import java.io.FileInputStream;  
  20. import java.io.FileNotFoundException;  
  21. import java.io.IOException;  
  22. import java.io.InputStream;  
  23.  
  24. import javax.imageio.ImageIO;  
  25. import javax.swing.JFileChooser;  
  26. import javax.swing.JFrame;  
  27. import javax.swing.JOptionPane;  
  28.  
  29. import org.vv.game.util.ExampleFileFilter;  
  30. import org.vv.game.util.ImageSelector;  
  31. import org.vv.game.util.ImageUtil;  
  32. import org.vv.game.vo.ImageSegment;  
  33.  
  34. /**
  35.  * @author 俞立全  E-mail:vv_2048@163.com
  36.  * @version 创建时间:Feb 21, 2010 9:21:09 PM  
  37.  * 类说明 拼图游戏
  38.  */  
  39. @SuppressWarnings("serial")  
  40. public class NineImageFrame extends JFrame implements MouseListener,MouseMotionListener,KeyListener,ComponentListener, Runnable {  
  41.  
  42.     // 取得屏幕的宽度  
  43.     int screenWidth = Toolkit.getDefaultToolkit().getScreenSize().width;  
  44.     // 取得屏幕的高度  
  45.     int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height;  
  46.     // 游戏网格设置  
  47.     // 设置分割数量 2,3,4,5,6  
  48.     int size = 3;  
  49.     // 上边距  
  50.     int top = 35;  
  51.     // 左边距  
  52.     int left = 13;  
  53.     // 右边距  
  54.     int right = 220;  
  55.     // 下边距  
  56.     int bottom = 13;  
  57.      
  58.     // 窗体可变参数,窗体放缩比例  
  59.     int wSize = 400;  
  60.     // 窗体的高度  
  61.     int height = top + bottom + wSize; //400  
  62.     // 窗体的宽度  
  63.     int width = left + right + wSize; //510  
  64.     //游戏区域  
  65.     int wLength = width - left - right;  
  66.     int hLength = height - top - bottom;  
  67.     // 方格的长宽  
  68.     int xLength = wLength / size;  
  69.     int yLength = hLength / size;  
  70.  
  71.     // 背景图片  
  72.     BufferedImage bgImage = null;  
  73.      
  74.     private final int smallImageWidth = 200;  
  75.     private final int smallImageHeight = 200;  
  76.     // 缩略图片  
  77.     BufferedImage smallImage;  
  78.     // 保持拼图板的位置  
  79.     ImageSegment[][] allImages = new ImageSegment[size][size];  
  80.     BufferedImage[][] allImagesCopy = new BufferedImage[size][size];  
  81.     // 保存正确图版的位置  
  82.     ImageSegment[][] allImagesTmp = new ImageSegment[size][size];  
  83.     // 保存最多拥有多少时间(秒)  
  84.     int maxTime = 60;  
  85.     // 做倒计时的线程类  
  86.     Thread t = new Thread(this);  
  87.     // 保存剩余时间  
  88.     int remainingTime = 30;  
  89.     // 提示  
  90.     String gameMessage = " 无限制";  
  91.     // 图片数量  
  92.     int bkNum = 11;  
  93.     // 游戏是否停止  
  94.     boolean canPlay = true;  
  95.     // 空白数字设置最后一块  
  96.     int blankNum = size * size - 1;  
  97.     // 空白块的数组编号  
  98.     int blankImageX = 0;  
  99.     int blankImageY = 0;  
  100.     // 预设字体  
  101.     Font f1 = new Font("黑体", Font.BOLD, 40);  
  102.  
  103.     //默认包中的图片  
  104.     private String imagePackage = "/image/def/";  
  105.     //保存选择的图片路径  
  106.     private String selFilePath = null;  
  107.     //判断选择图片还是目录  
  108.     private boolean isDir = false;  
  109.     //private String selDirPath = null;  
  110.     //缩略图放大镜方块  
  111.     private int magnifierX = 20;  
  112.     private int magnifierY = 20;  
  113.     private int magnifierWidth= 200;//smallImageWidth/2;  
  114.     private int magnifierHeight = 200;//smallImageHeight/2;  
  115.     private BufferedImage magnifierBufferedImage;  
  116.     private boolean showMagnifier = false;  
  117.      
  118.     // Font f2 = new Font("黑体", Font.BOLD, 80);  
  119.      
  120.     //private ImageIcon gifImage;  
  121.      
  122.     //三个按钮  
  123.     private BufferedImage[] btnImage = new BufferedImage[3];  
  124.      
  125.      
  126.     public NineImageFrame() {  
  127.         initialize();  
  128.     }  
  129.      
  130.     public void initialize(){  
  131.         // 设置标题  
  132.         this.setTitle("拼图 vv_2048@163.com");  
  133.         // 设置窗体大小  
  134.         this.setSize(width, height);  
  135.         // 设置窗体出现位置 居中显示  
  136.         this.setLocation((screenWidth - width) / 2,  
  137.                         (screenHeight - height) / 2);  
  138.         // 将窗体设置为大小可改变  
  139.         //this.setResizable(true);  
  140.         // 将窗体的关闭方式设置为默认关闭后程序结束  
  141.         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  142.         // 为窗体加入鼠标监听器  
  143.         this.addMouseListener(this);  
  144.         // 为窗体加入鼠标监听器  
  145.         this.addMouseMotionListener(this);  
  146.         // 为窗体加入键盘监听器  
  147.         this.addKeyListener(this);  
  148.         //添加 ComponentListener  
  149.         this.addComponentListener(this);  
  150.  
  151.         // 加载背景图片  
  152.         //String imagePath = "";  
  153.         try {  
  154.              
  155.             bgImage = ImageIO.read(ImageSelector.getInstance().getRandomJarImage(this.getClass(),"/image/background/",12,"","gif"));  
  156.             //按钮背景  
  157.             btnImage[0] = ImageIO.read(getClass().getResource("/image/btn1.png"));  
  158.             btnImage[1] = ImageIO.read(getClass().getResource("/image/btn2.png"));  
  159.             btnImage[2] = ImageIO.read(getClass().getResource("/image/btn3.png"));  
  160.              
  161.         } catch (IOException e) {  
  162.             e.printStackTrace();  
  163.         }  
  164.  
  165.         // 加载鼠标光标  
  166.         /*
  167.          * Toolkit tk=Toolkit.getDefaultToolkit(); Image img=new
  168.          * ImageIcon(getClass().getResource("/image/point.jpg")).getImage();
  169.          * mouse.gif是你的图标 Cursor cu=tk.createCustomCursor(img,new
  170.          * Point(10,10),"stick"); this.setCursor(cu);
  171.          */  
  172.          
  173.         try {  
  174.             //随机图片  
  175.             InputStream is = ImageSelector.getInstance().getRandomJarImage(this.getClass(),imagePackage,bkNum,"bk","jpg");  
  176.             // 初始化数据  
  177.             this.initData(is);  
  178.             is.close();  
  179.         } catch (IOException e) {  
  180.             e.printStackTrace();  
  181.         }  
  182.          
  183.         //gif动画  
  184.         //gifImage = new ImageIcon(getClass().getResource("/image/121212.gif"));  
  185.  
  186.         // 将窗体显示出来  
  187.         this.setVisible(true);  
  188.  
  189.         // 刷新屏幕,防止开始游戏时出现无法显示的情况.  
  190.         // this.repaint();  
  191.     }  
  192.      
  193.      
  194.  
  195.     public void paint(Graphics g) {  
  196.          
  197.         height = this.getHeight();  
  198.         width = this.getWidth();  
  199.  
  200.         xLength = (width - left - right) / size;  
  201.         yLength = (height - top - bottom) / size;  
  202.          
  203.         // 双缓冲技术防止屏幕闪烁  
  204.         BufferedImage bi = new BufferedImage(width, height,  
  205.                 BufferedImage.TYPE_INT_RGB);  
  206.         Graphics g2 = bi.createGraphics();  
  207.         g2.setColor(Color.BLACK);  
  208.         // 绘制背景  
  209.         if (bgImage != null) {  
  210.             int imageWidth = bgImage.getWidth(this);  
  211.             int imageHeight = bgImage.getHeight(this);  
  212.             // 背景图片平铺  
  213.             for (int ix = 0; ix < width; ix += imageWidth) {  
  214.                 for (int iy = 0; iy < height; iy += imageHeight) {  
  215.                     g2.drawImage(bgImage, ix, iy, this);  
  216.                 }  
  217.             }  
  218.             // System.out.println("image");  
  219.         }  
  220.         // 输出标题信息  
  221.         // g2.setFont(new Font("黑体", Font.BOLD, 12));  
  222.         // g2.drawString("游戏信息:", 130, 60);  
  223.  
  224.         // 绘制拼图图片  
  225.         // g2.drawImage(segmentImage, left, top,200,100,100,100,200,200,this);  
  226.          
  227.         // 绘制缩略图  
  228.         g2.drawImage(smallImage, width - left - right + 20, top,smallImageWidth,smallImageHeight, this);  
  229.         g2.drawRect(width - left - right + 20, top, smallImageWidth, smallImageHeight);  
  230.          
  231.         // 绘制数据  
  232.  
  233.         //g2.setFont(f1);  
  234.         // 获取字符串的高度和宽度  
  235.         //FontMetrics fm = sun.font.FontDesignMetrics.getMetrics(f1);  
  236.         //int fh = fm.getHeight();  
  237.          
  238.         for (int i = 0; i < allImages.length; i++) {  
  239.             for (int j = 0; j < allImages.length; j++) {  
  240.                 allImagesCopy[i][j]= ImageUtil.resize(allImages[i][j].getImage(), xLength, yLength,false);  
  241.                 if(allImages[i][j].isShow()){  
  242.                     g2.drawImage(allImagesCopy[i][j], i * xLength + left, j * yLength + top, this);  
  243.                 }  
  244.                 /*int fw = fm.stringWidth(String.valueOf(allImages[i][j].getId()));
  245.                 g2.drawString(String.valueOf(allImages[i][j].getId()), i *
  246.                 xLength + xLength / 2 + left - fw / 2, j * yLength + top +
  247.                 yLength / 2 + fh / 2 - 10);*/  
  248.             }  
  249.         }  
  250.         //重新开始按键区域  
  251.         g2.drawRect(width - left - right + 20, top+smallImageHeight+10, smallImageWidth, 40);  
  252.         //选择图片按键区域  
  253.         g2.drawRect(width - left - right + 20, top+smallImageHeight+60, smallImageWidth, 40);  
  254.         // 刷新  
  255.         g2.drawRect(width - left - right + 20, top+smallImageHeight+110, smallImageWidth, 40);  
  256.         // 绘制按钮  
  257.         g2.drawImage(this.btnImage[0],width - left - right + 20,top+smallImageHeight+10,this);  
  258.         g2.drawImage(this.btnImage[1],width - left - right + 20,top+smallImageHeight+60,this);  
  259.         g2.drawImage(this.btnImage[2],width - left - right + 20,top+smallImageHeight+110,this);  
  260.         // 在标题中显示剩余时间  
  261.         this.setTitle("拼图 " + gameMessage);  
  262.          
  263.         //绘制放大镜  
  264.         int wLength = width - left - right;  
  265.         int hLength = height - top - bottom;  
  266.         if(this.showMagnifier){  
  267.             g2.drawRect(this.magnifierX, this.magnifierY, this.magnifierWidth, this.magnifierHeight);  
  268.             g2.drawImage(this.magnifierBufferedImage, left, top,wLength,hLength, this);  
  269.         }  
  270.         // 绘制网格  
  271.          
  272.         for (int i = 0; i <= size; i++) {  
  273.             g2.drawLine(left, top + yLength*i, width - right-1, top + yLength*i);  
  274.             g2.drawLine(left + xLength * i,top, left + xLength * i, height - bottom-1);  
  275.         }  
  276.          
  277.         //gif 动画测试  
  278.         /*try {
  279.             g2.drawImage(ImageIO.read(getClass().getResource("/image/121212.gif")),50,50,200,200,this);
  280.         } catch (FileNotFoundException e) {
  281.             e.printStackTrace();
  282.         } catch (IOException e) {
  283.             e.printStackTrace();
  284.         }*/  
  285.         //g2.drawImage(gifImage.getImage(), 50,50, 200,200,this);  
  286.  
  287.          
  288.         g.drawImage(bi, 0, 0, this);  
  289.     }  
  290.  
  291.      
  292.     public void mouseClicked(MouseEvent e) {  
  293.         //鼠标双击  
  294.         if(e.getClickCount()==2){  
  295.              
  296.         }  
  297.         //检测鼠标右键单击  
  298.         if(e.isMetaDown()){  
  299.              
  300.         }  
  301.     }  
  302.  
  303.     public void mouseEntered(MouseEvent e) {  
  304.         //System.out.println(e.getX());  
  305.     }  
  306.  
  307.     public void mouseExited(MouseEvent e) {  
  308.  
  309.     }  
  310.  
  311.     @SuppressWarnings("deprecation")  
  312.     public void mousePressed(MouseEvent e) {  
  313.         if (canPlay && e.getX() >= left && e.getX() <= width-right && e.getY() >= top  
  314.                 && e.getY() <= height) {  
  315.             // 获取窗格相对坐标  
  316.             int x = e.getX() - left;  
  317.             int y = e.getY() - top;  
  318.             // 计算数组序列  
  319.             int ptX = x / xLength;  
  320.             int ptY = y / yLength;  
  321.             // 判断上下左右四个方向是否存在空砖块,假设9为空白。  
  322.             ImageSegment tmp;  
  323.  
  324.             if (allImages[ptX][ptY].getId() != blankNum) {  
  325.                 // 上  
  326.                 if (y - yLength > 0  
  327.                         && allImages[ptX][ptY - 1].getId() == blankNum) {  
  328.                     tmp = allImages[ptX][ptY];  
  329.                     allImages[ptX][ptY] = allImages[ptX][ptY - 1];  
  330.                     allImages[ptX][ptY - 1] = tmp;  
  331.                     // 保存空白块的位置  
  332.                     blankImageY = blankImageY + 1;  
  333.                 }  
  334.                 // 下  
  335.                 else if (yLength * size - y > yLength  
  336.                         && allImages[ptX][ptY + 1].getId() == blankNum) {  
  337.                     tmp = allImages[ptX][ptY];  
  338.                     allImages[ptX][ptY] = allImages[ptX][ptY + 1];  
  339.                     allImages[ptX][ptY + 1] = tmp;  
  340.                     blankImageY = blankImageY - 1;  
  341.                 }  
  342.                 // 左  
  343.                 else if (x - xLength > 0  
  344.                         && allImages[ptX - 1][ptY].getId() == blankNum) {  
  345.                     tmp = allImages[ptX][ptY];  
  346.                     allImages[ptX][ptY] = allImages[ptX - 1][ptY];  
  347.                     allImages[ptX - 1][ptY] = tmp;  
  348.                     blankImageX = blankImageX + 1;  
  349.                 }  
  350.                 // 右  
  351.                 else if (xLength * size - x > xLength  
  352.                         && allImages[ptX + 1][ptY].getId() == blankNum) {  
  353.                     tmp = allImages[ptX][ptY];  
  354.                     allImages[ptX][ptY] = allImages[ptX + 1][ptY];  
  355.                     allImages[ptX + 1][ptY] = tmp;  
  356.                     blankImageX = blankImageX - 1;  
  357.                 }  
  358.                 // System.out.println(blankImageX + " : " + blankImageY);  
  359.             }  
  360.  
  361.             // System.out.println(x + ":" + y +"  "+ptX+" - "+ptY  
  362.             // +" "+allImages[ptX][ptY]);  
  363.             // JOptionPane.showMessageDialog(this, x + ":" + y  
  364.             // +"  "+ptX+" - "+ptY +" "+allImages[ptX][ptY]);  
  365.             this.repaint();  
  366.             this.verify();  
  367.         }  
  368.          
  369.         int x1 = width - left - right + 20;  
  370.         int y1 = top+smallImageHeight;  
  371.         int x2 = x1 + smallImageWidth;  
  372.         int y2 = y1 + 40;  
  373.          
  374.         if (e.getX() > x1 && e.getX() < x2 && e.getY()> y1 + 10 && e.getY() < y2 + 10) {  
  375.             int result = JOptionPane.showConfirmDialog(this, "是否重新开始游戏?");  
  376.             if (result == 0) {  
  377.                 //随机图片  
  378.                  
  379.                 /*int num = this.getRandomNumber(bkNum) + 1;
  380.                 InputStream is = NineImageFrame.class.getResourceAsStream("/image/"
  381.                         + "bk" + num + ".jpg");*/  
  382.                 InputStream is;  
  383.                 try {  
  384.                     //随机背景  
  385.                     bgImage = ImageIO.read(ImageSelector.getInstance().getRandomJarImage(this.getClass(),"/image/background/",12,"","gif"));  
  386.                     is = ImageSelector.getInstance().getRandomJarImage(this.getClass(),imagePackage,bkNum,"bk","jpg");  
  387.                     this.initData(is);  
  388.                     is.close();  
  389.                 } catch (IOException e1) {  
  390.                     e1.printStackTrace();  
  391.                 }  
  392.  
  393.                 remainingTime = maxTime;  
  394.                 this.canPlay = true;  
  395.                 this.repaint();  
  396.                 t.resume();  
  397.             }  
  398.         }  
  399.          
  400.         //自选图像  
  401.         if (e.getX() > x1 && e.getX() < x2 && e.getY()> y1 + 60 && e.getY() < y2 + 60) {  
  402.             JFileChooser jf = new JFileChooser("Title...");  
  403.             jf.setDialogTitle("请选择图像文件...");  
  404.             jf.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);  
  405.             ExampleFileFilter filter = new ExampleFileFilter();  
  406.             filter.addExtension("jpg");  
  407.             filter.addExtension("gif");  
  408.             filter.addExtension("png");  
  409.             filter.setDescription("JPG & GIF & PNG Images");  
  410.             jf.setFileFilter(filter);  
  411.             if(selFilePath == null || "".equals(selFilePath)){  
  412.                 jf.setCurrentDirectory(new File("."));//设置当前目录  
  413.             }else{  
  414.                 jf.setCurrentDirectory(new File(selFilePath));//设置之前选择的目录  
  415.             }  
  416.             int result = jf.showOpenDialog(this);  
  417.             jf.setVisible(true);  
  418.             File selectedFile = null;  
  419.             if (result == JFileChooser.APPROVE_OPTION) {  
  420.                 selectedFile = jf.getSelectedFile();  
  421.                 if (selectedFile.exists()) {  
  422.                     //随机背景  
  423.                     try {  
  424.                         bgImage = ImageIO.read(ImageSelector.getInstance().getRandomJarImage(this.getClass(),"/image/background/",12,"","gif"));  
  425.                     } catch (FileNotFoundException e2) {  
  426.                         e2.printStackTrace();  
  427.                     } catch (IOException e2) {  
  428.                         e2.printStackTrace();  
  429.                     }  
  430.                     if(selectedFile.isDirectory()){  
  431.                         try {  
  432.                             selFilePath = selectedFile.getAbsolutePath();  
  433.                             InputStream is = ImageSelector.getInstance().getRandomImage(selectedFile);  
  434.                             this.initData(is);  
  435.                             is.close();  
  436.                         } catch (IOException e1) {  
  437.                             e1.printStackTrace();  
  438.                         }  
  439.                         isDir = true;  
  440.                     }  
  441.                     if(selectedFile.isFile()){  
  442.                         try {  
  443.                             selFilePath = selectedFile.getAbsolutePath();  
  444.                             InputStream is = new FileInputStream(selectedFile);  
  445.                             this.initData(is);  
  446.                             is.close();  
  447.                         } catch (FileNotFoundException e1) {  
  448.                             e1.printStackTrace();  
  449.                         } catch (IOException e1) {  
  450.                             e1.printStackTrace();  
  451.                         }  
  452.                         isDir = false;  
  453.                     }  
  454.                     remainingTime = maxTime;  
  455.                     this.canPlay = true;  
  456.                     this.repaint();  
  457.                     t.resume();  
  458.                 } else {  
  459.                     System.out.println("No! You did not select the right file.");  
  460.                 }  
  461.             } else if (result == JFileChooser.CANCEL_OPTION) {  
  462.                 System.out.println("Cancel button is pushed.");  
  463.             } else if (result == JFileChooser.ERROR_OPTION) {  
  464.                 System.err.println("Error when select file.");  
  465.             }  
  466.         }  
  467.  
  468.         // 刷新  
  469.         if (e.getX() > x1 && e.getX() < x2 && e.getY()> y1 + 110 && e.getY() < y2 + 110) {  
  470.             if(isDir){  
  471.                 InputStream is = null;  
  472.                 if(selFilePath!=null && !"".equals(selFilePath)){  
  473.                     int result = JOptionPane.showConfirmDialog(this, "是否更更换拼图?");  
  474.                     if (result == 0) {  
  475.                         try {  
  476.                             //随机背景  
  477.                             bgImage = ImageIO.read(ImageSelector.getInstance().getRandomJarImage(this.getClass(),"/image/background/",12,"","gif"));  
  478.                             is = ImageSelector.getInstance().getRandomImage(new File(selFilePath));  
  479.                             this.initData(is);  
  480.                             is.close();  
  481.                             remainingTime = maxTime;  
  482.                             this.canPlay = true;  
  483.                             this.repaint();  
  484.                             t.resume();  
  485.                         } catch (FileNotFoundException e1) {  
  486.                             e1.printStackTrace();  
  487.                         } catch (IOException e1) {  
  488.                             e1.printStackTrace();  
  489.                         }  
  490.                     }  
  491.                      
  492.                 }  
  493.                 else{  
  494.                      JOptionPane.showMessageDialog(this, "请先选择自定义图片目录");  
  495.                 }  
  496.             }else{  
  497.                 JOptionPane.showMessageDialog(this, "请先选择自定义图片目录");  
  498.             }  
  499.              
  500.                  
  501.         }  
  502.          
  503.     }  
  504.  
  505.      
  506.     public void mouseReleased(MouseEvent e) {  
  507.         if(this.showMagnifier){  
  508.             this.showMagnifier = false;  
  509.             repaint();  
  510.         }  
  511.     }  
  512.  
  513.     /**
  514.      * 初始化拼图数组序列
  515.      */  
  516.     public void initData(InputStream is) {  
  517.         remainingTime = maxTime;  
  518.         BufferedImage[] bis = cutImage(is, size);  
  519.  
  520.         int a = 0;  
  521.         for (int i = 0; i < allImages.length; i++) {  
  522.             for (int j = 0; j < allImages.length; j++) {  
  523.                 allImagesTmp[j][i] = new ImageSegment();  
  524.                 allImagesTmp[j][i].setId(a++);  
  525.             }  
  526.         }  
  527.  
  528.         // 产生随机序列  
  529.         // i/y 基数递增函数  
  530.         // i%y 0-y范围循环  
  531.         int[] rand = ImageSelector.getInstance().getRandoms(size * size);  
  532.         for (int i = 0; i < rand.length; i++) {  
  533.             allImages[i / size][i % size] = new ImageSegment();  
  534.             allImages[i / size][i % size].setId(rand[i] - 1);  
  535.             // getRandoms 生成的随机数是从1开始的,所有 bis[] 需要减一  
  536.             allImages[i / size][i % size].setImage(bis[rand[i] - 1]);  
  537.              
  538.             // 获取空白的特殊块的信息  
  539.             if (rand[i]-1 == this.blankNum) {  
  540.                 blankImageX = i / size;  
  541.                 blankImageY = i % size;  
  542.                 allImages[i / size][i % size].setShow(false);  
  543.             }  
  544.         }  
  545.     }  
  546.  
  547.     @SuppressWarnings("deprecation")  
  548.     public void run() {  
  549.         // 判断是否有时间限制  
  550.         if (maxTime > 0) {  
  551.             while (true) {  
  552.                 remainingTime--;  
  553.                 if (remainingTime == 0) {  
  554.                     this.canPlay = false;  
  555.                     JOptionPane.showMessageDialog(this, "超时,游戏结束!");  
  556.                     t.suspend();  
  557.                     remainingTime = -1;  
  558.                 }  
  559.                 gameMessage = remainingTime / 3600 + ":"  
  560.                         + (remainingTime / 60 - remainingTime / 3600 * 60)  
  561.                         + ":" + (remainingTime - remainingTime / 60 * 60);  
  562.                 this.repaint();  
  563.                 if (t.isAlive()) {  
  564.                     try {  
  565.                         Thread.sleep(1000);  
  566.                     } catch (InterruptedException e) {  
  567.                         e.printStackTrace();  
  568.                     }  
  569.                 }  
  570.                 // System.out.println(remainingTime);  
  571.             }  
  572.         }  
  573.     }  
  574.  
  575.     /**
  576.      * 判断数组拼图是否正确
  577.      *  
  578.      * @return
  579.      */  
  580.     @SuppressWarnings("deprecation")  
  581.     public void verify() {  
  582.         boolean rt = true;  
  583.         for (int i = 0; i < allImagesTmp.length; i++) {  
  584.             for (int j = 0; j < allImagesTmp[i].length; j++) {  
  585.                 if (allImagesTmp[j][i].getId() != allImages[j][i].getId()) {  
  586.                     rt = false;  
  587.                     break;  
  588.                 } else {  
  589.                     rt = true;  
  590.                 }  
  591.             }  
  592.             if (!rt) {  
  593.                 break;  
  594.             }  
  595.         }  
  596.         if (rt) {  
  597.             this.canPlay = false;  
  598.             allImages[blankImageY][blankImageX].setShow(true);  
  599.             JOptionPane.showMessageDialog(this, "success!");  
  600.             t.suspend();  
  601.         }  
  602.     }  
  603.  
  604.  
  605.  
  606.      
  607.      
  608.     /**
  609.      * 把图片分割多少行多少列的
  610.      *  
  611.      * @param imageName
  612.      * @param size
  613.      * @return
  614.      */  
  615.     public BufferedImage[] cutImage(InputStream is, int size) {  
  616.         BufferedImage[] bis = new BufferedImage[size * size];  
  617.         BufferedImage scalesBufferedImage =null;  
  618.         try {  
  619.             scalesBufferedImage = ImageUtil.resize(ImageIO.read(is), wLength, hLength,false);  
  620.             // 创建缩略图片  
  621.             smallImage = scalesBufferedImage;  
  622.             /*smallImage = ImageUtil.resize(scalesBufferedImage, smallImageWidth,
  623.                     smallImageHeight,false);*/  
  624.         } catch (IOException e1) {  
  625.             e1.printStackTrace();  
  626.         }  
  627.  
  628.         BufferedImage bi = null;  
  629.         for (int i = 0; i < size * size; i++) {  
  630.             Rectangle rect = new Rectangle((i % size) * xLength, (i / size)  
  631.                     * yLength , xLength-1, yLength);  
  632.             //如果图片长700/3,可能出错,xLength-1  
  633.             bi = scalesBufferedImage.getSubimage(rect.x, rect.y,  
  634.                     rect.width, rect.height);  
  635.             bis[i] = bi;  
  636.  
  637.         }  
  638.         try {  
  639.             is.close();  
  640.         } catch (IOException e) {  
  641.             e.printStackTrace();  
  642.         }  
  643.         return bis;  
  644.     }  
  645.  
  646.     // 键盘事件  
  647.     @Override  
  648.     public void keyPressed(KeyEvent e) {  
  649.         ImageSegment tmp;  
  650.         switch (e.getKeyCode()) {  
  651.         case 37:  
  652.             // 方向键 左  
  653.             if (blankImageX < size - 1) {  
  654.                 tmp = allImages[blankImageX][blankImageY];  
  655.                 allImages[blankImageX][blankImageY] = allImages[blankImageX + 1][blankImageY];  
  656.                 allImages[blankImageX + 1][blankImageY] = tmp;  
  657.                 // 保存空白块位置  
  658.                 blankImageX = blankImageX + 1;  
  659.                 // System.out.println(blankImageX + " : " + blankImageY);  
  660.             }  
  661.             break;  
  662.         case 38:  
  663.             // 方向键 上  
  664.             if (blankImageY < size - 1) {  
  665.                 tmp = allImages[blankImageX][blankImageY];  
  666.                 allImages[blankImageX][blankImageY] = allImages[blankImageX][blankImageY + 1];  
  667.                 allImages[blankImageX][blankImageY + 1] = tmp;  
  668.                 // 保存空白块位置  
  669.                 blankImageY = blankImageY + 1;  
  670.                 // System.out.println(blankImageX + " : " + blankImageY);  
  671.             }  
  672.             break;  
  673.         case 39:  
  674.             // 方向键 右  
  675.             if (blankImageX > 0) {  
  676.                 tmp = allImages[blankImageX][blankImageY];  
  677.                 allImages[blankImageX][blankImageY] = allImages[blankImageX - 1][blankImageY];  
  678.                 allImages[blankImageX - 1][blankImageY] = tmp;  
  679.                 // 保存空白块位置  
  680.                 blankImageX = blankImageX - 1;  
  681.                 // System.out.println(blankImageX + " : " + blankImageY);  
  682.             }  
  683.             break;  
  684.         case 40:  
  685.             // 方向键 下  
  686.             if (blankImageY > 0) {  
  687.                 tmp = allImages[blankImageX][blankImageY];  
  688.                 allImages[blankImageX][blankImageY] = allImages[blankImageX][blankImageY - 1];  
  689.                 allImages[blankImageX][blankImageY - 1] = tmp;  
  690.                 // 保存空白块位置  
  691.                 blankImageY = blankImageY - 1;  
  692.                 // System.out.println(blankImageX + " : " + blankImageY);  
  693.             }  
  694.             break;  
  695.         }  
  696.  
  697.         this.repaint();  
  698.         this.verify();  
  699.  
  700.     }  
  701.  
  702.     @Override  
  703.     public void keyReleased(KeyEvent e) {  
  704.  
  705.     }  
  706.  
  707.     @Override  
  708.     public void keyTyped(KeyEvent e) {  
  709.  
  710.     }  
  711.  
  712.      
  713.     /**
  714.      * 鼠标拖动
  715.      */  
  716.     @Override  
  717.     public void mouseDragged(MouseEvent e) {  
  718.         int x1 = width - left - right + 20;  
  719.         int y1 = top;  
  720.         int x2 = x1 + smallImageWidth;  
  721.         int y2 = y1 + smallImageHeight;  
  722.          
  723.         if(e.getX()> x1 && e.getX()< x2 && e.getY()> y1 && e.getY() < y2){  
  724.             this.magnifierX = e.getX()-magnifierWidth/2;  
  725.             this.magnifierY = e.getY()-magnifierHeight/2;  
  726.             Robot robot = null;  
  727.             try {  
  728.                 robot = new Robot();  
  729.             } catch (AWTException e1) {  
  730.                 // TODO Auto-generated catch block  
  731.                 e1.printStackTrace();  
  732.             }  
  733.  
  734.             this.magnifierBufferedImage = robot.createScreenCapture(new Rectangle(e.getXOnScreen()-magnifierWidth/2, e.getYOnScreen()-magnifierHeight/2, magnifierWidth, magnifierHeight));  
  735.             /*this.magnifierBufferedImage = this.smallImage.getSubimage(magnifierX, magnifierY,
  736.                     magnifierWidth, magnifierHeight);*/  
  737.             this.showMagnifier = true;  
  738.             repaint();  
  739.         }  
  740.          
  741.     }  
  742.  
  743.     /**
  744.      * 鼠标移动
  745.      */  
  746.     @Override  
  747.     public void mouseMoved(MouseEvent e) {  
  748.          
  749.          
  750.          
  751.     }  
  752.  
  753.     @Override  
  754.     public void componentHidden(ComponentEvent e) {  
  755.         // TODO Auto-generated method stub  
  756.          
  757.     }  
  758.  
  759.     @Override  
  760.     public void componentMoved(ComponentEvent e) {  
  761.         // TODO Auto-generated method stub  
  762.          
  763.     }  
  764.  
  765.     @Override  
  766.     public void componentResized(ComponentEvent e) {  
  767.         int width = e.getComponent().getWidth();  
  768.         int height = e.getComponent().getHeight();  
  769.         xLength = (width - left - right) / size;  
  770.         yLength = (height - top - bottom) / size;  
  771.         if (xLength < 120 || yLength < 120) {  
  772.             // 窗体的高度  
  773.             height = top + bottom + 120*size; //400  
  774.             // 窗体的宽度  
  775.             width = left + right + 120*size; //510  
  776.         }  
  777.          
  778.          
  779.         setSize(width, height);  
  780.          
  781.     }  
  782.  
  783.     @Override  
  784.     public void componentShown(ComponentEvent e) {  
  785.         // TODO Auto-generated method stub  
  786.          
  787.     }  
  788.  
  789. }

Reply to "Jigsaw puzzle"

Here you can reply to the paste above

captcha

https://burned.cc - Burn After Reading Website