java拼图游戏图片插入与分割
Java课程设计拼图报告
Java应用技术实训报告题目多功能拼图游戏软件所在院系软件学院所在单位软件教研室一.总体设计本系统共包括11个java源文件和2文件。
这是个功能比较齐全的拼图游戏,最关键的不用自己手动切割图片,再进行加载。
而是应用类方法在内存中进行图片切割和加载,方便了用户的使用。
另外,该程序会根据图片的大小自动生成窗口大小,不会造成切割图片错误和切割错位。
程序最后以*.rc格式的文件来保存游戏记录。
1.类之间的关系如图1所示。
2.java源文件及其功能如表1所示。
二、详细设计该拼图游戏结合了许多元素,可以图片切割,游戏拼图,游戏成功时和打破记录时的判断,同时还有游戏时间和步数的记录,并以文档形式进行保存。
在拼图时首先把图片添加到background目录下,程序会自动获取该目录下的所有文件,并加载到游戏中,进行切割后,显示在拼图按钮上。
在游戏开始后会更新“开始“菜单,增加“显示图片”菜单项。
拼图结束时可以显示游戏成绩和记录的存档。
1.主类Puzzle(1)成员变量见表2(2)方法见表2-1表2-1(3)源代码见文件Puzzle.java2.类CardFrame(1)成员变量见表3(2)方法见表3-1(3)源代码见文件CardFrame.java3.类MenuFrame(1)成员变量见表4(2)方法见表4-1(3)源代码见文件MenuFrame.java4类ShowImage(1)成员变量见表5(2)方法见表5-1(3)源代码见文件ShowImage.java5类Split(1)成员变量见表6(2)方法见表6-1(3)源代码见文件Split.java6类Matrix (1)成员变量见表7(2)方法见表7-1(3)源代码见文件Matrix.java7.类Grades(1)成员变量见表8(2)方法见表8-1(3)源代码见文件CardFrame.java8.类GameOver(1)成员变量见表9(2)方法见表9-1(3)源代码见文件GameOver.java9.类point(1)成员变量见表10(2)方法见表10-1(3)源代码见文件point.java10. 类ButtonClick(1)成员变量见表11(2)方法见表11-1(3)源代码见文件ButtonClick.java11类Arg(1)成员变量见表12(2)代码见文件Arg.java三.运行效果游戏启动后的初始界面图1图1选择“关于”菜单下的“帮助“菜单弹出如下对话框:图2图2选择“关于”菜单下的“关于“菜单弹出如下对话框:图3图3选择难度级别–中级和背景图片,按开始后就可进入游戏画面如图4图4在游戏过程中可以按“开始”菜单下面的“显示图片”来查看完整图片如图5图5游戏成功后会显示你游戏所用时间和移动图块的步数如图6图6如果你的游戏时间打破记录就会首先显示如下画面如图7图7输入名字后,按确定就可以查看所有成绩排名了如图8(也可以通过“开始”菜单下的“分数排名”来查看成绩)图8所有游戏截图完毕四.工作总结经过这段时间的学习我收获不小,总结起来有如下几点:1 更进一步理解了JAVA编程的思想,体会到JAVA与其他编程语言的不同。
java拼图小游戏课程设计
java拼图小游戏课程设计一、课程目标知识目标:1. 学生能理解Java基本语法和面向对象编程的概念;2. 学生能掌握使用Java编写图形用户界面(GUI)的方法;3. 学生能了解数组的使用以及二维数组在拼图游戏中的应用;4. 学生能掌握基本的事件处理和逻辑判断方法。
技能目标:1. 学生能运用所学知识,设计并编写出一个简单的Java拼图小游戏;2. 学生能通过调试和优化代码,提高程序的稳定性和用户体验;3. 学生能在团队协作中发挥个人优势,共同完成项目任务。
情感态度价值观目标:1. 学生培养对编程的兴趣和热情,激发探究精神;2. 学生在项目实践中,树立自信心,勇于面对挑战;3. 学生通过团队协作,学会沟通、分享和承担责任;4. 学生在编程实践中,遵循道德规范,尊重他人成果。
本课程针对初中年级学生,结合Java编程语言的教学要求,注重培养学生的编程兴趣和实际动手能力。
课程以拼图小游戏为载体,让学生在实践过程中掌握Java编程基础和面向对象编程思想,提高解决问题的能力和团队协作精神。
通过本课程的学习,期望学生能够达到上述具体、可衡量的学习成果。
二、教学内容1. Java基本语法与面向对象编程:- 数据类型、变量、运算符- 控制结构:条件语句、循环语句- 面向对象:类、对象、构造方法、封装、继承、多态2. Java图形用户界面(GUI)设计:- Swing组件:窗口、标签、按钮、面板- 布局管理器:边界布局、流布局、网格布局- 事件处理:事件监听器、事件适配器3. 数组与二维数组:- 数组的声明、初始化、遍历- 二维数组的操作与应用4. 拼图游戏原理与实现:- 游戏逻辑设计- 图片切割与显示- 拼图移动与验证5. 程序调试与优化:- 代码调试技巧- 性能优化方法6. 团队协作与项目管理:- 项目任务分配- 团队沟通与协作- 项目进度管理本教学内容根据课程目标,结合教材相关章节,以科学性和系统性为原则进行组织。
JAVA拼图游戏设计报告
五、功能说明
游戏功能图:
拼图游戏
开
查
选
始
看
择
游
图
图
戏
片
片
退 出 游 戏
本拼图游戏,运用了 Java2 中的图形处理技术和消息响应技术。通过图形技 术,实现图片的导入和分割。通过消息响应机制,使程序可以响应用户的鼠标操 作,进行拼图游戏的操作。
这个游戏主要分为四个模块,分别是游戏开始、查看图片、选择图片和退出 游戏。这四个摸块的功能各不一样,玩家如果在游戏过程中感觉拼图小块之间的 接合不明显,玩家可以点击“查看”按钮来浏览拼图完成的效果图,从而使得游 戏不会无从下手;玩家如果觉得当前拼图的画面不满意可以点击“选择”图片按 钮来更换图片,或者想更改拼图的画面,玩家可以进入游戏文件夹进行更换图片 文件,但是需要注意的是图片需要有格式,同时还需要将所要更改的图片切割成 大小相同的九个小块,具体就不详细说了,游戏文件夹中会给大家附一个.txt 文 件,供大家更换图片使用,从而提高玩家乐趣。
} } } public void breakRank() {//方格打乱重新排序 while (pane[0].getBounds().x <= 100 && pane[0].getBounds().y <= 100) {//当 第 一个方格距左上角近时
Java实现图像分割功能
Java实现图像分割功能使⽤Java实现图像分割,供⼤家参考,具体内容如下为减少动画制作过程中的IO操作,我们可以使⽤连续动画来改善动画播放效率。
假如我们有如下的⼀张图像:如果我们对图像中的每张⼩图像单独分割成独⽴的⽂件,那么当每次要使⽤这些⼩图像的时候,我们都得从⽂件中读取图像信息。
实际上我们可以利⽤Java将整张⼤图像中的每个⼩图像在应⽤程序中分割出来,然后使⽤的时候,直接从分割后的图像中获取需要使⽤的⼩图像就可以了,这样就不⽤每次都从⽂件中读取⼩图像信息,效率⾃然会⽐较⾼。
那么如何来实现图像分割操作呢?⽰例:import ponent;import java.awt.Image;import java.awt.image.CropImageFilter;import java.awt.image.FilteredImageSource;import java.awt.image.ImageFilter;/*** 图像处理辅助类** @author ⼩明**/public class ImageUtil {/*** 分割图像** @param image* 传⼊的图⽚对象* @param rows* 垂直⽅向上需要裁剪出的图⽚数量 - ⾏* @param cols* ⽔平⽅向上需要裁剪出的图⽚数量 - 列* @param x* 开始裁剪位置的X坐标* @param y* 开始裁剪位置的Y坐标* @param width* 每次裁剪的图⽚宽度* @param height* 每次裁剪的图⽚⾼度* @param changeX* 每次需要改变的X坐标数量* @param changeY* 每次需要改变的Y坐标数量* @param component* 容器对象,⽬的是⽤来创建裁剪后的每个图⽚对象* @return 裁剪完并加载到内存后的⼆维图⽚数组*/public static Image[][] cutImage(Image image, int rows, int cols, int x,int y, int width, int height, int changeX, int changeY,Component component) {Image[][] images = new Image[rows][cols];for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {ImageFilter filter = new CropImageFilter(x + j * changeX, y + i* changeY, width, height);images[i][j] = component.createImage(new FilteredImageSource(image.getSource(), filter));}}return images;}}编写⼀个专门分割图像的⽅法cutImage(),该⽅法中使⽤到的CropImageFilter类、FilteredImageSource类的详情,⼤家可以参考JavaAPI⽂档。
基于Java的拼图游戏设计
Java课程设计——拼图游戏信101 孙杰2010314126Java课程设计——拼图游戏班级:信101学号:2010414126姓名:孙杰指导老师:李红强基于Java的拼图游戏设计游戏实现功能解析及界面游戏规则介绍1)本游戏是一个Java语言的拼图游戏,有一个格子是空的,其他格子内随机放置由要拿来拼图的图片切割成的若干个小图片,图片的切割按照一定的公式计算,因为,该通过单击任意一个与空格子相邻的方块可以把该方游戏中设有拼图游戏的等级,根据不同的等级,按照公式会切割成不同的小图片块数。
2)在开始游戏之前,可以选择游戏等级后再点击“开始”菜单里的“新游戏”,进行拼图游戏,通过将空格旁边的小图片移入空格子内(不断的移动方块),来实现拼图,直到方块一行一行的按图片的原始样子拼好即可完成该游戏。
3)游戏拼完后,会弹出一个“信息”框,显示你玩游戏所用的步数与时间,点击“确定”后,会弹出一个“输入”框,可以在里面输入游戏者的姓名,单击“确定”后会弹出游戏的记录框。
4)游戏的简单规则在游戏界面的“关于”菜单内的“帮助”信息框内已经简单介绍了。
游戏前可以先预览看看。
游戏实现功能主窗口界面1)游戏初始状态当游戏刚运行时,会出现如下界面,本游戏中已经存在了三张图片,如过游戏者想拼自己感兴趣的图片的话,可以将自己的图片放入到“background”(背景图片)文件夹中,再进行“选择”->“背景图片”中选择你自己的图片,然后选择“等级”->“困难”或“普通”或“简单”,进行等级选择,最后选择“开始”->“新游戏”就可以拼自己想拼的图了。
初始窗口如图1所示:图1 游戏初始窗口2)游戏进行状态当游戏者选择好图片与等级后,就可以进行拼图游戏了及进入游戏的进行状态。
3)游戏暂停状态当游戏者,在游戏过程中半途暂停游戏的话,将出现如图3所示的游戏暂停状态的界面。
当游戏者又想继续游戏时,直接单击界面上的“继续”字样,就可以继续游戏了。
JAVA课程设计 拼图游戏复习进程
拼图游戏1.游戏规则介绍(1)本游戏中有一个格子是空的,其他格子内随机放置由要拿来拼图切割成的8个小图片。
在开始游戏之前,会出现一张完整的图片,点击“菜单”里面的“开始”,进行拼图游戏,通过将空格旁边的小图片与空格交换位置(不断的移动方块),来实线拼图,直到方块一行一行的按图片的原始样子拼好即可完成该游戏。
在移动过程中,窗口右边会显示移动的步数。
(2)游戏拼完后,会弹出一个信息框,询问是否再玩一局,点击“Yes”将再打开一个游戏开始的界面,可以继续新的一局游戏,点击“No”将结束游戏,关闭所有窗口。
2.游戏实现的功能(1)点击运行程序,将弹出一个窗口,显示一张完整的图片。
(2)菜单栏的菜单,会出现3个菜单项:“开始”、“重新开始”、“结束”。
点击“开始”,即开始一局游戏;“在游戏的任何时候点击”重新开始“,即结束当前游戏,重新开始一局新的游戏;点击“退出“,立即退出游戏,关闭窗口。
(3)在游戏过程中,游戏界面右边会同步显示当前的步数。
游戏的一些界面:(1)主界面:(2)菜单项:(3)帮助--->关于(4)点击开始(5)游戏过程(6)游戏成功(7)破纪录3.程序实现Pt类:(1)建立一个类Pt,public class Pt extends JFrame implements KeyListener{}。
该类继承父类JFrame,实现KeyListener接口。
(2)Pt类的构造函数Pt()。
定义窗口参数,添加菜单栏和多个标签;调用读文件函数read (),读取该游戏的最高记录,并将该记录输出到标签上;为各个菜单添加事件,鼠标点击“开始”菜单,将调用star()函数,游戏开始,点击“重新开始”,将关闭当前窗口并重新打开游戏,点击“退出游戏”,将立即退出游戏;点击“帮助- 关于”,将新建About类的一个对象,弹出游戏说明的窗口。
(3)Pt类的star()函数。
将未开始的完整图片设为不可见;加入键盘监视器;调用生成0~8随机序列的函数,返回随机序列;根据该随机序列调用加入图标函数putLabel(),将9个方块加上图片;定义一个一维int型数组number[],记录随机序列,供后面判断是否拼图成功。
java课程设计拼图游戏
• 状态判断
通过调用public void checkStatus()方法来 检测拼图状态,判断是否拼图成功,确定游戏是否结 束。
• 附加功能
调用public void run()方法,给游戏过程添加计时进程。 建立线程,对游戏进行计时,并定义一个方法来对玩家 算分
• 程序界面
• 本游戏在Pintu类中创建应用程序窗体,实 例化绘图容器对象PicPanel和状态栏标签对 象,并引入时间处理机制对键盘事件进行 响应 • 在类PicPanel中实现图片的绘制,使用多线 程机制来计算时间的流逝,并响应鼠标事 件来实现图片的移动。
主程序实现过程
• • • • • • • • 1、定义程序实现所需的绘图容器类面板; 2、定义键盘触发事件,并设置监听器; 3、定义鼠标触发事件,并设置监听器; 4、装载主程序所需图片; 5、编写程序对装载图片进行分割初始化; 6、定义图片分割之后各小图片移动方向及实现方法; 7、对空白区域小图片进行设置; 8、建立线程,对游戏进行计时,并定义一个方法来对玩家算分
• 功能分析
1、由于要计算游戏的时间,需要引入线程,通
过实现Runnable接口和创建Thread类来实现线程 的功能。使用多线程机制来计算时间的流逝。引 入AWT绘图包,实现图片的绘制。 引入事件处理 机制,要求对鼠标事件,键盘事件进行相应,实 现移动图片,预览全图等功能。 2、 按键“Y”实现临时的原图整体预览。 按键 “1或者2或者3”实现大图选择。
Java课程设计
概要设计
• • • • • • • • •
选游功 题戏能 规分 则析
界 面 初 始 化
事 件 处 理
状 态 判 断
附 加 功 能
程 序 源 代 码
Java拼图游戏面向对象课程设计报告
姓名Name学号Student No.20137045 班级Class代码总行数Code Lines 222项目名称Item1.实验目的本次课程设计旨在通过一个完整项目的开发,巩固面向对象程序设计、软件工程、数据库技术等课程的相关知识,加深学生对Java语言的理解,尤其是对面向对象思想、Java编码规范、JDBC访问数据库的理解,使学生进一步掌握环境构建、代码编写、文档阅读与理解、文档编写、软件测试、发行与部署等技能,进一步提高学生的学习能力、理解能力、表达能力及沟通能力。
2.实验内容本次课程设计选定的实验项目是使用JAVA语言编写一个拼图游戏并实现其基本功能。
不用自己手动切割图片,再进行加载。
而是应用类方法在内存中进行图片切割和加载,方便了用户的使用。
利用了Graphics中的public abstract boolean drawImage()方法把img 中由(sx1, sy1)(sx2, sy2)指定的矩形区域画到observer 中由(dx1, dy1)(dx2, dy2)指定的矩形区域内进行构思拼图游戏的具体实现。
导入了一个可播放背景音乐的jar包,在玩游戏时可以欣赏背景音乐。
3.类图4.运行界面图1、游戏初始界面图2、游戏运行界面图3、拼图成功界面5.关键代码(要求在类的定义以及方法定义的前面给出相关描述信息)//定义一个Pintu类public class Jpgsaw extends JFrame{private Image image, buff; //原始图片,缓存图片private int[][] map = {{0, 1, 2},{3, 4, 5},{6, 7, 8}}; //定义数组map,给分割后的图片标号private Point point = new Point(2, 2); //记录第九块图片位置private int sx; //分割后每一个图片的宽度private int sy; //分割后每一个图片的高度private Canvas canvas; //加载图片容器,定义可以显式定位子元素使用坐标是相对 Canvas 区域的区域,绘制图形private Graphics gs; //gs画出Canvas图片坐标private Graphics gb; //gb画出buff图像private boolean isRunning = false; //游戏是否正在进行private JButton start = new JButton("开始新的游戏"); // 按钮1private JButton show = new JButton("显示正确图片"); //按钮2private JTextArea showStep = new JTextArea("显示步骤");//设置步骤显示private JPanel panel = new JPanel(); //一般轻量级面板容器,装在上面2个按钮private int steps = 0; // 记录移动的步骤public Jpgsaw(String title) { //构造方法,初始化变量super(title);//调用了当前类Jpgsaw的父类JFrame的构造方法try { //异常抛出image = ImageIO.read(new File("gg.jpg")); //装载图片} catch (IOException e) {//捕获自定义的异常e.printStackTrace();}initScreen(); //用此方法来初始化canvas,由于canvas 初始化较复杂,所以单独写一个方法buff = new BufferedImage(715, 381, BufferedImage.TYPE_INT_BGR);//Image的一个子类,BufferedImage生成的图片在内存里有一个图像缓冲区,利用这个缓冲区我们可以很方便的操作这个图片gb = buff.getGraphics();//存在于Image类中,存在于缓冲器中的图片,设置坐标sx = image.getWidth(this) / 3;//图片分割后每一个图片的宽度sy = image.getHeight(this) / 3;//图片分割后每一个图片的高度setLayout(new BorderLayout());//设置此布局方法,加入控件add(panel, BorderLayout.SOUTH);//布置容器的边框布局,它可以对容器组件进行安排,并调整其大小add(canvas, BorderLayout.CENTER);panel.setLayout(new GridLayout(1, 4));//把组件按指定的几行几列分开,添加其他组件时,会按添加的顺序挨个添加到该组件上panel.add(start);panel.add(show);panel.add(showStep);showStep.setEditable(false);//步骤默认false,使调用这个函数的控件不能被编辑showStep.setFont(new Font("黑体", Font.PLAIN, 16));//设置字体setSize(720, 425);setResizable(false);//表示生成的窗体大小,不可改变大小setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//执行关闭按钮,关闭窗体 }//具体实现Canvas,进行初始化void initScreen(){canvas = new Canvas(){public void paint(Graphics g) { //覆写canvas的paint 方法gs = getGraphics(); //得到Canvas的Graphicsif (isRunning) {drawScreen();//运行,调用此方法} else {g.drawImage(image, 0, 0, this);//在指定的位置使用原始物理大小绘制指定的 Imageg.setColor(Color.gray);//设置前景颜色,变为灰色}}};canvas.addMouseListener(new MouseAdapter() {//添加鼠标事件监听器//覆写mousePressed 方法,实现鼠标点击时,图片移动public void mousePressed(MouseEvent me) {if (!isRunning) {return; // 如果未运行,说明图片未分割,直接返回}int x = me.getX() / sx;//判断鼠标点击的图片在map中的编号int y = me.getY() / sy;int fx = (int) point.getX();//记录第九块图片(未显示图片)的位置int fy = (int) point.getY();int canMove = Math.abs(fx - x) + Math.abs(fy - y); // 如鼠标点击位置与第九块图片(可移动的位置)相邻,则canMove 必为 1if (canMove != 1 ){return; // canMove 不为1,不能移动图片}map[fx][fy] = map[x][y]; //点击图片坐标赋给第九块图片map[x][y] = 8; //第九块图片给掉点击图片point.setLocation(x, y); //point 坐标改变drawScreen(); //重绘屏幕,实现图片移动showStep.setText("移动步骤:" + ++steps); //步骤加一 }});//为Start按钮添加事件start.addActionListener(new ActionListener() {@SuppressWarnings("deprecation")public void actionPerformed(ActionEvent ae) {initMap();drawScreen();isRunning = true;steps = 0;showStep.setText("移动步骤:" + steps);show.setLabel("显示正确图片");}});//为show按钮添加事件show.addActionListener(new ActionListener() {@SuppressWarnings("deprecation")public void actionPerformed(ActionEvent ae) {if (show.getLabel().equals("继续游戏")) {drawScreen();isRunning = true;show.setLabel("显示正确图片");} else {gs.drawImage(image, 0, 0, canvas);isRunning = false;show.setLabel("继续游戏");}}});}//容器内游戏运行时图片的显示方法void initMap() {long time = System.nanoTime();//得到系统当前时间作为随机数种子 java.util.Random rnd = new java.util.Random(time);int temp, x1, y1, x2, y2;//随机交换图片for (int i = 0; i < 100; i++) {x1 = rnd.nextInt(3);x2 = rnd.nextInt(3);y1 = rnd.nextInt(3);y2 = rnd.nextInt(3);temp = map[x1][y1];map[x1][y1] = map[x2][y2];map[x2][y2] = temp;}outer: //标记8号图片(即空白图片)for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){if (map[i][j] == 8) {point.setLocation(i, j);break outer;//跳转到带有空白标号的行}}}}//把整个canvas上的所有对象都绘制一遍void drawScreen() {int sx1, sy1, sx2, sy2, dx1, dy1, dx2, dy2;int t1, t2;gb.setColor(Color.white);gb.clearRect(0, 0, sx * 3, sy * 3);//清空整个缓冲区图片for (int x = 0; x < 3; x++){//图片在横行的显示for (int y = 0; y < 3; y++){//图片在列上的显示if(map[x][y] != 8) {// 目的地址dx1 = x * sx; dy1 = y * sy; // 移动的左上角坐标dx2 = dx1 + sx - 1; dy2 = dy1 + sy - 1; // 移动的右下角坐标// 源地址t1 = map[x][y] % 3 ; t2 = map[x][y] / 3 ;sx1 = t1 * sx; sy1 = t2 * sy; // 移动的左上角图标sx2 = sx1 + sx - 1; sy2 = sy1 + sy - 1; // 移动的右下角坐标gb.drawImage(image, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, Color.white, canvas);//绘制缓冲区图片}}}gs.drawImage(buff, 0, 0, canvas);//将缓冲区图片绘制到 canvas 上}//主方法,实现Jpgsaw类的使用,运行游戏public static void main(String[] args) {Jpgsaw pintu = new Jpgsaw("JpgsawGame");new Thread().start();//新建一个ThreadStart对象并传入一个方法给线程调用pintu.setVisible(true);//最后调用,避免组件不显示,利用线程设置组件可见}}/*播放背景音乐*/public class PlayMe {public static void playMe() {try {String file = "/JpgSaw/JpgsawGame/src/test.mp3"; //音乐文件路径FileInputStream fis = new FileInputStream(file); //路径设置BufferedInputStream bis = new BufferedInputStream(fis);//带有缓冲区的输入流new Player(bis).play(); //jar包中定义好的‘播放’方法}catch (Exception e){System.out.print("ERROR " + e);}}}6.上机调试及问题分析1、图片的存放位置出现错误,图片引用路径报错。
Java线程控制的图像分割与合成
JAVA园地J ava线程控制的图像分割与合成山东东营石油大学计算机系(257062) 索红光 石乐义 丁淑妍 高振东摘 要:使用Java对WEB静态图像进行分割重组,然后根据用户的交互操作合成显示,并利用线程对程序的并发性加以控制,从而达到图像显示的动态性和交互性效果。
关键词:Java语言 类Class 线程Thread Java是一种面向对象的编程语言。
它具有与平台无关、面向对象、动态、安全等特点,允许直接使用多线程方式进行编程,对程序进行并发控制。
Java还支持分布式网络操作,从而能够方便地进行网络文件对象的存取。
利用Java语言本身提供的绘图功能,可以绘制一些简单的图形。
而对于复杂图形,一般先用绘图软件制成图像,然后采用Java所提供的方法对图像下载并进行处理和控制,从而实现静态图像的动态显示。
1 Java图像处理与线程的并发控制111 Java图像处理Java语言提供了丰富的类(Class)、接口(Interface)以及相应的调用方法(Method)。
使用这些类或接口,可以定义自己的类或子类,充分利用Java面向对象的特性进行编程。
在java.awt包中,提供了专门的Image类,它是1种抽象类,可提供抽象的方法描绘图片的一些共同特性。
而在Applet类和Tookit类中都提供了2种get Image ()方法下载图像,分别根据绝对地址和相对地址查询所要下载的图像。
通常采用相对地址的下载方法,它的语法定义及功能如下:11public Image get Image(URL url,String name)功能:根据相对地址下载图像。
参数:url———URL(统一资源定位)基地址,name———图像文件名。
获取图像后就可以调用Graphics类提供的drawIm2 age()方法显示图像。
21public drawImage(Image img,int x,int y,observer)功能:在指定位置显示图像。
java实现图片分割指定大小
java实现图⽚分割指定⼤⼩本⽂实例为⼤家分享了java实现图⽚分割指定⼤⼩的具体代码,供⼤家参考,具体内容如下1.使⽤⼯具:ThumbnailsThumbnails 是由⾕歌提供的图⽚处理包,⽬前版本0.4.8。
可以简洁的实现图⽚的缩放、压缩、旋转、⽔印、格式转换等操作。
2.引⼊maven<dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.8</version></dependency>//最新版本可⾃查3.⼯具类import org.springframework.web.multipart.MultipartFile;import net.coobird.thumbnailator.Thumbnails;import javax.imageio.ImageIO;import java.awt.image.BufferedImage;import java.io.ByteArrayOutputStream;import java.io.IOException;/*** @Auther: lch* @Date: 2019/3/11 09:58* @Description: 图⽚⼯具类*/public class ImgUtils {public static byte[] uploadImg(Integer height,Integer width,MultipartFile file) throws Exception{String fileSuffix=file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1);BufferedImage bufferedImageBig = Thumbnails.of(file.getInputStream()).forceSize(height, width).asBufferedImage();//⼤图字节转换ByteArrayOutputStream outBig = new ByteArrayOutputStream();try {ImageIO.write(bufferedImageBig, fileSuffix, outBig);} catch (IOException e) {e.printStackTrace();}return outBig.toByteArray();}}4.切割图⽚返回字节数组/*** 接收⽂件*** @param model* @return* @throws IOException* @throws IllegalStateException*/@RequestMapping(value = "imageupload")public void imageUpload(MultipartFile file) throws IllegalStateException, IOException {//⽂件名称String realFileName = file.getOriginalFilename();//⽂件后缀String suffix = realFileName.substring(stIndexOf(".") + 1);/***************⽂件处理*********************/try {//⼤图图⽚切割 --宽⾼ 720 - 720byte[] bytesBig = ImgUtils.uploadImg(720, 720, file);//中图图⽚切割 --宽⾼ 200 - 200byte[] bytesMiddle = ImgUtils.uploadImg(200, 200, file);//⼩图图⽚切割 --宽⾼ 50- 50byte[] bytesSmall = ImgUtils.uploadImg(50, 50, file);/************以上三种byte数组,即为切割后的⽂件******************/} catch (Exception e) {System.out.println("错误");}}⼩编再为⼤家补充⼀段相关代码:java图⽚切割圆形@Testpublic void test() {try {// 读取图⽚BufferedImage bi1 = ImageIO.read(new File("g:/free-sheet-share.jpg"));BufferedImage bi2 = new BufferedImage(bi1.getWidth(), bi1.getHeight(),BufferedImage.TYPE_INT_RGB);Ellipse2D.Double shape = new Ellipse2D.Double(0, 0, bi1.getWidth(), bi1.getHeight());Graphics2D g2 = bi2.createGraphics();g2.setBackground(Color.WHITE);g2.fill(new Rectangle(bi2.getWidth(), bi2.getHeight()));g2.setClip(shape);//设置抗锯齿g2.drawImage(bi1, 0, 0, null);g2.dispose();ImageIO.write(bi2, "jpg", new File("e:/2.jpg"));} catch (IOException e) {e.printStackTrace();}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
基于JAVA的拼图游戏毕业设计
基于JAVA的拼图游戏基于JAVA的拼图游戏摘要JAVA语言是由美国sun公司开发的一种完全面向对象的程序设计语言,它由c++语言发展而来,但比c++语言简单。
JAVA语言具有简单、与平台无关、高效、健壮、安全、多线程等特点,是当前网络编程中的首选语言。
本文主要通过JAVA语言来开发一个小游戏,以实现其相关功能。
随着社会的发展,计算机已经成为人么日常生活,学习办公中不可缺少的一部分,并在各个领域发挥着重要的作用。
在计算机迅猛发展的影响下,计算机游戏也随之兴盛起来。
拼图游戏就是其中一中,它适用范围广,老少皆宜。
该游戏不仅可锻炼动手能力,观察能力,而且还能培养人与人之间的协作能力。
它是一个应用程序,它的游戏规则和win7的拼图游戏是一样的。
将一张图片分割成16张小图,将除去左上角的其余15张图片放入一个4*4的网格内,通过鼠标的点击图片来切换空白处对换位置,让其复原成原来的顺序,游戏就完成了。
可以选择下一张来切换另一张图片,或者按开局重新开始游戏。
关键词:JAVA 2平台标准版,JAVA语言,小应用程序Jigsaw puzzle based on JavaabstractJA V A language is developed by the sun a fully object-oriented programming language, it is developed by c + + language, but simpler than c + + language.The JA V A language has a simple, platform-independent, efficient, robust and security, multithreading, is the preferred language in the current network programming.This paper mainly through the JA V A language to develop a small game, in order to realize its related functions.With the development of the society, the computer has become the people daily life, an indispensable part of learning in the office, and play an important role in all fields.Under the influence of the rapid development of computer, computer games has been thriving.Jigsaw puzzle is among them one, its applicability is wide and for young and old.The game is not only can exercise ability, observation ability, but also can cultivate interpersonal cooperation ability.This puzzle game is based on the J2SE platform development, it is an application, it is the rules of the game and win7 puzzle game is the same.Picture will be divided into 16 images, will remove the upper left corner of the rest of the 15 images in a 4 * 4 mesh, the blank space with the mouse click on the image to switch switch position, make its recovery as the original sequence, the game is finished.Can choose the next to switch the other picture, or press start to start the game.Keywords: Java 2 Platform, Standard Edition, JAVA language, application.目录摘要 (Ⅰ)ABSTRACT (Ⅱ)第一章概述 (1)1.1项目开发的背景与国内外研究现状 (1)1.2项目开发的目的与意义 (1)1.3系统开发方法介绍 (2)第二章项目开发语言及开发环境 (5)2.1JAVA语言 (5)2.2ECLIPSE简介 (6)第三章可行性分析及总体设计原则 (8)3.1可行性分析所采用的方法和步骤 (8)3.2评价尺度 (8)3.3可行性分析 (8)3.3.1 技术可行性 (8)3.3.2 经济可行性 (8)3.3.3 社会可行性 (8)3.4总体设计原则 (9)第四章需求分析 (10)4.1OOA方法介绍 (10)4.2功能需求 (10)4.3环境需求 (10)4.4可靠性需求 (11)4.5用户界面需求 (11)4.6软件成本消耗与开发进度需求 (11)4.7条件假定和限制 (11)第五章系统分析 (12)5.1业务流程分析 (12)5.2总体设计方案 (12)5.3游戏功能分析 (13)第六章系统设计 (14)6.1系统功能设计 (14)6.2系统重点设计 (14)6.2.1 开局载入图片 (15)6.2.4 随机排列图片 (16)6.2.3 游戏时排列图片 (18)6.2.4 换下一张图片 (18)6.2.5 判断拼图是否成功 (19)6.3拼图游戏界面的设计与实现 (20)第七章设计小结 (21)参考文献 (24)致谢 (25)附录 (26)太原科技大学华科学院毕业设计(论文)第一章概述1.1项目开发的背景与国内外研究现状随着信息技术的飞速发展、蓬勃进步,同时随着国际互连网与相关系统的迅速普及,不同国家、行业被Internet连接在一起,互相通信,共享全世界的计算机资源和信息。
java实现简单的拼图游戏
java实现简单的拼图游戏⽤Java来实现简单的拼图游戏,供⼤家参考,具体内容如下⾸先我们看⼀下这个拼图⼩游戏的效果图:创建⼀个名称为MedleyGame的类,该类继承了JFrame类;然后在该类中分别声明⼀个⾯板对象和⼀个按钮对象,⾯板对象⽤来添加拼图按钮,按钮对象为当前显⽰空⽩图⽚的按钮;最后为该类编写⼀个main()⽅法和⼀个构造⽅法MedleyGame(),并在构造⽅法中设置窗体的相关属性,如窗体的标题、显⽰位置、⼤⼩等。
java项⽬结构如下:具体java代码如下:package pac;import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.border.TitledBorder;public class MedleyGame extends JFrame{private JPanel centerPanel;// 拼图按钮⾯板private JButton emptyButton;// 空⽩按钮对象public static void main(String[] args) {try {MedleyGame frame = new MedleyGame();//创建本类的对象frame.setVisible(true);//设置窗体为可见}catch(Exception e) {e.printStackTrace();}}public MedleyGame() {super();// 继承JFrame类的构造⽅法setResizable(false);// 设置窗体⼤⼩不可改变setTitle("拼图游戏");// 设置窗体的标题setBounds(100, 100, 354, 435);// 设置窗体的显⽰位置及⼤⼩setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置关闭窗体时退出程序final JPanel topPanel = new JPanel();// 创建⾯板对象topPanel.setBorder(new TitledBorder(null, "", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null));// 为⾯板添加边框topPanel.setLayout(new BorderLayout());// 设置⾯板采⽤边界布局getContentPane().add(topPanel,BorderLayout.NORTH);// 将⾯板添加到窗体顶部final JLabel modelLabel = new JLabel();// 创建显⽰参考图⽚的标签对象modelLabel.setIcon(new ImageIcon("img/model.jpg"));// 设置标签显⽰的参考图⽚topPanel.add(modelLabel, BorderLayout.WEST);// 将标签添加到⾯板的左侧final JButton startButton = new JButton();// 创建“下⼀局”按钮对象startButton.setText("下⼀局");// 设置按钮的标签⽂本startButton.addActionListener(new StartButtonAction());// 为按钮添加监听器topPanel.add(startButton, BorderLayout.CENTER);// 将按钮添加到⾯板的中间centerPanel = new JPanel();// 创建拼图按钮⾯板对象centerPanel.setBorder(new TitledBorder(null, "",TitledBorder.DEFAULT_JUSTIFICATION,TitledBorder.DEFAULT_POSITION, null, null));// 为⾯板添加边框centerPanel.setLayout(new GridLayout(0, 3));// 设置拼图按钮⾯板采⽤3列的⽹格布局 getContentPane().add(centerPanel, BorderLayout.CENTER);// 将⾯板添加到窗体的中间 String[][] stochasticOrder = reorder();// 获得⽹格图⽚的随机摆放顺序for (int row = 0; row < 3; row++) {// 遍例⾏for (int col = 0; col < 3; col++) {// 遍例列final JButton button = new JButton();// 创建拼图按钮对象button.setName(row + "" + col);// 设置按钮的名称button.setIcon(new ImageIcon(stochasticOrder[row][col])); // 为拼图按钮设置图⽚if (stochasticOrder[row][col].equals("img/22.jpg")) // 判断是否为空⽩按钮emptyButton = button;button.addActionListener(new ImgButtonAction()); // 为拼图按钮添加监听器centerPanel.add(button);// 将按钮添加到拼图按钮⾯板中}}//}private String[][] reorder(){// ⽤来获取⽹格图⽚的随机摆放顺序String[][] exactnessOrder = new String[3][3];// ⽹格图⽚的正确摆放顺序for (int row = 0; row < 3; row++) {// 遍例⾏for (int col = 0; col < 3; col++) {// 遍例列exactnessOrder[row][col] = "img/" + row + col + ".jpg";}}String[][] stochasticOrder = new String[3][3];// ⽹格图⽚的随机摆放顺序for (int row = 0; row < 3; row++) {// 遍例⾏for (int col = 0; col < 3; col++) {// 遍例列while (stochasticOrder[row][col] == null) { // 随机摆放顺序的指定⽹格为空int r = (int) (Math.random() * 3);// 取随机⾏int c = (int) (Math.random() * 3);// 取随机列if (exactnessOrder[r][c] != null) { // 正确摆放顺序的指定⽹格不为空// 将位于正确摆放顺序的指定⽹格的图⽚摆放到位于随机摆放顺序的指定⽹格中stochasticOrder[row][col] = exactnessOrder[r][c];// 将位于正确顺序的指定⽹格设置为空exactnessOrder[r][c] = null;}}}}return stochasticOrder;}class ImgButtonAction implements ActionListener {// 拼图按钮监听器public void actionPerformed(ActionEvent e) {String emptyName = emptyButton.getName();// 获得空⽩按钮的名称char emptyRow = emptyName.charAt(0);// 获得空⽩按钮所在的⾏char emptyCol = emptyName.charAt(1);// 获得空⽩按钮所在的列JButton clickButton = (JButton) e.getSource();// 获得被点击按钮对象String clickName = clickButton.getName();// 获得被点击按钮的名称char clickRow = clickName.charAt(0);// 获得被点击按钮所在的⾏char clickCol = clickName.charAt(1);// 获得被点击按钮所在的列// 判断被点击按钮与空⽩按钮是否相临if (Math.abs(clickRow - emptyRow) + Math.abs(clickCol - emptyCol) == 1) {// 将被点击按钮的图⽚移动到空⽩按钮上emptyButton.setIcon(clickButton.getIcon());// 设置被点击的按钮显⽰空⽩图⽚clickButton.setIcon(new ImageIcon("img/22.jpg"));emptyButton = clickButton;// 将被点击的按钮设置为空⽩按钮}}}class StartButtonAction implements ActionListener {// 下⼀局按钮监听器public void actionPerformed(ActionEvent e) {String[][] stochasticOrder = reorder();// 获得⽹格图⽚的随机摆放顺序int i = 0;// 拼图按钮在拼图按钮⾯板中的索引for (int row = 0; row < 3; row++) {// 遍例⾏for (int col = 0; col < 3; col++) {// 遍例列JButton button = (JButton) centerPanel.getComponent(i++); // 获得位于指定索引的拼图按钮 button.setIcon(new ImageIcon(stochasticOrder[row][col])); // 为拼图按钮设置图⽚if (stochasticOrder[row][col].equals("img/22.jpg")) // 判断是否为空⽩按钮emptyButton = button;}}}}}到这⾥代码程序就写完了,我们来运⾏⼀下:按步骤保存然后运⾏⼀下:结果没问题,单击“下⼀局”会重新刷新游戏,图⽚会进⾏随机排布:到此,⼀个简简单单的拼图⼩游戏就实现了。
基于Java的拼图游戏实现
Electronic Technology & Software Engineering 电子技术与软件工程• 237Program Design •程序设计【关键词】拼图游戏 Java 程序 Java 开发1 引言目前,影响学生注意力的各种外界因素很多,采用传统的单纯讲授知识点的授课模式进行教学,这一方式已无法满足当下课堂需求,这种方式下知识点的讲解以及授课采用的案例之间相互孤立,无联系,致使学生在学习时感觉知识点零碎、杂乱,从而无法吸引学生的兴趣,同时现实中的工作流程通常都是相互联系的,项目开发同样也相互联系,采用零碎,孤立的方式既无法吸引学生,也不符合现实中的工作流程。
为了能够提升学生兴趣,对接现实工作过程,在实施Java 课程授课时,采用项目化教学,以一个或几个项目为依据,通过讲解引导学生独立完成具体项目,这样课堂之间相互联系,同时以项目为中心讲解知识点,可以使学生感受到学有所用,使学生在实践过程中提升理论知识水平,还能够更好的培养学生运用知识解决问题的能力。
拼图游戏是一款简单有趣的小游戏,课堂上学习Java 语言时选择拼图游戏为导入,既能够吸引学生,提升学生兴趣,又能够充分将Java 知识点融合与游戏,在进行Java 课堂教学时需要通过以简单有趣的游戏项目贯穿课堂,教师讲解引导,学生作为主体完善提升,教师在教学实施时将游戏项目分解,学生在完成项目模块的同时掌握Java 知识点,通过按照任务要求,分步骤分模块实施,使学生可以在参与项目实施的过程,感受近于真实的开发环境,以此来激发学生的学习兴趣,最终实现学生分析问题、解决问题的能力的提升。
本文主要介绍课堂实施之简单拼图游戏的项目实现,以简单项目为媒介,在教学过程基于Java 的拼图游戏实现文/秦鹏珍中逐步带领学生掌握Java 编程基础语法知识,使学生建立Java 编程思想,在关注学生知识增长的同时,也关注学生相关能力目标的达成。
2 游戏设计要实现简单拼图游戏主要要完成以下三部分设计,包括游戏界面设计,游戏规则设计,游戏按钮功能实现设计,因此课堂实施时也主要按照三大模块实施,通过游戏界面的设计与完成要使学生掌握Java 中类的定义,树立面向对象思想,通过游戏规则设计,游戏按钮功能实现设计可以使学生掌握Java 基础语法知识,包括变量命名规则,数据类型,流程控制语句等,同时要掌握接口的定义、继承和实现,事件的处理机制。
Java小项目之拼图游戏
Java⼩项⽬之拼图游戏⾸先声明,代码是⾃创的,如有雷同,不胜荣幸!先谈谈思路: 1.设计界⾯。
2.素材的处理。
3.设计图⽚加载区域的图⽚加载处理类。
4.设计按钮组中的按钮初始化⽅法。
5.设计按钮组中的随机图⽚加载⽅法。
6.设计重置按钮⽅法。
7.设计按钮监听器。
8.设计判定胜利的条件的⽅法。
1.界⾯的设计: a.使⽤了Windows Builder插件,安装⽹页:WindoswBuilder - /windowbuilder/WB/integration/4.6/ b.页⾯的整体整体样式: ⼀个JFram中添加三个带标题的JPanel,将整个分割为游戏选项区域,图⽚展⽰区域和游戏区域。
每个区域都有各⾃的控件,其中需要注意的是图⽚展⽰区域放置了⼀个JLable来加载展⽰图⽚。
c.代码:我将源码放在了com.rookie.view包下,并且类名为GameView。
1package com.rookie.view;23import java.awt.EventQueue;45import javax.swing.JFrame;6import javax.swing.JPanel;7import javax.swing.border.EmptyBorder;8import javax.swing.JMenuBar;9import javax.swing.JMenu;10import javax.swing.JMenuItem;11import javax.swing.JOptionPane;121314import java.awt.event.ActionListener;15import java.util.Timer;16import java.util.TimerTask;17import java.awt.event.ActionEvent;18import javax.swing.GroupLayout;19import javax.swing.GroupLayout.Alignment;20import javax.swing.border.TitledBorder;2122import com.rookie.dao.PicloadDao;23import com.rookie.dao.GameDao;2425import javax.swing.UIManager;26import java.awt.Color;27import ponentPlacement;28import javax.swing.JLabel;29import javax.swing.JRadioButton;30import javax.swing.ButtonGroup;31import javax.swing.JComboBox;32import javax.swing.DefaultComboBoxModel;33import javax.swing.JTextField;34import javax.swing.JButton;35import javax.swing.SwingConstants;3637public class GamerView extends JFrame {3839/**40 *41*/42private static final long serialVersionUID = 1L;43private JPanel mainPanel;44private final ButtonGroup buttonGroup = new ButtonGroup();45private static JTextField textField_time;46private static JButton bt_GameBegin = null;47private static JLabel jl_loadImage = null;48private static JComboBox comboBox_SelectPic = null;49private static JRadioButton rb_simple = null;50private static JRadioButton rb_difficulty = null;51private static JPanel panel_beginGame = null;52private static GameDao gameChoseDao;53private static int time = 0;54private static Timer timer;55/**56 * Launch the application.57*/58public static void main(String[] args) {59 EventQueue.invokeLater(new Runnable() {60public void run() {61try {62 GamerView frame = new GamerView();63 frame.setVisible(true);64 } catch (Exception e) {65 e.printStackTrace();66 }67 }68 });69 }7071/**72 * Create the frame.73*/74public GamerView() {75 setResizable(false);76 setTitle("\u62FC\u56FE\u6E38\u620F(\u6D4B\u8BD5\u7248)");77 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);78 setBounds(100, 100, 710, 550);7980 JMenuBar menuBar = new JMenuBar();81 setJMenuBar(menuBar);8283 JMenu m_About = new JMenu("\u5173\u4E8E");84 menuBar.add(m_About);8586 JMenuItem mI_aboutMe = new JMenuItem("\u56E2\u961F\u4ECB\u7ECD");87 mI_aboutMe.addActionListener(new ActionListener() {88public void actionPerformed(ActionEvent e) {89 showAboutActionListener(e);90 }91 });92 m_About.add(mI_aboutMe);93 mainPanel = new JPanel();94 mainPanel.setBorder(new EmptyBorder(5, 5, 5, 5));95 setContentPane(mainPanel);9697 JPanel panel_checkGame = new JPanel();98 panel_checkGame.setBorder(new TitledBorder(null, "\u6E38\u620F\u9009\u9879\uFF1A", TitledBorder.CENTER, TitledBorder.TOP, null, Color.RED));99100 JPanel panel_loadPic = new JPanel();101 panel_loadPic.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "\u539F\u56FE\u52A0\u8F7D\uFF1A", TitledBorder.CENTER, TitledBorder.TOP, null, Color.RED)); 102 panel_loadPic.setToolTipText("");103104 panel_beginGame = new JPanel();105 panel_beginGame.setBorder(new TitledBorder(null, "\u6E38\u620F\u5F00\u59CB\uFF1A", TitledBorder.CENTER, TitledBorder.TOP, null, Color.RED));106 GroupLayout gl_mainPanel = new GroupLayout(mainPanel);107 gl_mainPanel.setHorizontalGroup(108 gl_mainPanel.createParallelGroup(Alignment.TRAILING)109 .addGroup(gl_mainPanel.createSequentialGroup()110 .addContainerGap()111 .addGroup(gl_mainPanel.createParallelGroup(Alignment.TRAILING)112 .addComponent(panel_checkGame, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 674, Short.MAX_VALUE)113 .addGroup(Alignment.LEADING, gl_mainPanel.createSequentialGroup()114 .addComponent(panel_loadPic, GroupLayout.PREFERRED_SIZE, 336, GroupLayout.PREFERRED_SIZE)115 .addPreferredGap(ComponentPlacement.UNRELATED)116 .addComponent(panel_beginGame, GroupLayout.PREFERRED_SIZE, 332, GroupLayout.PREFERRED_SIZE)))117 .addContainerGap())118 );119 gl_mainPanel.setVerticalGroup(120 gl_mainPanel.createParallelGroup(Alignment.LEADING)121 .addGroup(gl_mainPanel.createSequentialGroup()122 .addContainerGap()123 .addComponent(panel_checkGame, GroupLayout.PREFERRED_SIZE, 83, GroupLayout.PREFERRED_SIZE)124 .addPreferredGap(ComponentPlacement.UNRELATED)125 .addGroup(gl_mainPanel.createParallelGroup(Alignment.BASELINE)126 .addComponent(panel_loadPic, GroupLayout.DEFAULT_SIZE, 377, Short.MAX_VALUE)127 .addComponent(panel_beginGame, GroupLayout.DEFAULT_SIZE, 377, Short.MAX_VALUE))128 .addContainerGap())129 );130131 jl_loadImage = new JLabel("");132 jl_loadImage.setIcon(null);133 panel_loadPic.add(jl_loadImage);134135136137 GroupLayout gl_panel_beginGame = new GroupLayout(panel_beginGame);138 gl_panel_beginGame.setHorizontalGroup(139 gl_panel_beginGame.createParallelGroup(Alignment.LEADING)140 .addGap(0, 320, Short.MAX_VALUE)141 );142 gl_panel_beginGame.setVerticalGroup(143 gl_panel_beginGame.createParallelGroup(Alignment.LEADING)144 .addGap(0, 322, Short.MAX_VALUE)145 );146 panel_beginGame.setLayout(gl_panel_beginGame);147148 JLabel label = new JLabel("\u6E38\u620F\u96BE\u5EA6\uFF1A");149 label.setForeground(Color.BLUE);150151 rb_simple = new JRadioButton("\u7B80\u5355");152 buttonGroup.add(rb_simple);153154 rb_difficulty = new JRadioButton("\u56F0\u96BE");155 buttonGroup.add(rb_difficulty);156157 rb_simple.setSelected(true);158159 JLabel label_1 = new JLabel("\u56FE\u7247\u9009\u62E9\uFF1A");160 label_1.setForeground(Color.BLUE);161162 comboBox_SelectPic = new JComboBox();163 comboBox_SelectPic.setModel(new DefaultComboBoxModel(new String[] {"\u98CE\u666F", "\u7F8E\u5973", "\u8C6A\u8F66", "\u6E38\u620F"}));164 comboBox_SelectPic.setMaximumRowCount(5);165166 JLabel label_2 = new JLabel("\u6E38\u620F\u65F6\u95F4\uFF1A");167 label_2.setForeground(Color.BLUE);168169 textField_time = new JTextField();170 textField_time.setHorizontalAlignment(SwingConstants.RIGHT);171 textField_time.setText("0");172 textField_time.setEditable(false);173 textField_time.setColumns(10);174175 JLabel lblNewLabel = new JLabel("\u79D2");176 lblNewLabel.setForeground(Color.BLUE);177178 bt_GameBegin = new JButton("\u5F00\u59CB\u6E38\u620F");179 bt_GameBegin.addActionListener(new ActionListener() {180public void actionPerformed(ActionEvent eve) {181 buttonClickAction(eve);182 }183 });184 GroupLayout gl_panel_checkGame = new GroupLayout(panel_checkGame);185 gl_panel_checkGame.setHorizontalGroup(186 gl_panel_checkGame.createParallelGroup(Alignment.LEADING)187 .addGroup(gl_panel_checkGame.createSequentialGroup()188 .addContainerGap()189 .addComponent(label)190 .addGap(6)191 .addGroup(gl_panel_checkGame.createParallelGroup(Alignment.TRAILING)192 .addComponent(rb_difficulty)193 .addGroup(gl_panel_checkGame.createSequentialGroup()194 .addComponent(rb_simple)195 .addPreferredGap(ComponentPlacement.RELATED)))196 .addGap(18)197 .addComponent(label_1)198 .addPreferredGap(ComponentPlacement.UNRELATED)199 .addComponent(comboBox_SelectPic, GroupLayout.PREFERRED_SIZE, 69, GroupLayout.PREFERRED_SIZE)200 .addGap(32)201 .addComponent(label_2)202 .addPreferredGap(ComponentPlacement.UNRELATED)203 .addComponent(textField_time, GroupLayout.PREFERRED_SIZE, 41, GroupLayout.PREFERRED_SIZE)204 .addPreferredGap(ComponentPlacement.RELATED)205 .addComponent(lblNewLabel)206 .addGap(52)207 .addComponent(bt_GameBegin, GroupLayout.PREFERRED_SIZE, 93, GroupLayout.PREFERRED_SIZE)208 .addContainerGap(76, Short.MAX_VALUE))209 );210 gl_panel_checkGame.setVerticalGroup(211 gl_panel_checkGame.createParallelGroup(Alignment.LEADING)212 .addGroup(gl_panel_checkGame.createSequentialGroup()213 .addGroup(gl_panel_checkGame.createParallelGroup(Alignment.LEADING)214 .addGroup(gl_panel_checkGame.createSequentialGroup()215 .addComponent(rb_simple)216 .addPreferredGap(ComponentPlacement.RELATED, 7, Short.MAX_VALUE)217 .addComponent(rb_difficulty))218 .addGroup(gl_panel_checkGame.createSequentialGroup()219 .addContainerGap()220 .addGroup(gl_panel_checkGame.createParallelGroup(Alignment.BASELINE)221 .addComponent(label_1)222 .addComponent(comboBox_SelectPic, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) 223 .addComponent(textField_time, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)224 .addComponent(lblNewLabel)225 .addComponent(label_2)226 .addComponent(bt_GameBegin, GroupLayout.PREFERRED_SIZE, 38, GroupLayout.PREFERRED_SIZE)))227 .addGroup(gl_panel_checkGame.createSequentialGroup()228 .addGap(22)229 .addComponent(label)))230 .addContainerGap())231 );232 panel_checkGame.setLayout(gl_panel_checkGame);233 mainPanel.setLayout(gl_mainPanel);234 }235236private void showAboutActionListener(ActionEvent e) {237// TODO Auto-generated method stub238 JOptionPane.showMessageDialog(null, "QQ:523980553");239 }240241private void buttonClickAction(ActionEvent eve) {242// TODO Auto-generated method stub243//设置按钮标题244if( bt_GameBegin.getText().equals("开始游戏") ) {245 beginGame();246 timer = new Timer();247 timer.scheduleAtFixedRate(new MyTase(), 0, 900);248 }249else {250 resetGame();251252 }253254 }255256public static void beginGame() {257 bt_GameBegin.setText("重置游戏");258//获取ComBox选项259int picId = comboBox_SelectPic.getSelectedIndex();260//加载图⽚261 PicloadDao pic = new PicloadDao();262 pic.loadPic(picId, jl_loadImage);263//获取难易度264if(rb_simple.isSelected()) {265 gameChoseDao = new GameDao();266 gameChoseDao.initButton(panel_beginGame);267 gameChoseDao.randomLoadPic(picId);268269 }else if(rb_difficulty.isSelected()) {270271 }272 }273274public static void resetGame() {275 bt_GameBegin.setText("开始游戏");276 rb_simple.setSelected(true);277 comboBox_SelectPic.setSelectedIndex(0);278 textField_time.setText(""+0);279 jl_loadImage.setIcon(null);280 gameChoseDao.resetButton();281 time = 0;282 timer.cancel();283 }284285class MyTase extends TimerTask{286 @Override287public void run() {288// TODO Auto-generated method stub289 time ++;290 textField_time.setText("" + time);291if(time == 60) {292 JOptionPane.showMessageDialog(null, "挑战失败");293 resetGame();294 }295 }296 }297 }代码被分成了⼏部分:⼀部分是界⾯的初始化,这些都可以通过Windows builder来完成,但是从按下“开始游戏”的按钮后,之后的任务都需要⼿动写代码,例如事件的处理,开始游戏和重置游戏的⽅法书写,计时器的书写。
java拼图游戏代码(完整版)
Pintu.java(class)import java.awt.Color;import java.awt.FileDialog;import java.awt.Graphics;import java.awt.Image;import java.awt.Rectangle;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JRadioButtonMenuItem;public class Pintu extends JFrame implements ActionListener{JMenuBar menubar=new JMenuBar(); //菜单条JMenu menu1=new JMenu("操作"); //菜单JMenu menu2=new JMenu("设置");JMenu menu3=new JMenu("帮助");//菜单选项JMenuItem jitem1=new JMenuItem("开始游戏");JMenuItem jitem2=new JMenuItem("退出游戏");JMenuItem jitem3=new JMenuItem("游戏图片");JMenu jitem4=new JMenu("难度设置");JMenuItem jitem5=new JMenuItem("关于我们");JRadioButtonMenuItem nandu1=new JRadioButtonMenuItem("3*3");//单选菜单JRadioButtonMenuItem nandu2=new JRadioButtonMenuItem("4*4");String filename="a.jpg"; //默认图片路径ImageIcon preimage=null; //预览图对象JButton prebtn=null; //预览图片放置控件int m=3,n=3; //默认设置为3*3的阵列int w=80,h=80; //默认小方格的高度与宽度int step=0; //拼图步数JLabel lstep=new JLabel("步数:0步");JLabel isover=new JLabel("状态:未开始");ImageIcon[] pic=null; //存放小方格图片JButton btn[][]=null; //小方格控件Rectangle p[][]=null; //小方格的位置与大小public void init(){this.setTitle("拼图游戏");this.setLayout(null);this.setBounds(400,100,300,480);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);isover.setBounds(100,50,100,30);lstep.setBounds(100,10,100,30);this.add(isover);this.add(lstep);//菜单显示this.setJMenuBar(menubar);menubar.add(menu1);menubar.add(menu2);menubar.add(menu3);menu1.add(jitem1);menu1.add(jitem2);menu2.add(jitem3);menu2.add(jitem4);menu3.add(jitem5);jitem4.add(nandu1);jitem4.add(nandu2);nandu1.setSelected(true);//设置单选默认值为3*3jitem2.addActionListener(this); //注册监听事件jitem3.addActionListener(this); //注册监听事件nandu1.addActionListener(this); //注册监听事件nandu2.addActionListener(this); //注册监听事件jitem1.addActionListener(this); //注册监听事件jitem5.addActionListener(this); //注册监听事件this.setVisible(true);this.setResizable(false);//不能更改窗体大小setpic();//图片分割必须放置窗体显示以后}//判断我们的图片是否拼图完整如果完成返回true 未完成返回false public boolean check(){boolean b=true;for(int i=n;i<(m+1)*n;i++){int x1=i/n,y1=i%n;if(btn[x1][y1].getIcon()!=null&&btn[x1][y1].getIcon()==pic[i-n]){}else{b=false;}}return b;}//图片的放置public void setpic(){isover.setText("状态:未开始");step=0;lstep.setText("步数:"+step+"步");w=280/m;h=280/n;Image[] a=splitImage(filename,1,1,100,100); //缩放预览图preimage=new ImageIcon(a[0]); //图片转换image=》IMageIconif(prebtn==null) //*如果存在,就不需要重新分配控件只需要更新图标prebtn=new JButton(preimage);//把图片设置为JButton的图标elseprebtn.setIcon(preimage);prebtn.setBounds(200,5,100,100);this.add(prebtn);//图片分割pic=new ImageIcon[m*n];//分配空间大小if(btn==null) //*如果存在,就不需要重新分配控件只需要更新图标btn=new JButton[m+1][n]; //分配控件实例化p=new Rectangle[m+1][n]; //坐标Image[] t=splitImage(filename,m,n,w,h);//图片分割m*n个每个高度与宽度为w,hfor(int i=0;i<(m+1)*n;i++){int x1=i/n,y1=i%n;//下标转换if(btn[x1][y1]==null) //*如果存在,就不需要重新实例化控件btn[x1][y1]=new JButton();//实例化每个控件btn[x1][y1].setBounds(y1*w+5,x1*h+50,w,h);//控件坐标btn[x1][y1].addActionListener(this);//添加事件this.add(btn[x1][y1]);}for(int i=1;i<n;i++){btn[0][i].removeActionListener(this);//第一行除了第一个以外,其他都不注册事件btn[0][i].setVisible(false); //第一行除了第一个以外,其他都不显示}int temp[]=randarray(m*n);for(int i=0;i<m*n;i++) //把图片放到方格内{pic[i]=new ImageIcon(t[i]); //图片转换image=》ImageIcon }for(int i=0;i<m*n;i++) //把图片放到方格内{btn[(i+n)/n][(i+n)%n].setIcon(pic[temp[i]]);//设置图标}btn[0][0].setBackground(Color.BLUE); //设置背景btn[0][0].setIcon(null);this.repaint(); //图片及时刷新}//图片方格随机产生一组随机序列数组,不能重复public int[] randarray(int n){int re[]=new int[n];for(int i=0;i<n;i++)re[i]=i;for(int i=1;i<n;i++){int t;int a=(int)(Math.random()*(n-1)+1);//-1 +1是为了第一个数不使用随机数t=re[i];re[i]=re[a];re[a]=t;}return re;}@Overridepublic void actionPerformed(ActionEvent e) {if(e.getSource()==jitem5)//关于{JOptionPane.showMessageDialog(this,"四川师范大学成都学院开发实验室\n2010年12月12日");return;}if(e.getSource()==nandu1)//难度选择{nandu1.setSelected(true);//更改单选菜单nandu2.setSelected(false);for(int i=0;i<(m+1)*n;i++){int x1=i/n,y1=i%n;//下标转换this.remove(btn[x1][y1]);//清除所有button控件}m=n=3;//重新设置难度btn=null;//释放btn对象setpic();return;}if(e.getSource()==nandu2){nandu2.setSelected(true);nandu1.setSelected(false);for(int i=0;i<(m+1)*n;i++){int x1=i/n,y1=i%n;//下标转换this.remove(btn[x1][y1]);//实例化每个控件}m=n=4;btn=null;setpic();return;}if(e.getSource()==jitem1)//重新开始{for(int j=0;j<(m+1)*n;j++){int x2=j/n,y2=j%n;//下标转换btn[x2][y2].removeActionListener(this);//实例化每个控件}setpic();return;}if(e.getSource()==jitem2){System.exit(0);}if(e.getSource()==jitem3){FileDialog df=new FileDialog(this,"图片选择",FileDialog.LOAD);df.setVisible(true);if(df.getFile()==null)return;filename=df.getDirectory()+df.getFile();//文件路径+文件名for(int j=0;j<(m+1)*n;j++){int x2=j/n,y2=j%n;//下标转换btn[x2][y2].removeActionListener(this);//实例化每个控件}setpic();return;}for(int i=0;i<(m+1)*n;i++)//循环所有控件{int x1=i/n,y1=i%n;//下标转换if(e.getSource()==btn[x1][y1])//如果点击了小方格{step++;lstep.setText("步数:"+step+"步");isover.setText("状态:已开始");//向上移动if(x1>0&&btn[x1-1][y1].isVisible()&&btn[x1-1][y1].getIcon()==null){btn[x1-1][y1].setIcon(btn[x1][y1].getIcon());//获取当前图标给上一个控件为图标btn[x1][y1].setIcon(null);//当前图标设置为空}//向下移动if(x1<m&&btn[x1+1][y1].isVisible()&&btn[x1+1][y1].getIcon()==null){btn[x1+1][y1].setIcon(btn[x1][y1].getIcon());//获取当前图标给下一个控件为图标btn[x1][y1].setIcon(null);//当前图标设置为空}//向左移动if(y1>0&&btn[x1][y1-1].isVisible()&&btn[x1][y1-1].getIcon()==null){btn[x1][y1-1].setIcon(btn[x1][y1].getIcon());//获取当前图标给左一个控件为图标btn[x1][y1].setIcon(null);//当前图标设置为空}//向右移动if(y1<n-1&&btn[x1][y1+1].isVisible()&&btn[x1][y1+1].getIcon()==null){btn[x1][y1+1].setIcon(btn[x1][y1].getIcon());//获取当前图标给右一个控件为图标btn[x1][y1].setIcon(null);//当前图标设置为空}btn[x1][y1].setBackground(Color.BLUE);if(check()){isover.setText("状态:已完成");for(int j=0;j<(m+1)*n;j++){int x2=j/n,y2=j%n;//下标转换btn[x2][y2].removeActionListener(this);//完成以后清除所有的监听}}}}}// 图片分割方法public Image[] splitImage(String file, int rows, int cols) {Image t = new ImageIcon(file).getImage();int w = t.getWidth(this) / cols;int h = t.getHeight(this) / rows;return splitImage(t, rows, cols, w, h);}public Image[] splitImage(String file, int rows, int cols, int w, int h) {Image t = new ImageIcon(file).getImage();return splitImage(t, rows, cols, w, h);}public Image[] splitImage(Image t, int rows, int cols, int w, int h) {Image[] result = new Image[rows * cols];try {for (int i = 0; i < result.length; i++) {result[i] = createImage(w, h);Graphics g = result[i].getGraphics();g.translate((-i % cols) * w, (-i / cols) * h);g.drawImage(t, 0, 0, w * cols, rows * h, 0, 0,t.getWidth(this), t.getHeight(this), this);}} catch (Exception e) {}return result;}}Play.java(class)public class Play {/*** @param args*/public static void main(String[] args) {Pintu p= new Pintu();p.init();}}。
【图片分割器】Java完成图片分隔
【图⽚分割器】Java完成图⽚分隔刷朋友圈,看到很多⼈发分隔后的9宫格,出现⼀个⼤图挺好看,所以⾃⼰⽤java写了⼀个图⽚分隔器。
可以⾃定义分隔数。
import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;/*** @Description 图⽚分隔-发微信朋友圈* @Author cheng2839* @Date 2018年10⽉04⽇* @Version v1.0*/public class MyTest028 {private static final String IMAGE_FILE_PATH = "E:\\timg.jpg";//横向分隔个数private static final int SEP_X_NUM =3;//纵向分隔个数private static final int SEP_Y_NUM =3;public static void main(String[] args) {try {sepImage();} catch (IOException e) {e.printStackTrace();}}public static void sepImage() throws IOException {File file= new File(IMAGE_FILE_PATH);if (!file.exists() || !file.isFile()) {throw new RuntimeException("file not exists or un-file:" + IMAGE_FILE_PATH);}BufferedImage image= ImageIO.read(file);int totalWidth =image.getWidth();int totalHeight =image.getHeight();int width = totalWidth / (SEP_X_NUM <=0?1:SEP_X_NUM);int height = totalHeight / (SEP_Y_NUM <=0?1:SEP_Y_NUM);File dirFile = new File(file.getParent(), file.getName().substring(0, file.getName().lastIndexOf(".")));if (!dirFile.exists()) {dirFile.mkdir();}for (int y =0, j =1; y <= totalHeight-height; y+=height, j++) {for (int x =0, i =1; x <= totalWidth-width; x+=width, i++) {File targetFile = new File(dirFile, j+"_"+i+".jpg");BufferedImage targetImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics g = targetImage.getGraphics();System.out.println(targetFile.getPath() + ": x="+x+",y="+y+"; width="+width+", height="+height+"; totalWidth"+totalWidth+",totalHeight="+totalHeight);g.drawImage(image.getSubimage(x, y, width, height), 0, 0, null);ImageIO.write(targetImage, "JPG", targetFile);}}}}。
java拼图游戏图片插入与分割
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
//计算切片的横向和纵向数量
if (srcWidth % destWidth == 0) {
cols = srcWidth / destWidth;
} else {
cols = (int) Math.floor(srcWidth / destWidth) + 1;
}
if (srcHeight % destHeight == 0) {
for (int j = 0; j < cols; j++) {
//四个参数分别为图像起点坐标和宽高
//即: CropImageFilter(int x,int y,int width,int height)
cropFilte(j * 200, i * 150,
//读取源图像
BufferedImage bi = ImageIO.read(new File(srcImageFile));
int srcWidth = bi.getHeight(); //源图宽度
int srcHeight = bi.getWidth(); //源图高度
if (srcWidth > destWidth && srcHeight > destHeight) {
批注本地保存成功开通会员云端永久保存去开通
public static void cut(String srcImageFile, String descDir, int destWidth,
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//即: CropImageFilter(int x,int y,int width,int height)
cropFilter = new CropImageFilter(j * 200, i * 150,
destWidth, destHeight);
img = Toolkit.getDefaultToolkit().createImage(
int srcWidth = bi.getHeight(); //源图宽度
int srcHeight = bi.getWidth(); //源图高度
if (srcWidth > destWidth && srcHeight > destHeight) {
Image image = bi.getScaledInstance(srcWidth, srcHeight,
new FilteredImageSource(image.getSource(),
cropFilter));
BufferedImage tag = new BufferedImage(destWidth,
destHeight, BufferedImage.TYPE_INT_RGB);
Graphics g = tag.getGraphics();
cols = srcWidth / destWidth;
} else {
cols = (int) Math.floor(srcWidth / destWidth) + 1;
}
if (srcHeight % destHeight == 0) {
rows = srcHeight / destHeight;
Image.SCALE_DEFAUቤተ መጻሕፍቲ ባይዱT);
destWidth = 200; //切片宽度
destHeight = 150; //切片高度
int cols = 0; //切片横向数量
int rows = 0; //切片纵向数量
//计算切片的横向和纵向数量
if (srcWidth % destWidth == 0) {
public static void cut(String srcImageFile, String descDir, int destWidth,
int destHeight) {
try {
Image img;
ImageFilter cropFilter;
//读取源图像
BufferedImage bi = ImageIO.read(new File(srcImageFile));
e.printStackTrace();
}
}
g.drawImage(img, 0, 0, null); //绘制缩小后的图
g.dispose();
//输出为文件
ImageIO.write(tag, "JPEG", new File(descDir
+ "pre_map_" + i + "_" + j + ".jpg"));
}
}
}
} catch (Exception e) {
} else {
rows = (int) Math.floor(srcHeight / destHeight) + 1;
}
//循环建立切片
//改进的想法:是否可用多线程加快切割速度
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {