基本信息
源码名称:java 拼图游戏完整源码,图片剪切,包含拼图自动还原功能
源码大小:0.05M
文件格式:.rar
开发语言:Java
更新时间:2019-04-16
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 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); } }