java拼图游戏原理随机打乱

很久没有没有写博文了!看一看关于智能拼图游戏的简单原理。
今天突发奇想,想做一个智能拼图游戏来给哄女友。
需要实现这些功能
第一图片自定义
第二宫格自定义,当然我一开始就想的是3*3 4*4 5*5,没有使用3*5这样的宫格。
第三要实现自动拼图的功能,相信大家知道女人耍游戏都不是很厉害,所以这个自动拼图功能得有。
其他什么暂停、排行就不写了!
现在重点问题出来了
要实现自动拼图功能似乎要求有点高哦!计算机有可不能像人一样只能:
先追究下本质
拼图游戏其实就是排列问题:
排列有这么一个定义:在一个1,2,...,n的排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。逆序数为偶数的排列称为偶排列;逆序数为奇数的排列称为奇排列。如2431中,21,43,41,31是逆序,逆序数是4,为偶排列。
再来一个定义:交换一个排列中的两个数,则排列的奇偶性发生改变。
以上定义都摘自《高等代数》。
拼图排列必须是偶排列。这个在我参考文献中可以找到。
所以我的只能拼图是这样实现的!
自动拼图:
首先自动拼图应该有一定的规则,根据我拼图的经验,要完成拼图,不同区域使用的拼图规则是不同的,所以:
我的宫格图分为了4个区域(假如宫格图是n*n个格子)
第一个区域:x坐标范围
0到n-2,y坐标范围 0到n-3
第二个区域:x坐标n-1,y坐标范围
第三个区域:x坐标范围
0到n-3&,y坐标范围
第四个区域:x坐标范围
n-2到n-1&,y坐标范围
n-2和n-1;即最后四格
每个区域按照各自区域的规则即可完成
Java源代码:
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
届本科论文于JAVA的拼图游戏.doc35页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
文档加载中...广告还剩秒
需要金币:100 &&
你可能关注的文档:
··········
··········
基于JAVA的拼图游戏
学院(直属系):计算机科学与技术系 时间: 日
学 生 姓 名
指 导 教 师
设计(论文)题目 基于JAVA的拼图游戏
究内容 1.实现程序GUI图形界面;
2.实现游戏开始、重来、退出功能;
3.设计实现游戏主要算法;
4.实现鼠标或键盘事件响应模块;
5.查看原图功能
研究方法 通过参阅网上已有实例,了解程序主要的算法,翻阅参考文献,了解程序设计的思想和理念,通过本身对程序的理解,对游戏的认识和在指导老师的帮助下来完成。
主要技术指标 或研究目标
主要技术:GUI,swing,ImageIcon等。
用JPanel,JButton,JLabel,JFrame等组件实现程序主界面窗口,事件监听来实现鼠标或键盘事件,实现图片的切换和按钮的作用,Imageicon来加载图片。
主要参考文献
[1] 唐大仕:Java程序设计[M],北方交通大学出版社,-P62?
[2] 郑莉:Java语言程序设计[M],清华大学出版社,-P75?
[3] 朱站立:Java程序设计实用教程[M],电子工业出版社,-P70??
[4] 耿祥义:java2实用教程[M],清华大学出版社,-P92?
[5] 朱站立:Java程序设计实用教程[M],电子工业出版社,-P70 基于JAVA的拼图游戏
摘要 JAVA语言是由美国sun公司开发的一种完全面向对象的程序设计语言,它由c++语言发展而来,但比c++语言简单。语言具有简单、与平台无关、高效、健壮、安全、多线程等特点,是当前网络编程中的首选语言。本文主要通过语言来开发一个小游戏,以实现其相关功能。
Jigsaw puzzle based on Java
JAVA language is developed by the sun a fully object-oriented programming language, it is developed by c + + language, but simpler than c + + language.The JAVA language has a simple, platform-independent, efficient, robust and secur
正在加载中,请稍后...下次自动登录
现在的位置:
& 综合 & 正文
JAVA实现拼图游戏
package org.
/** * &p&Title: LoonFramework&/p& * &p&Description:拼图图像处理[未优化](优化算法已内置于loonframework-game框架中。)&/p& * &p&Copyright: Copyright (c) 2007&/p& * &p&Company: LoonFramework&/p& * @author chenpeng
* @email:.cn
* @version 0.1 */
import java.awt.Cimport java.awt.Cimport java.awt.Eimport java.awt.Fimport java.awt.Gimport java.awt.Iimport java.awt.MediaTimport java.awt.image.BufferedI
import org.loon.framework.game.helper.ImageH
public class BlockImage extends Canvas {
private static final long serialVersionUID = 1L;
private Image _
private Image _img2;
private int blocks[];
private boolean isE
private MediaT
private int _
private int _
private int _RS;
private int _CS;
private Image screen = null;
private Graphics later = null;
private int _objW
private int _objH
private int _COUNT;
* 析构函数,内部调用init方法。
* @param bImage
* @param overImage
* @param cs
* @param rs
public BlockImage(Image bImage, Image overImage, int cs, int rs) {
init(bImage, overImage, cs, rs);
* 初始化拼图参数。
* @param bImage
* @param overImage
* @param cs
* @param rs
public void init(Image bImage, Image overImage, int cs, int rs) {
// 加载拼图用图像。
// 获得实际窗体宽。
_width = _img.getWidth(null);
// 获得实际窗体高。
_height = _img.getHeight(null);
// 获得单块图像宽。
_objWidth = _width / _CS;
// 获得单块图像高。
_objHeight = _height / _RS;
// 本直接使用backimage上一块图形区域缓冲选择项,所以实际背景图像高=图形高+额外图块高。
backimage = new BufferedImage(_width, _height + _objHeight, 1);
// 获得生成的图形
later = backimage.getGraphics();
// 再创建一块图像区域,作为图像缓存用。
screen = new BufferedImage(_width, _height, 1);
// 获得缓存的图形
bg = screen.getGraphics();
// 获得等同图片总数的数组。
_COUNT = _CS * _RS;
blocks = new int[_COUNT];
// 初始化为非点击。
isEvent = false;
// 加载完成拼图的显示图。
_img2 = overI
// 初始化图块参数。
for (int i = 0; i & _COUNT; i++) {
blocks[i] =
// 载入MediaTracker,用以跟踪图像状态。
mt = new MediaTracker(this);
// 加载被跟踪的图像。
mt.addImage(_img, 0);
mt.addImage(_img2, 0);
// 同步载入。
mt.waitForID(0);
} catch (InterruptedException interruptedexception) {
// 随机生成图像面板内容。
rndPannel();
* 描绘窗体图像。
public void paint(Graphics g) {
// 检查图像载入。
if (mt.checkID(0)) {
// 描绘底层背景。
bg.drawImage(backimage, 0, 0, null);
// 判断是否触发完成事件。
if (!isEvent) {
// 设置背景色。
bg.setColor(Color.black);
// 循环绘制小图片于背景缓存中。
for (int i = 0; i & _CS; i++) {
for (int j = 0; j & _RS; j++)
bg.drawRect(i * _objWidth, j * _objHeight, _objWidth,
_objHeight);
// 仅当完成事件触发并且有胜利图片时,载入完成提示。
if (isEvent && _img2 != null) {
bg.drawImage(_img2, 0, 0, null);
// 举凡绘制图像时,应遵循显示图像仅绘制一次的基本原则,一次性的将背景绘制到窗体。
// 简单来说,也就是采取[双缓存]的方式,所有复杂操作皆在缓存区完成,也只有这样才能避免产生延迟闪烁。
g.drawImage(screen, 0, 0, this);
g.dispose();
* 变更图像。
public void update(Graphics g) {
* 鼠标点击事件。
public boolean mouseDown(Event event, int i, int j) {
if (isEvent)
return true;
// 换算点击位置与小图片。
int k = i / _objW
int l = j / _objH
copy(0, 0, 0, _RS);
copy(k, l, 0, 0);
copy(0, _RS, k, l);
int i1 = blocks[0];
// 换算选中图片存储区。
blocks[0] = blocks[l * _CS + k];
blocks[l * _CS + k] = i1;
for (j1 = 0; j1 & _COUNT; j1++) {
if (blocks[j1] != j1) {
if (j1 == _COUNT)
isEvent = true;
repaint();
return true;
public boolean mouseUp(Event event, int i, int j) {
return true;
public boolean mouseDrag(Event event, int i, int j) {
return true;
* copy换算后的图像区域。
* @param i
* @param j
* @param k
* @param l
void copy(int i, int j, int k, int l) {
later.copyArea(i * _objWidth, j * _objHeight, _objWidth, _objHeight,
(k - i) * _objWidth, (l - j) * _objHeight);
* 事件触发状态。
public boolean isEvent() {
return isE
public void setEvent(boolean isEvent) {
this.isEvent = isE
* 随机生成面板图片。
void rndPannel() {
later.drawImage(_img, 0, 0, this);
for (int i = 0; i & (_COUNT * _CS); i++) {
int j = (int) ((double) _CS * Math.random());
int k = (int) ((double) _RS * Math.random());
int l = (int) ((double) _CS * Math.random());
int i1 = (int) ((double) _RS * Math.random());
copy(j, k, 0, _RS);
copy(l, i1, j, k);
copy(0, _RS, l, i1);
int j1 = blocks[k * _CS + j];
blocks[k * _CS + j] = blocks[i1 * _CS + l];
blocks[i1 * _CS + l] = j1;
public static void main(String[] args) {
Frame frm = new Frame("简单的JAVA拼图效果实现[由Loonframework框架提供]");
frm.setSize(480, 500);
frm.setResizable(false);
* PS:ImageHelper.loadImage为Loonframework框架中helper下方法,为不依赖于javax扩展包而开发。
* 可使用ImageIO相关方法代替。
// 加载图像。
Image backImage = ImageHelper.loadImage("C:/backimage.jpg", true);
Image overImage = ImageHelper.loadImage("C:/over.gif", true);
// BlockImage中参数分别为 用于分解的拼图,完成后显示文字,拆分图片为分几列,分拆分图片为几行。
//建议使用正方形图片作为背景图。
frm.add(new BlockImage(backImage, overImage, 4, 4));
backImage = null;
overImage = null;
// 显示窗体。
frm.setVisible(true);
详细操作参见源码注释,所用图片如下(也可自由选取图形):
本支持自由成比例分隔图像行列,效果若下:
-----------------------疯猫注:
其中的ImageHelper类因为没有源码,改用了ImageIO
// 加载图像。
Image backImage = ImageIO.read(new File("d:/backimage.jpg"));
Image overImage = ImageIO.read(new File("d:/over.gif"));
&&&&推荐文章:
【上篇】【下篇】做了个Swing的拼图游戏,欢迎大家点点看-Java/JavaSE-java-电脑编程网做了个Swing的拼图游戏,欢迎大家点点看-Java/JavaSE作者:truediego 和相关&&做了个Swing的拼图游戏,欢迎大家点点看 (jdk1.6u8),给点意见http://download.csdn.net/source/2295897------回答---------------其他回答(5分)---------厉害,,我最近正在 研究这swing呢。。。我想看看源码 怎么写的。。。lz可以共享不啊?。。。------其他回答(5分)---------引用 4 楼 truediego 的回复:源代码我另外上传了,不过在csdn上还没显示出来哦 lz真是好人啊。。你一定把地址发上来啊 , 我要向你学习。。。------其他回答(5分)---------看了下,感觉还行。但是速度有点慢,而且好像跟一般的拼图游戏不太一样,图片加载上去后并不是随机地散列在格子里,而是要自己一点一点地拖上去。一点小建议:优化算法,提高速度;用随机算法,并确定随机出来的能不能拼成功。。记得好像有不能拼成功的可能哈。。。------其他回答(5分)---------顶 顶 顶 顶
顶相关资料:|||||||做了个Swing的拼图游戏,欢迎大家点点看-Java/JavaSE来源网络,如有侵权请告知,即处理!编程Tags:                &                    Java实现小拼图游戏 - WillYoung
【】&&&&&【】&&&&&【】
日期: 22:07:03 点击量:
今天整理之前的项目,发现了在大二上学期的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
public class point//坐标
public point(int r, int c)
}//构造函数初始化
public void set(int r, int c)
}//设置坐标
public int getRow()
}//获取行坐标
public int getCol()
}//获取列坐标
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 PictureO
import java.awt.image.BufferedI
import java.io.F
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 Split() {}
public static Split get()
if (Ob == null)
Ob = new Split();
return Ob;
public boolean set(String fn)
filename =
path = Arg.path + "/" +
File file = new File(path);
return file.exists();
public BufferedImage[][] divid(int type)
if (filename == 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);
int len = level[type];
int cal = image.getWidth() /
int row = image.getHeight() /
BufferedImage [][] subimage = new BufferedImage[row][cal];
for (int i = 0; i & i++)
for (int j = 0; j & j++)
subimage[i][j] = image.getSubimage(j*len,
i*len, len, len);
catch (Exception e)
(三)图片交换类
当点击一张图片时,如果它的周围四个位置有一个为空白,则可以移动到空白位,并让该图片位置变成空白。
//Matrix.java
package PictureO
import Function.*;
import java.awt.image.BufferedI
import javax.swing.JP
import javax.swing.JB
import javax.swing.ImageI
public class Matrix
private JButton [][]
private JP
private int [][]
private GameOver gO
public Matrix(JButton [][] b, JPanel p, int len, GameOver g)
this.button =
this.panel =
this.gOver =
row = b.//长
col = b[0].//宽
matrix = new int[row][col];
matrix[row-1][col-1] = row *
gOver.start(matrix);
panel.removeAll();
point pint = new point(row-1, col-1);
for (int i = 0; i & i++)
for (int j = 0; j & 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)
int r, c, rad, d,
boolean [] visit = new boolean[row*col-1];
for (int i = 0; i & row*col - 1; i++)
rad = (int)(Math.random()*(row*col-1-i));
for (d = m = 0; d & row*col - 1 && m &= d++)
if (!visit[d])
matrix[i/col][i%col] =
visit[--d] =
icon = new ImageIcon(image[d/col][d%col]);//分割
button[i/col][i%col].setIcon(icon);
(四)其他代码
由于博文篇幅太长容易造成大伙的视觉疲劳,所以有兴趣实现的小伙伴可以到附件下载Puzzle_lite.rar。还有就是写这个游戏的时候,学校课程还在C++和Java不断的切换,所以写出来的代码还有点C++的风格,望海涵。
四、不足之处
测试过程中发现,有的拼图拼到最后出现有1对板块是对调的,怎么都还原不到完整的顺序,这样的拼图其实是不可还原的拼图。
由于我们设计时,是将板块随机打乱,实际上并不是所有随机打乱之后都是可以还原的!确切的说,随机打乱后,有是不可以被还原的。
谢谢您的关注和阅读,文章不当之处还请您不吝赐教~~~
自定义表单
本例固定链接:

我要回帖

更多关于 java拼图游戏 的文章

 

随机推荐