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

	}
}

//eight puzzle

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 换成 你自己图片的路径。

时间: 2024-10-17 13:51:10

Java GUI 基础 Eight Puzzle (拼图游戏)的相关文章

Java小项目之:拼图游戏!

Java小项目之:拼图游戏!今天教大家用java做出一个拼图游戏,很适合java初学者练手.所用素材: 部分代码: package picture_mosical; import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt.image.BufferedImage; import java.awt.image.CropImageFilter; import java.awt.i

[CareerCup] 8.6 Jigsaw Puzzle 拼图游戏

8.6 Implement a jigsaw puzzle. Design the data structures and explain an algorithm to solve the puzzle. You can assume that you have a f itsWith method which, when passed two puzzle pieces, returns true if the two pieces belong together. 这道题让我们设计一个拼图

java大作业之拼图游戏

这个拼图游戏是帮同学做的,还是挺不错的,实现功能包括:自动选取图片,自动任意切割图片,且保证生成的一定有解,还有倒计时功能. 还写了那个迪杰斯特拉演示的,过两天再发上来,毕竟要考试了(预习了...) 先说下如何保证有解,两种方法:1,先切割然后自己后台让空格自己随机移动. 2,生成全排列,然后判断是否有解: 一个N*M数码是否有解存在以下结论: 1. 如果M为奇数,那么上下移动,左右移动都不会改变序列的逆序值的奇偶性,所以如果begin个end两个状态的逆序值奇偶性一样就有解! 2. 如果M为偶

拼图游戏-从基础到应用玩转手势变化。

小方块相关的类 主界面的布局 打开图片选择图片 拼图的各个小方块的形成过程 小方块的点击事件和手势判断过程 游戏开始打乱方块以及游戏结束时弹出Toast提示的方法 相信大家在小的时候都玩过拼图游戏,现如今,手机普及,能在手机上玩的游戏越来越多,于是乎,重温小时候,编写这个简易拼图游戏,而且也能进一步加深android的一些基础知识. 老规矩,先是效果图~: 这里我把为了演示效果,把图片打乱的很少,在代码里可以更改. 首先,有个默认的图片,可以用来拼图,也可以选择你喜欢的图片进行拼图,拼图的过程会

Android群英传-拼图游戏puzzle-代码设计和实现

上个周末,3个小时总体上读完了<Android群英传>,本周主要在研究代码层次的设计和实现.  编译安装在手机上,玩了几把,结合代码,一周时间才掌握了整体的思路.  大部分时间,其实花在了"重构"上.  重构的过程,就是学习和思考的过程.    本文,算是一篇学习总结,总体介绍下这款小游戏的实现思路.  后面抽空,再改造下这个游戏不合理的设计方式,即格子是N*N+1,而不是N*N个.    写到快吐了:在写过的几百篇文章里,其中有很多案例了,写得次数越多,越发现很多流程和思

第14篇-JAVA GUI编程

第14篇-JAVA GUI编程 每篇一句 :道路一开始开辟的时候总是存在障碍的 初学心得: 原本下定决心才能开始的事情也变得理所当然 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-04-25| JAVA GUI编程 ] 1.什么是界面 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面 与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受 2.Java 基础类 JFC 的基本

Android群英传-拼图游戏puzzle-6点吐槽

一.缘由  经常写文章,混了一些C币.最近在深入学习Android应用开发,就从商城里买了一本<Android群英传>.这本书的内容,不是纯粹的入门那种,分几个章节,重点讲解Activity.动画等.最后一章是2个小游戏的实例,其中1个是拼图游戏.  认真研究了下作者的代码,有不敢苟同的地方,特意吐槽几句. 二.游戏相关资料  游戏名称:拼图.移动拼图.滑动拼图.Pullze  在搜索过程中,搜到了"华容道"和"数字推盘游戏".    数字推盘游戏(n-

一款html拼图游戏详解

本文是爱编程原创翻译,转载请看清文末的转载要求,谢谢合作! 游戏介绍 这篇文章是献给web游戏开发者用简单的开发工具开发一款游戏.此文介绍了用html.css.javascript只需简单和几个步骤开发一款2d游戏.在这里,我要呈现给大家如何创建一款拼图游戏,在这个游戏中你可以拖动小图块来拼成完整的大图. 点击这里查看游戏效果. 游戏规则 游戏规则非常简单,你只要拖动被切碎的图片块来组成完整的大图.需要用正确的方法才能最终拼成完整的图片.在游戏中拖动小图片的次数将被统计下来.所以.应该尽量用最少

Vue.js实现拼图游戏

Vue.js实现拼图游戏 之前写过一篇<基于Vue.js的表格分页组件>的文章,主要介绍了Vue组件的编写方法,有兴趣的可以访问这里进行阅读:http://www.cnblogs.com/luozhihao/p/5516065.html 前言 为了进一步让大家了解Vue.js的神奇魅力,了解Vue.js的一种以数据为驱动的理念,本文主要利用Vue实现了一个数字拼图游戏,其原理并不是很复杂,效果图如下: demo展示地址为:https://luozhihao.github.io/vue-puzz