Java GUI 基础 Eight Puzzle (拼图游戏)
很简单使用java GUI 制作一个简单的拼图游戏
// main
package HW1; import java.io.IOException; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; public class HW1 extends JFrame{ /** * */ public HW1_0586(String string) { Icon icon = new ImageIcon(string); JLabel label = new JLabel(icon); this.add(label); this.setTitle("Original image!"); this.setLocation(200,0); } /** * To build icon from an existing image. * * @param path the path of the image * @return */ public static void main( String args[] ) throws IOException{ String path = "img1.png"; //String path ="img2.png"<span style="font-family: Arial, Helvetica, sans-serif;">;</span> HW1 buttonFrame = new HW1(path); JEightPuzzleFrame jframe = new JEightPuzzleFrame("Eight Puzzle",path); jframe.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); jframe.setSize( 165,165 ); // set frame size jframe.setVisible( true ); // display frame buttonFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); buttonFrame.setSize( 165,165 ); // set frame size buttonFrame.setVisible( true ); // display frame } }
package HW1; import java.awt.Container; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Random; import javax.imageio.ImageIO; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; /** this is a eight puzzle game. * two-dimensional array save the location of button * the one-array save the individual button * */ public class JEightPuzzleFrame extends JFrame { /** * */ //private static final long serialVersionUID = 1L; private BufferedImage img; private BufferedImage [] imgs = new BufferedImage[8]; private JButton[] buttons = new JButton[8]; private ImageIcon [] imgicons = new ImageIcon[8]; private Icon [] icons = new Icon[8]; private GridLayout layout; private JPanel panel; private Container container; private JLabel label; private int[][] array = new int[3][3]; public JEightPuzzleFrame(String title, String path) { super(title); System.out.println(this.getLocation()); container = new Container(); container = getContentPane(); panel = new JPanel(); layout = new GridLayout(3, 3); setLayout(layout); label = new JLabel(""); for (int i = 0; i < 8; i++) { buttons[i] = new JButton(); } panel.add(label); try { img = ImageIO.read(new File(path)); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } int num = img.getWidth(); // because of square,same length in width and // height container = getContentPane(); imgs[0] = img.getSubimage(0, 0, num / 3, num / 3); imgs[1] = img.getSubimage(num / 3, 0, num / 3, num / 3); imgs[2] = img.getSubimage(2 * num / 3, 0, num / 3, num / 3); imgs[3] = img.getSubimage(0, num / 3, num / 3, num / 3); imgs[4] = img.getSubimage(num / 3, num / 3, num / 3, num / 3); imgs[5] = img.getSubimage(2 * num / 3, num / 3, num / 3, num / 3); imgs[6] = img.getSubimage(0, 2 * num / 3, num / 3, num / 3); imgs[7] = img.getSubimage(num / 3, 2 * num / 3, num / 3, num / 3); //instantiated the object of image icon for(int i =0; i < 8; i++) { imgicons[i] = new ImageIcon(); } //set the image into image icon for(int i = 0; i < 8; i++) { imgicons[i].setImage(imgs[i]); } //assign image icon to icon for(int i = 0; i < 8; i++) { icons[i] = imgicons[i]; } //instantiated the button for(int i = 0;i < 8; i++) { buttons[i] = new JButton(icons[i]); } //set the size of the button for(int i =0; i < 8; i++) { buttons[i].setSize(icons[0].getIconWidth(), icons[0].getIconHeight()); } //set the size of empty panel panel.setSize(icons[0].getIconWidth(), icons[0].getIconHeight()); //instantiated the button handler ButtonHandler handler = new ButtonHandler(); for (int i = 0; i < 8; i++) { //add handle to button buttons[i].addActionListener(handler); } //first time initial game. this.initialGame(); } //initialize the first game! private void initialGame() { array[0][0] = 8; array[1][0] = 0; array[2][0] = 1; array[0][1] = 4; array[1][1] = 5; array[2][1] = 2; array[0][2] = 3; array[1][2] = 6; array[2][2] = 7; add(panel); add(buttons[0]); add(buttons[1]); add(buttons[4]); add(buttons[5]); add(buttons[2]); add(buttons[3]); add(buttons[6]); add(buttons[7]); } //button action listener private class ButtonHandler implements ActionListener { public void actionPerformed(ActionEvent e) { int num = -1; for (int i = 0; i < 8; i++) { if (e.getSource() == buttons[i]) { num = i; break; } } determineLocation(num); move(); Congratulation(win()); if(win()) { reInitializeGame(); move(); } } } //determine the location of the empty panel private void determineLocation(int num) { for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) { if (array[j][i] == num) { determineMove(j,i); return; //we need to stop this processing, // so we return over here. } } } //determine whether it can mvove private void determineMove(int j, int i) { int a, b, c, d; int temp; a = j - 1; b = j + 1; c = i - 1; d = i + 1; if (a >= 0 && array[a][i] == 8) { temp = array[a][i]; array[a][i] = array[j][i]; array[j][i] = temp; System.out.print("left "); } else if (b <= 2 && array[b][i] == 8) { temp = array[b][i]; array[b][i] = array[j][i]; array[j][i] = temp; System.out.print("right "); } else if (c >= 0 && array[j][c] == 8) { temp = array[j][c]; array[j][c] = array[j][i]; array[j][i] = temp; System.out.print("up "); } else if (d <= 2 && array[j][d] == 8) { temp = array[j][d]; array[j][d] = array[j][i]; array[j][i] = temp; System.out.print("down "); } } //execute the action of move private void move() { System.out.println("can move"); container.removeAll(); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (array[j][i] == 8) { add(panel); } else add(buttons[array[j][i]]); } } getContentPane().validate(); } //show the congratulation dialog! private void Congratulation(boolean win) { if(win) { Icon icon = new ImageIcon("/Users/huazhe/Desktop/File of Eclipse/HW1_1/src/image/Congratulation.gif"); System.out.println("you win!"); JOptionPane.showMessageDialog(this,"" ,"Congratulation!",0,icon); } else { //nothing } } //if win return true private boolean win() { int [][]Winarray = new int [3][3]; int temp = 0; for(int i =0; i < 3; i++) for(int j =0; j < 3; j++) { Winarray[j][i] = temp; temp++; } for(int i =0; i < 3; i++) { for(int j =0; j < 3; j++) { if(Winarray[j][i] != array[j][i]) { return false; } } } return true; } //reinitialize the game. private void reInitializeGame() { ArrayList<Integer> list = new ArrayList<Integer>(); Random random = new Random(); Object[] value = new Object[8]; //get the 9 random number( range from 0 to 9) //and make sure there is no repetition in it. while(true) { int number = random.nextInt(9); if(!list.contains(number)) { list.add(number); } if(list.size() == 9) { break; } } value = list.toArray(); for(int i = 0; i < 9; i++) { System.out.println(value[i]); } int count = 0; for(int i = 0; i < 3; i++) for(int j = 0; j < 3; j++) { array[j][i] = (Integer) value[count]; count++; } } }
tip: 想要运行时,将main 中的 img1.png 换成 你自己图片的路径。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。