基本信息
源码名称:java 拼图游戏完整源码,图片剪切,包含拼图自动还原功能
源码大小:0.05M
文件格式:.rar
开发语言:Java
更新时间:2019-04-16
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):78630559
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
这是一个基于android开发的拼图游戏,现在把游戏的源码共享给大家,游戏中的功能包括选择游戏难度,通过游戏难度来设置图片切割的数量,游戏中的亮点是增加了游戏自动还原功能,功能的实现已经包含在了游戏的源码中,大家可以在里面自己找,有哪里不懂的可以问我哈,
这是一个基于android开发的拼图游戏,现在把游戏的源码共享给大家,游戏中的功能包括选择游戏难度,通过游戏难度来设置图片切割的数量,游戏中的亮点是增加了游戏自动还原功能,功能的实现已经包含在了游戏的源码中,大家可以在里面自己找,有哪里不懂的可以问我哈,
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.net.URL;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class TestPinTu extends JPanel implements MouseListener{
/**
*
*/
// private static final long serialVersionUID = 1L;
private Image _img;
private Image _img2;
private Image backimage;
private int blocks[];
private boolean isEnd;
private MediaTracker mt;
private int _width;
private int _height;
private int _RS;
private int _CS;
private Graphics later = null;
private int _objWidth;
private int _objHeight;
private int _COUNT;
/**
* 构造方法,内部调用init方法。
*
* @param bImage
* @param overImage
* @param cs
* @param rs
*/
public TestPinTu(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) {
// 列数
_CS = cs;
// 行数
_RS = rs;
// 加载拼图用图像。
_img = bImage;
// 获得实际窗体宽。
_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();
_COUNT = _CS * _RS;
blocks = new int[_COUNT];
// 加载完成拼图的显示图。
_img2 = overImage;
// 初始化图块参数。
for (int i = 0; i < _COUNT; i ) {
blocks[i] = i;
}
// 载入MediaTracker,用以跟踪图像状态。
mt = new MediaTracker(this);
// 加载被跟踪的图像。
mt.addImage(_img, 0);
mt.addImage(_img2, 0);
// 同步载入。
try {
mt.waitForID(0);
} catch (InterruptedException interruptedexception) {
return;
}
// 随机生成图像面板内容。
rndPannel();
}
/**
* 描绘窗体图像。
*/
public void paint(Graphics g) {
// 检查图像载入。
if (mt.checkID(0)) {
// 描绘底层背景。
later.drawImage(backimage, 0, 0, null);
// 判断是否触发完成事件。
if (!isEnd) {
// 设置背景色。
later.setColor(Color.black);
// 循环绘制小图片于背景缓存中。
for (int i = 0; i < _CS; i ) {
for (int j = 0; j < _RS; j )
later.drawRect(i * _objWidth, j * _objHeight, _objWidth,
_objHeight);
}
}
// 仅当完成事件触发并且有胜利图片时,载入完成提示。
if (isEnd && _img2 != null) {
later.drawImage(_img2, 0, 0, null);
}
}
// 举凡绘制图像时,应遵循显示图像仅绘制一次的基本原则,一次性的将背景绘制到窗体。
// 简单来说,也就是采取[双缓存]的方式,所有复杂操作皆在缓存区完成,也只有这样才能避免产生延迟闪烁。
g.drawImage(backimage, 0, 0, this);
g.dispose();
}
/**
* 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);
}
/**
* 随机生成面板图片。
*
*/
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 void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
// if (isEnd)
// return true;
// 换算点击位置与小图片。
int k = e.getX()/ _objWidth;
int l = e.getY()/ _objHeight;
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;
int j1;
for (j1 = 0; j1 < _COUNT; j1 ) {
if (blocks[j1] != j1) {
break;
}
}
if (j1 == _COUNT)
isEnd = true;
repaint();
// return true;
}
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
public static void main(String[] args) {
JFrame frm = new JFrame("简单的JAVA拼图游戏");
frm.setSize(480, 500);
frm.setResizable(false);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 加载图像。
//URL url=TestPinTu.class.getResource("..\\img\\backimage.jpg");
//System.out.print(url);
// Image backImage=Toolkit.getDefaultToolkit().getImage(url);
Image backImage= Toolkit.getDefaultToolkit().getImage("img/backimage.jpg");
Image overImage = Toolkit.getDefaultToolkit().getImage("img/over.gif");
MediaTracker tracker=new MediaTracker(frm);
tracker.addImage(backImage, 0);
tracker.addImage(overImage, 0);
try {
tracker.waitForAll(0);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// BlockImage中参数分别为 用于分解的拼图,完成后显示文字,拆分图片为分几列,分拆分图片为几行。
//建议使用正方形图片作为背景图。
TestPinTu blo=new TestPinTu(backImage, overImage, 3, 3);
frm.add(blo);
frm.addMouseListener(blo);
backImage = null;
overImage = null;
// 显示窗体。
frm.setVisible(true);
}
}