`

Java实现小拼图游戏

阅读更多

今天整理之前的项目,发现了在大二上学期的java课程设计中编写的智能拼图小游戏,觉得有意思,所以打算写篇文章和大伙分享分享。

 

一、项目功能

1)本游戏是一个Java语言的拼图游戏,有一个格子是空的,其他格子内随机放置由要拿来拼图的图片切割成的若干个小图片,图片的切割按照一定的公式计算,用户可以自己选择图片到游戏中,据不同的难度,按照公式会切割成不同的小图片块数(有3*3,4*4,5*5)。

2)在开始游戏之前,可以选择游戏难度后再点击“开始”菜单里的“开始游戏”,进行拼图游戏,通过将空格旁边的小图片移入空格子内(不断的移动方块),来实现拼图,直到方块一行一行的按图片的原始样子拼好即可完成该游戏。

3)游戏进行时,可以点击“图片预览”查看完整图片,以便拼图的方便。

4)游戏拼完后,会弹出一个“信息”框,显示时间和步数。并且可以输入玩家名字。

5)游戏的简单规则在游戏界面的“帮助”菜单内的“游戏规则”信息框内已经简单介绍了。游戏前可以先预览看看。

 

二、设计思路

一)主窗口界面设计

1、游戏初始界面

当游戏运行时,主窗口界面中包含三个菜单,分别是开始、选择、帮助。主体部分是一个拼图的界面,有9块格子,其中有一块是空白的,状态栏有记录步数和游戏状态的标签。



 

2、游戏运行时

选择好图片后,便可以进行游戏的进行状态。游戏过程中,可以点击“选择”菜单里的“图片预览”菜单项进行完整图片的预览。


         
 
  3、游戏暂停时

当游戏者,在游戏过程中半途暂停游戏的话,将出现游戏暂停状态的界面。当游戏者又想继续游戏时,直接单击界面上的“继续”字样,就可以继续游戏了。



 

4、游戏结束

拼图完成后,会自动弹出已完成的信息提示框。并且在打破记录后会弹出输入玩家姓名的输入框。


    
 
 

(二)主窗口菜单功能

1、“开始”菜单。包括了“开始游戏”、“成绩记录”、“退出游戏”。

开始游戏:单击可以开始游戏;

成绩记录:保存的前三名玩家的成绩,保存在外存的.txt文档里。

退出游戏:退出程序。


    
 
   2、“选择”菜单。包括了“等级”、“游戏图片”、“增加图片”。当运行游戏前,先选择等级和游戏图片。

等级:在游戏者开始游戏之前,要进行游戏等级选择,共有3*3、4*4和5*5三个选择。其图片的切割块数,会根据选择的等级不同,而有所不同。

游戏图片:里面存放了该游戏的游戏图片图,直接选择某个图片名即可选择此图片作为游戏图片。

增加图片:点击该菜单项会弹出文件选择框,选择本地电脑的图片到游戏图片库。


       
 

3、“帮助”菜单。包括了“游戏规则”、“关于我们”。

游戏规则:击查看游戏的简单规则。

关于我们:可查看该游戏的版本、作者等相关信息。

(三)需要用的对话框

1、提示信息框

当游戏者运行游戏时,如果没有把“background”这个文件夹放入主程序的目录下,在运行游戏选择背景图片时,将没有图片可选,若此时直接“开始”->“新游戏”,将会弹出信息框,提示玩家图片不存在。

2、拼图成功后的提示框

当玩家拼图成功后,会弹出提示框告诉玩家所用的时间和步数。

3、成绩记录输入框

当玩家完成游戏后,并且打破前三名的记录时,将会出现一个成绩记录框。

4、前三名成绩显示框

输入成绩后,会弹出前三名玩家的成绩,包括玩家姓名,等级,时间和步数。


  
 
 

(四)功能实现思想

   由于这个是java课程设计,属于团队合作开发的小项目,所以对代码的可移植性以及重复利用性要求较高,为了达到这一目的,需要把不同的功能写成不同的类(.java),再把类似的功能由同一人写,并且放在一个自定义包里。

 

三、功能核心代码

(一)记录坐标的类

//point.java
package Function;
public class point//坐标
{
	int row;//行坐标
	int col;//列坐标
	public point(int r, int c)
	{
		row = r;
		col = c;
	}//构造函数初始化
	public void set(int r, int c)
	{
		row = r;
		col = c;
	}//设置坐标
	public int getRow()
	{
		return row;
	}//获取行坐标
	public int getCol()
	{
		return col;
	}//获取列坐标
	public boolean neighbor(int r, int c)
	{
		int n = Math.abs(row - r) + Math.abs(col - c);
		return n == 1;
	}//判断(r,c)与(row,col)是否相邻,相邻则返回true
}

 (二)分割图片的类

需要将选择的一张图片按照3*3或其他格式进行分割,然后随机摆放在主界面的9个格子中

//Split.java
package PictureOperation;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import Arg.*;
//Singleton class
public class Split
{
	public static final int HARD = 0;
	public static final int NORMAL = 1;
	public static final int EASY = 2;
	public static final String pvo = "png";
	public static final int [] level = {
		72, 90, 120
	};
	private static Split Ob;
	private String filename;
	private String path;
	private Split() {}
	public static Split get()
	{
		if (Ob == null)
			Ob = new Split();
		return Ob;
	}
	public boolean set(String fn)
	{
		filename = fn;
		path = Arg.path + "/" + filename;
		File file = new File(path);
		return file.exists();
	}
	public BufferedImage[][] divid(int type)
	{
		try
		{
			if (filename == null)
				return null;
			BufferedImage image = ImageIO.read(new File(path));
			BufferedImage imagei = new BufferedImage(360, 360,BufferedImage.TYPE_INT_RGB );
			imagei.getGraphics().drawImage(image, 0, 0, 360, 360, null);
			image=imagei;
			int len = level[type];
			int cal = image.getWidth() / len;
			int row = image.getHeight() / len;
			BufferedImage [][] subimage = new BufferedImage[row][cal];
			for (int i = 0; i < row; i++)
				for (int j = 0; j < cal; j++)
					subimage[i][j] = image.getSubimage(j*len,  
i*len, len, len);
			return subimage;
		}
		catch (Exception e)
		{
			return null;
		}
	}
}

 (三)图片交换类

当点击一张图片时,如果它的周围四个位置有一个为空白,则可以移动到空白位,并让该图片位置变成空白。

//Matrix.java
package PictureOperation;
import Function.*;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.ImageIcon;
public class Matrix
{
	private JButton [][] button;
	private JPanel panel;
	private int row;
	private int col;
	private int [][] matrix;
	private GameOver gOver;
	public Matrix(JButton [][] b, JPanel p, int len, GameOver g)
	{
		this.button = b;
		this.panel = p;
		this.gOver = g;
		
		row = b.length;//长
		col = b[0].length;//宽
		
		matrix = new int[row][col];
		matrix[row-1][col-1] = row * col;
		gOver.start(matrix);
		panel.removeAll();
		point pint = new point(row-1, col-1);
		for (int i = 0; i < row; i++)
			for (int j = 0; j < col; j++)
			{
				button[i][j] = new JButton();
				button[i][j].setBounds(j*len, i*len, len, len);
				button[i][j].addActionListener(new ButtonClick(button, pint, matrix, i, j, gOver));
				panel.add(button[i][j]);
			}
	}
	public void init(BufferedImage [][] image)
	{
		if (button == null || image == null)
			return;
		ImageIcon icon;
		int r, c, rad, d, m;
		boolean [] visit = new boolean[row*col-1];
		for (int i = 0; i < row*col - 1; i++)
		{
			r = i / col;
			c = i % col;
			
			rad = (int)(Math.random()*(row*col-1-i));
			for (d = m = 0; d < row*col - 1 && m <= rad; d++)
				if (!visit[d])
					m++;
			matrix[i/col][i%col] = d;
			visit[--d] = true;
			icon = new ImageIcon(image[d/col][d%col]);//分割
			button[i/col][i%col].setIcon(icon);
		}
	}
}

 (四)其他代码

由于博文篇幅太长容易造成大伙的视觉疲劳,所以有兴趣实现的小伙伴可以到附件下载Puzzle_lite.rar。还有就是写这个游戏的时候,学校课程还在C++和Java不断的切换,所以写出来的代码还有点C++的风格,望海涵。

 

四、不足之处

测试过程中发现,有的拼图拼到最后出现有1对板块是对调的,怎么都还原不到完整的顺序,这样的拼图其实是不可还原的拼图。

 

由于我们设计时,是将板块随机打乱,实际上并不是所有随机打乱之后都是可以还原的!确切的说,随机打乱后,有是不可以被还原的。

 

谢谢您的关注和阅读,文章不当之处还请您不吝赐教~~~微笑微笑微笑

 

 

  • 大小: 31.1 KB
  • 大小: 80.3 KB
  • 大小: 237.9 KB
  • 大小: 5.5 KB
  • 大小: 89.4 KB
  • 大小: 84.4 KB
  • 大小: 89 KB
  • 大小: 31.6 KB
  • 大小: 27.6 KB
  • 大小: 27.3 KB
  • 大小: 25.8 KB
  • 大小: 5.2 KB
分享到:
评论

相关推荐

    Java实现魔板拼图游戏游戏源码

    Java实现的魔板拼图游戏是一款基于Swing和GUI界面设计的项目,非常适合大学期末课设或新手进行实战训练。这个游戏的基本概念源自经典的拼图玩具,玩家需要将打乱的图片重新排列,恢复成完整的图像。以下是这个项目...

    Java实现拼图小游戏

    在本项目中,"Java实现拼图小游戏" 是一个基于Java编程语言开发的简单娱乐应用。这个小游戏的主要功能包括计时、计步、自定义图片、选择难度、背景音乐、预览原图以及自动复原等特性。让我们深入探讨这些知识点。 ...

    JAVA数字拼图游戏

    ### JAVA数字拼图游戏开发详解 #### 一、游戏概览与关键技术点 在《JAVA数字拼图游戏》中,开发者运用了Java语言强大的图形用户界面(GUI)库,包括`java.awt`和`java.awt.event`包中的类,来构建一个互动性强且...

    Java实现拼图游戏

    //启动游戏的类 public class MainApp { public static void main(String[] args) { //创建主界面 PictureMainFrame frame=new PictureMainFrame(); //显示主界面 frame.setVisible(true); } }

    java实现的拼图游戏

    "java实现的拼图游戏"项目就是一个很好的实例,它展示了如何利用Java编程技能创建一款互动娱乐应用。在这个项目中,开发者可能涉及了多个关键知识点,包括图形用户界面(GUI)、事件处理、数据结构和算法等。 首先...

    Java语言实现拼图游戏源代码

    ### Java语言实现拼图游戏源代码解析 #### 核心概念与设计思路 在本篇文章中,我们将深入探讨一个基于Java的小游戏——拼图游戏的源代码实现。这个项目不仅展示了Java在图形用户界面(GUI)开发上的能力,还涉及到...

    Java版拼图游戏完整源码+素材

    在本资源中,我们主要关注的是一个基于Java Swing开发的拼图游戏。Swing是Java的一个图形用户界面(GUI)工具包,它提供了丰富的组件和功能,使得开发者能够创建出功能完善的桌面应用,如这个拼图游戏。 1. **Swing...

    java拼图游戏 拼图

    【描述】:“用java实现的拼图游戏。刚学java是做的 没有用mvc模式。有用得着的可以看看” 1. **Java基础知识**:在编写拼图游戏时,首先需要掌握Java的基础语法,包括变量、数据类型、流程控制语句(如if-else、...

    Java实现拼图游戏源码

    总之,"Java实现拼图游戏源码"这个项目涵盖了面向对象编程、数据结构、算法、用户界面设计等多个方面的知识,对于学习和提升Java编程技能来说是一个很好的实践案例。通过分析和理解这段源码,开发者不仅可以掌握具体...

    JAVA拼图游戏设计报告

    本报告详细阐述了一个基于Java技术开发的拼图游戏的设计与实现。游戏的主要特点是自动化处理图片切割与加载过程,避免用户手动操作,且能根据图片大小自适应调整窗口尺寸,防止拼图错误和错位。游戏记录通过*.rc格式...

    java做的拼图游戏

    在Java中实现拼图游戏,我们需要掌握以下几个核心知识点: 1. **图形用户界面(GUI)**:Java提供了丰富的GUI库,如Swing和JavaFX,用于创建游戏界面。我们可以利用这些库设计出游戏面板,展示拼图的各个部分以及游戏...

    Java拼图游戏 Java拼图游戏

    在这个Java实现的版本中,我们可以看到开发者利用了Java的图形用户界面(GUI)库来创建游戏界面,使得用户可以通过鼠标操作进行游戏。 首先,我们要了解Java的基础知识。Java是一种跨平台的面向对象的编程语言,它...

    java程序编辑实现的拼图游戏

    在本文中,我们将深入探讨如何使用Java编程语言来实现一个拼图游戏,这是一个基于APPLET的小程序,结合了图形和声音元素。首先,我们需要理解APPLET的概念及其在Java中的应用。 **APPLET介绍** APPLET是Java早期...

    Java实现拼图游戏.zip

    Java实现拼图游戏是一个经典的计算机编程项目,它涵盖了多种编程技术与算法,是学习和实践Java编程的一个很好的实例。在本项目中,我们将探讨以下几个关键知识点: 1. **图形用户界面(GUI)**:Java拼图游戏通常...

    java 拼图小游戏

    Java 拼图小游戏是一个使用 Java 语言编写的拼图游戏,游戏界面包括一个 4x4 的游戏面板、一个预览面板和三个按钮:开始、预览和设置。游戏使用 Java 的 AWT 库来实现图形用户界面。 Java 语言特性 该游戏使用 ...

    java写的拼图游戏源码

    【标题】:“java写的拼图游戏源码” 这个标题表明我们正在讨论一个使用Java编程语言开发的拼图游戏的源代码。拼图游戏通常涉及到图像处理、算法设计以及用户交互等多个方面,是学习和理解面向对象编程、图形用户...

    Java课程设计 用Java实现拼图游戏

    在本项目中,"Java课程设计 用Java实现拼图游戏"是一个典型的计算机科学课程设计任务,主要聚焦于使用Java编程语言来开发一款拼图游戏。这个任务旨在帮助学生掌握Java编程基础,理解面向对象的设计原则,以及提高...

Global site tag (gtag.js) - Google Analytics