Java滑动拼图,知道什么时候完成?

时间:2014-10-07 14:35:32

标签: java swing button puzzle

我正在为类制作一个java滑动拼图,到目前为止,我能够将图片裁剪掉,并且我找到了一种通过动作侦听器滑动所有按钮的方法。然而,在这一点上,我无法理解如何检查所有按钮是否处于正确位置以便在完成时祝贺用户。此外,知道如何做到这一点将使我能够随机化和洗牌图像 - 我还没有实现。

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.*;

public class JEightPuzzleFrame extends JFrame implements ActionListener{

    private int width;
    private int height;

    int position[][];
    private Image image1;
    private JPanel centerPanel;
    private JButton[][] listOfBtn = new JButton[3][3];

    public JEightPuzzleFrame(String Title, String Source){

         position = new int[][] {
                 {0, 1, 2}, 
                 {3, 4, 5}, 
                 {6, 7, 8}};    

         centerPanel = new JPanel();
         centerPanel.setLayout(new GridLayout(3, 3, 0, 0)); // 3x3 grid
         add(centerPanel, BorderLayout.CENTER);

         // Read the image from folder
        BufferedImage image=null;
        try{
            image = ImageIO.read(new File(Source));
        }catch(IOException e){
            System.err.println("Image not found");
            System.exit(1);
        }       
        // get the height and width of the image for the window size
         width = image.getWidth();
         height = image.getHeight();

         for ( int i = 0; i < 3; i++) {
             for ( int j = 0; j < 3; j++) {
                 if ( i == 2 && j == 1) {
                     listOfBtn[2][1] = new JButton();
                     centerPanel.add(listOfBtn[2][1]);
                 } else {
                     listOfBtn[i][j] = new JButton();
                     listOfBtn[i][j].addActionListener(this);
                     centerPanel.add(listOfBtn[i][j]);
                     Image source = (Image) image;
                      image1 = createImage(new FilteredImageSource(source.getSource(),
                             new CropImageFilter(j*width/3, i*height/3, 
                                 (width/3)+1, height/3)));
                     listOfBtn[i][j].setIcon(new ImageIcon(image1));
                     listOfBtn[i][j].setVisible(true);
                 }
             }
         }     
        validate();
        setSize(width, height);
        setTitle(Title);
        setResizable(false);
        setLocationRelativeTo(null); // center the image
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);   
    }
    public void shuffle(){

    }
    public static void main(String[] args) {

            new JEightPuzzleFrame("puzzle", "picture.png");
    }
    @Override
    public void actionPerformed(ActionEvent e){

     JButton button = (JButton) e.getSource();
        Dimension size = button.getSize();

        int labelX = listOfBtn[2][1].getX();
        int labelY = listOfBtn[2][1].getY();
        int buttonX = button.getX();
        int buttonY = button.getY();
        int buttonPosX = buttonX / size.width;
        int buttonPosY = buttonY / size.height;
        int buttonIndex = position[buttonPosY][buttonPosX];

        if (labelX == buttonX && (labelY - buttonY) == size.height ) {

             int labelIndex = buttonIndex + 3;

             centerPanel.remove(buttonIndex);
             centerPanel.add(listOfBtn[2][1], buttonIndex);
             centerPanel.add(button,labelIndex);
             centerPanel.validate();
        }

        if (labelX == buttonX && (labelY - buttonY) == -size.height ) {

             int labelIndex = buttonIndex - 3;
             centerPanel.remove(labelIndex);
             centerPanel.add(button,labelIndex);
             centerPanel.add(listOfBtn[2][1], buttonIndex);
             centerPanel.validate();
        }

        if (labelY == buttonY && (labelX - buttonX) == size.width ) {

             int labelIndex = buttonIndex + 1;

             centerPanel.remove(buttonIndex);
             centerPanel.add(listOfBtn[2][1], buttonIndex);
             centerPanel.add(button,labelIndex);
             centerPanel.validate();
        }

        if (labelY == buttonY && (labelX - buttonX) == -size.width ) {

             int labelIndex = buttonIndex - 1;

             centerPanel.remove(buttonIndex);
             centerPanel.add(listOfBtn[2][1], labelIndex);
             centerPanel.add(button,labelIndex);
             centerPanel.validate();
        }
        if(labelY == buttonY && labelX == buttonX) {
            System.out.println("Congrats");
        }
 }
     }

4 个答案:

答案 0 :(得分:1)

不是裁剪图像并将其粘贴在构造函数中的按钮上,而是以(预定义的)顺序包含一个包含裁剪图像列表的图像数组。还要记住将名称/数字与图像相关联(可以通过创建一个具有Image的不同类及其在完整图像中的原始位置作为该类的成员变量来完成。)

现在,在执行操作结束时,遍历所有按钮并获取附加到其上的图像的名称。如果所有图像都设置正确(根据原始完整图像),所有名称的串联(按顺序)将始终相同(独立于所使用的图像),因此可用于确定最终的&# 39;赢得&#39;条件。

答案 1 :(得分:0)

您在随机播放之前按下的数字调用容器getcomponents存储数组以便在每次移动后进行比较

答案 2 :(得分:0)

拥有一系列裁剪图像和相同数量的按钮阵列。

BufferedImage image[] = new BufferedImage[noOfImages];
JButton buttons[] = new JButton[image.length];

现在使用java.util.Random类,为图像生成随机索引并将其设置为该索引处的按钮。

// Randomizing algorithm. I don't expect you to copy the same code. Just for you to understand the logic.

Random rand = new Random(); 
int index;

/ We'll iterate through each button.
for(int i = 0; i < buttons.length; i++) {

        // Pick up a random image.
        do {

            index = rand.nextInt(images.length); // Generate a random number from 0 to images.length -1
            // We will set this index position from the image array to null after setting the icon to a button, so that same picture is not selected for some other button.
        } while(images[index] != null);


        button[i].setIcon(new javax.swing.ImageIcon(images[index])); // Set the image.
        images[index] = null; // coz you don't want the same image to be set to other buttons again.
}

答案 3 :(得分:0)

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.*;

public class JEightPuzzleFrame extends JFrame implements ActionListener{

    private int width;
    private int height;     
    private int position[][];
    private int count[] = {1,2,3,4,5,6,7,8,9};  // keep track of where the pieces are 
    private Image image1;
    private JPanel centerPanel;
    private JButton[][] listOfBtn = new JButton[3][3];
    private String Source;
    private String Title;
    private int ShuffleCount;

    public JEightPuzzleFrame(String Title, String Source){
        this.Source = Source;
        this.Title = Title;

        ShuffleCount = 0;
        if (ShuffleCount == 0){
            ShuffleCount++;
            set();

        }else{
            shuffle();
        }
    }
    private Image getIcon(int i, int j){
         // Read the image from folder
        BufferedImage image=null;
        try{
            image = ImageIO.read(new File(Source));
        }catch(IOException e){
            System.err.println("Image not found");
            System.exit(1);
        }       
        // get the height and width of the image for the window size
         width = image.getWidth();
         height = image.getHeight(); 
         Image source = (Image) image;
         image1 = createImage(new FilteredImageSource(source.getSource(),
                 new CropImageFilter(j*width/3, i*height/3, 
                     (width/3)+1, height/3)));
         return image1;
    }
    private void set(){
        position = new int[][] {
                {0, 1, 2}, 
                {3, 4, 5}, 
                {6, 7, 8}};

         centerPanel = new JPanel();
         centerPanel.setLayout(new GridLayout(3, 3, 0, 0)); // 3x3 grid
         add(centerPanel, BorderLayout.CENTER);

         // Read the image from folder
        BufferedImage image=null;
        try{
            image = ImageIO.read(new File(Source));
        }catch(IOException e){
            System.err.println("Image not found");
            System.exit(1);
        }       
        // get the height and width of the image for the window size
         width = image.getWidth();
         height = image.getHeight(); 
    /*  for ( int i = 0; i < 3; i++) {
            for ( int j = 0; j < 3; j++) {
                if ( i == 2 && j == 1) {
                    listOfBtn[2][1] = new JButton();
                    centerPanel.add(listOfBtn[2][1]);
                } else {
                 listOfBtn[i][j] = new JButton();
                 listOfBtn[i][j].addActionListener(this);
                 centerPanel.add(listOfBtn[i][j]);
                 Image source = (Image) image;
                  image1 = createImage(new FilteredImageSource(source.getSource(),
                            new CropImageFilter(j*width/3, i*height/3, 
                                (width/3)+1, height/3)));
                    listOfBtn[i][j].setIcon(new ImageIcon(image1));
                    listOfBtn[i][j].setVisible(true);
                }
            }
        } */
         // Set up for initial Game        
         //Button 1
         listOfBtn[0][0] = new JButton();
         centerPanel.add(listOfBtn[0][0]);
         count [0] = 9;
         // Button 2
         listOfBtn[0][1] = new JButton();
         listOfBtn[0][1].addActionListener(this);
         centerPanel.add(listOfBtn[0][1]);
         listOfBtn[0][1].setIcon(new ImageIcon(getIcon(0,0)));
         listOfBtn[0][1].setVisible(true);
         count[1] = 1;
         //Button 3
         listOfBtn[0][2] = new JButton();
         listOfBtn[0][2].addActionListener(this);
         centerPanel.add(listOfBtn[0][2]);
         listOfBtn[0][2].setIcon(new ImageIcon(getIcon(0,1)));
         listOfBtn[0][2].setVisible(true);
         count[2] = 2;
       //Button 4
         listOfBtn[1][0] = new JButton();
         listOfBtn[1][0].addActionListener(this);
         centerPanel.add(listOfBtn[1][0]);
         listOfBtn[1][0].setIcon(new ImageIcon(getIcon(1,1)));
         listOfBtn[1][0].setVisible(true);
         count[3] = 5;
       //Button 5
         listOfBtn[1][1] = new JButton();
         listOfBtn[1][1].addActionListener(this);
         centerPanel.add(listOfBtn[1][1]);
         listOfBtn[1][1].setIcon(new ImageIcon(getIcon(1,2)));
         listOfBtn[1][1].setVisible(true);
         count[4] = 6;
       //Button 6
         listOfBtn[1][2] = new JButton();
         listOfBtn[1][2].addActionListener(this);
         centerPanel.add(listOfBtn[1][2]);
         listOfBtn[1][2].setIcon(new ImageIcon(getIcon(0,2)));
         listOfBtn[1][2].setVisible(true);
         count[5] = 3;
       //Button 7
         listOfBtn[2][0] = new JButton();
         listOfBtn[2][0].addActionListener(this);
         centerPanel.add(listOfBtn[2][0]);
         listOfBtn[2][0].setIcon(new ImageIcon(getIcon(1,0)));
         listOfBtn[2][0].setVisible(true);
         count[6] = 4;
       //Button 8
         listOfBtn[2][1] = new JButton();
         listOfBtn[2][1].addActionListener(this);
         centerPanel.add(listOfBtn[2][1]);
         listOfBtn[2][1].setIcon(new ImageIcon(getIcon(2,0)));
         listOfBtn[2][1].setVisible(true);
         count[7] = 7;
       //Button 9
         listOfBtn[2][2] = new JButton();
         listOfBtn[2][2].addActionListener(this);
         centerPanel.add(listOfBtn[2][2]);
         listOfBtn[2][2].setIcon(new ImageIcon(getIcon(2,1)));
         listOfBtn[2][2].setVisible(true);
         count[8] = 8;

        validate();
        setSize(width, height);
       setTitle(Title);
       setResizable(false);
       setLocationRelativeTo(null); // center the image
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       setVisible(true);
    }
    public void shuffle(){
        set();

    }

    public static void main(String[] args) {
            new JEightPuzzleFrame("Puzzle", "image.png");   
            System.out.println();
    }
    @Override
    public void actionPerformed(ActionEvent e){

     JButton button = (JButton) e.getSource();
        Dimension size = button.getSize();

        int emptyX = listOfBtn[0][0].getX();
        int emptyY = listOfBtn[0][0].getY();

        int buttonX = button.getX();
        int buttonY = button.getY();
        int buttonPosX = buttonX / size.width;
        int buttonPosY = buttonY / size.height;
        int buttonIndex = position[buttonPosY][buttonPosX];

        if (emptyX == buttonX && (emptyY - buttonY) == size.height ) {          

             int labelIndex = buttonIndex + 3;

             centerPanel.remove(buttonIndex);
             centerPanel.add(listOfBtn[0][0], buttonIndex);
             centerPanel.add(button,labelIndex);
             centerPanel.validate();

             int a = count[buttonIndex];
             count[buttonIndex] = count[labelIndex];
             count[labelIndex] = a;              
        }

        if (emptyX == buttonX && (emptyY - buttonY) == -size.height ) {

             int labelIndex = buttonIndex - 3;
             centerPanel.remove(labelIndex);
             centerPanel.add(button,labelIndex);
             centerPanel.add(listOfBtn[0][0], buttonIndex);

             centerPanel.validate();
             int a = count[buttonIndex];
             count[buttonIndex] = count[labelIndex];
             count[labelIndex] = a; 
        }

        if (emptyY == buttonY && (emptyX - buttonX) == size.width ) {

             int labelIndex = buttonIndex + 1;        
             centerPanel.remove(buttonIndex);
             centerPanel.add(listOfBtn[0][0], buttonIndex);
             centerPanel.add(button,labelIndex);                                 
             centerPanel.validate(); 
             int a = count[buttonIndex];
             count[buttonIndex] = count[labelIndex];
             count[labelIndex] = a; 
        }

        if (emptyY == buttonY && (emptyX - buttonX) == -size.width ) {

             int labelIndex = buttonIndex - 1;            
             centerPanel.remove(buttonIndex);
             centerPanel.add(listOfBtn[0][0], labelIndex);
             centerPanel.add(button,labelIndex);
             centerPanel.validate();

             int a = count[buttonIndex];
             count[buttonIndex] = count[labelIndex];
             count[labelIndex] = a; 
        } 
        if(count[0] == 1 &&
                count[1] == 2 &&
                count[2] == 3 &&
                count[3] == 4 &&
                count[4] == 5 &&
                count[5] == 6 &&
                count[6] == 7 &&
                count[7] == 8 &&
                count[8] == 9){

            JOptionPane.showMessageDialog(centerPanel,"Good job! Hit ok to scramble");
            shuffle();
         }
    }
}
相关问题