在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Java游戏开发 → java 拼图游戏完整源码,图片剪切,包含拼图自动还原功能

java 拼图游戏完整源码,图片剪切,包含拼图自动还原功能

Java游戏开发

下载此实例
  • 开发语言:Java
  • 实例大小:0.05M
  • 下载次数:46
  • 浏览次数:1774
  • 发布时间:2019-04-16
  • 实例类别:Java游戏开发
  • 发 布 人:chenxiaolan
  • 文件格式:.rar
  • 所需积分:2
 相关标签: 游戏 拼图 Android 图片 源码

实例介绍

【实例简介】这是一个基于android开发的拼图游戏,现在把游戏的源码共享给大家,游戏中的功能包括选择游戏难度,通过游戏难度来设置图片切割的数量,游戏中的亮点是增加了游戏自动还原功能,功能的实现已经包含在了游戏的源码中,大家可以在里面自己找,有哪里不懂的可以问我哈,

【实例截图】

from clipboard

【核心代码】


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);
       }
}


实例下载地址

java 拼图游戏完整源码,图片剪切,包含拼图自动还原功能

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 大一一 发表于: 2020-05-18 18:45 16
哪有拼图自动还原功能呀

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有1条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警