1、Java 程序设计与应用开发课程设计报告设计题目 拼图大作战学生姓名 学生班级 学生学号指导教师完成时间:2016 年 06 月 21 日目录一、项目说明.2二、设计思路与关键数据结构.4三、系统的类和结构.6四、核心算法描述和相关技术说明.8五、总结和体会.9六、源代码清单.10一 项目说明1、 项目介绍该游戏是由以图片为主体的拼图小游戏,这个游戏是一个益智休闲的小游戏。该类似的小游戏在我们成长的过程中,曾经疯狂的流行着,这是一个老少皆宜的小游戏,它开发人们的智力,加强我们的动手能力和我们的眼睛的洞察力。该游戏简单方便易操作是一个很好的小游戏,也是一个经久不衰的游戏,在我们这代人中,可谓每个
2、人都玩过这种类似的小游戏,简单易操作是其一直存在的原因之一。游戏由简单的界面组成的,操作简单,该图像块是由 12 块小的小图像块构成的,其中有一个空白的小图像块,该图像块是来与别的图像块交换的,以此来实现大图像的拼凑。在 java 标准环境下运行,实现通过小的图像块的移动实现大的图像的拼凑。通过鼠标点击选取小的图像块,通过移动鼠标实现小图像的移动,使小图像块能够上下左右的移动从而完成大图像的拼凑的完成。2、 游戏展示与使用1.主体功能可以从多张图片中选择来进行拼图游戏通过移动鼠标实现小图像的移动,使小图像块能够上下左右的移动从而完成大图像的拼凑的完成。播放游戏音乐的功能统计游戏中走的步数游戏中
3、体现友好性,加了数字提示的功能和一个原图预览的区域完成后,有设置提示弹框显示,所用的步数和恭喜2.如何使用如下图:可以先选择喜欢的图片来进行游戏,点击喜欢的图片后,再点击 Start 按钮便可以开始游戏在游戏过程冲,可以使用数字提示的功能,数字提示会按照1,2,9 的顺序给予提示,借此降低游戏难度,增加可玩性也可以控制游戏音乐的播放与否在完成拼图后,会提恭喜完成的信息。若再想继续游戏,则继续选择喜欢的图片,再点击 Start 按钮继续游戏若不想玩游戏,则点击右上角叉叉,即可退出游戏。3基于 Java 技术,在 Ecilpse 下进行编译使用,作者使用环境 SUMSUNG 电脑,WIN10 64
4、位操作系统二、设计的思路与关键数据结构1、 设计思路主要是利用了 Java 中的 Swing 和 Awt 来实现界面上的静态显示和动态交互操作,播放音乐的技术使用到了 Applet,在算法的实现上,利用了布局上的坐标方式,来计算每个小方格的坐标位置,进行小图片交换和判断是否复原拼图等操作。 2、实现思路主要分为 五个类来实现总体的功能在构思布局的过程中,想了 3*4 的布局,借此可以直接在面板上放置比较多的按钮来实现功能。在显示界面的思路上,分为四个方面,主界面,图片预览区,拼图区,小平图单元格。然后要有实现游戏总的一个类,启动类。所以总共五个类,利用 UML 时序图表示如下:3、关键算法在决
5、定做这个小游戏的时候,翻阅了书本,书本利用了坐标来计算每个小方块的关系,进行计算。但是不完善,在这个基础上,上网查阅了博客和一些IT 网站,最后完成了算法方面的问题。第一个,打乱小拼图,利用第一个左上角的小方块与周围的小方块进行比较,若原理左上角的四块小方格,则表示打乱成功。第二个,如何将点击的小方块和空方块来进行交换,将两个方块坐标进行互换即刻,在判断四个方向即刻。利用 UML 时序图表示如下:三、系统的类和结构类结构与关系:启动起类,负责调用空的构造方法,来启动整个游戏。主界面类,进行界面的初始化操作,和添加组件。预览图片类,负责绘制预览区,将图片载入预览区。拼图图片类,关键类,实现了方格
6、移动的算法。拼图单元格类,关键类,实现了方格移动的算法利用 UML 时序图,陈勋结构和练习,显示如下:2、 最初完成游戏界面效果如图:此时无功能,无监听事件3、 完成监听和播放音乐功能后完成一句游戏后效果如图所示四、核心算法描述和相关技术说明主要算法:/当前方格的移动的算法public void move(String direction)/上,下,左,右switch (direction) case “UP“:this.setLocation(this.getBounds().x, this.getBounds().y - 150);break;case “DOWN“:this.setLoc
7、ation(this.getBounds().x, this.getBounds().y + 150);break;case “LEFT“:this.setLocation(this.getBounds().x - 150, this.getBounds().y);break;case “RIGHT“:this.setLocation(this.getBounds().x + 150, this.getBounds().y);break;default:/其他情况,不做移动处理break;/随机产生一个方向,进行空方格与小方法的互换/产生0-3之间的随机数,对应空方格的上下左右移动int di
8、rection = (int)(Math.random()*4);/0,1,2,3switch (direction) case 0:/空方格向左移动,与左边的方格进行互换位置,左侧方格要向右移动/nullX = nullX - 150;nullX -= 150;cellMove(nullX, nullY, “RIGHT“);break;case 1:/空方格向右移动,与右边的方格进行互换位置,右侧方格要向左移动nullX += 150;cellMove(nullX, nullY, “LEFT“);break;case 2:/空方格向上移动,与上边的方格进行互换位置,上侧方格要向下移动null
9、Y -= 150;cellMove(nullX, nullY, “DOWN“);break;case 3:/空方格向下移动,与下边的方格进行互换位置,下侧方格要向上移动nullY += 150;cellMove(nullX, nullY, “UP“);break;五、总结和体会1、优缺点与自我评价(一)、这个游戏真的太过简单,游戏功能单一,日后要完善,学新的知识(二)、没和他人进行问题和知识上的学习交流(三)、自己没有充分利用好时间,课程设计匆匆完成(四)、图形交互界面不扎实,做的时候要看书,试来试去。算法方面,这次写的两个算法相对简单,但也耗费了大量脑力,以后要多思考,学习算法。(五)、这几
10、天的精力都在做这个游戏中,破天荒给每行代码写好注释,以后要继续保持 2、课设与课程总结在没上 java 这门课之前,我就知道 java 的强大,在我们生活中的重要性。在学期开始的时候,那时我已经接触了 Java,后来因为对前端方向感兴趣,所以就没怎么关心过 Java,后台用的 PHP 多。有空的时候放开书本,发现这本书讲了好多“复古”的内容,在日常中,我并不多见到这些知识。在一次次地上网查询,了解相关的知识,从这些经历中,我打心底里对 java 有了新的了解,新的认识,从而对 java 产生了浓厚的兴趣以及好奇心,发现我之前太轻视这门课了。此时 Java 课堂教学虽已经停止,但是我私下,今后会
11、继续学期这门语言,认真对待,尝试自己在这个暑假就利用 Java 做后台。这个小游戏挺简单的,三天的时间,没有请教别人,自己慢慢的就捣鼓出来了。我知道团结的重要性,团队的力量。以后做这方面的东西,开发,还是要多和他人讨论学习。对于 XX 老师,很感谢您的教学付出,您在我心中是一个很负责任的老师,认真严肃的同时还能这么关心学生,贴近学生,真的打心底里佩服。六、源代码清单package gamestart;import gameui.PictureMainFrame;/* 启动器类*/public class MainApp public static void main(String args)
12、/创建主界面PictureMainFrame frame = new PictureMainFrame();/显示界面frame.setVisible(true);/* 图片小方格类*/package gameui;import javax.swing.Icon;import javax.swing.JButton;/* 图片小方格类*/public class Cell extends JButton /带有图片的小方格public Cell(Icon icon) super(icon);/设置小方格大小this.setSize(150, 150);/带有图片并且带有文字的小方格public
13、 Cell(String text, Icon icon) super(text, icon);/设置小方格大小this.setSize(150, 150);this.setHorizontalTextPosition(CENTER);/文字水平居中显示this.setVerticalTextPosition(CENTER);/文字垂直居中显示/当前方格的移动public void move(String direction)/上,下,左,右switch (direction) case “UP“:this.setLocation(this.getBounds().x, this.getBou
14、nds().y - 150);break;case “DOWN“:this.setLocation(this.getBounds().x, this.getBounds().y + 150);break;case “LEFT“:this.setLocation(this.getBounds().x - 150, this.getBounds().y);break;case “RIGHT“:this.setLocation(this.getBounds().x + 150, this.getBounds().y);break;default:/其他情况,不做移动处理break;/* 拼图类*/p
15、ackage gameui;import java.awt.Rectangle;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import javax.swing.ImageIcon;import javax.swing.JOptionPane;import javax.swing.JPanel;/* 拼图类*/public class PictureCanvas extends JPanel implements MouseListener/静态变量public static int pictureI
16、D = 1; /图片IDpublic static int stepNum = 0; /步数/成员变量private Cell cell;/小方格private boolean hasAddActionListener = false; /用来表示是否为方格添加了点击监听,添加了值为true,未添加值为falseprivate Rectangle nullCell;/指定一个空的小方格/构造方法public PictureCanvas()/设置拼图区的布局this.setLayout(null);/帧布局/创建12个图片小方格,添加到拼图区cell = new Cell12;for (int
17、i = 0; i box; /下拉框private JTextField name; / 图片名称public static JTextField step; / 步数private JButton start;/ 开始按钮/ private JButton startmusic;private JButton stopmusic;private JButton loopmusic;/空参数构造方法public PictureMainFrame()/super();init();/界面初始化操作addComponent();/添加组件addPreviewImage();/添加预览图片与拼图图片
18、addActionListener();/为组件添加事件监听loadMusic();startMusic();/为组件添加事件监听private void addActionListener() /数字提示addNumInfo.addActionListener(new ActionListener() /点击时激活下面的方法Overridepublic void actionPerformed(ActionEvent e) /完成数字提示的显示canvas.reLoadPictureAddNumber(););/清除提示clearNumInfo.addActionListener(new A
19、ctionListener() Overridepublic void actionPerformed(ActionEvent e) /完成数字提示的清除canvas.reLoadPictureClearNumber(););/下拉框box.addItemListener(new ItemListener() Overridepublic void itemStateChanged(ItemEvent e) /获取到选择的图片的序号int num = box.getSelectedIndex();/默认从0 开始/更新当前图片IDPictureCanvas.pictureID = num+1;
20、/更新预览区preview.repaint();/重新绘制预览区界面/更新拼图区canvas.reLoadPictureClearNumber();/更新游戏状态区name.setText(“名称:“ + box.getSelectedItem();/设置图片名称int stepNum = PictureCanvas.stepNum = 0;/游戏步数清零step.setText(“步数:“ + stepNum);/设置步数显示/按钮区/把按钮设置成 清除提示按钮选中状态clearNumInfo.setSelected(true););/开始按钮start.addActionListener(
21、new ActionListener() Overridepublic void actionPerformed(ActionEvent e) /已移动的步数清零PictureCanvas.stepNum = 0;/游戏状体区 进行步数显示更新step.setText(“步数:“ + PictureCanvas.stepNum);/对小方格进行重新位置排序,打乱顺序canvas.start(););/ startmusic.addActionListener(new ActionListener() / Override/ public void actionPerformed(ActionE
22、vent arg0) / / TODO Auto-generated method stub/ startmusic.setEnabled(false);/ loopmusic.setEnabled(true);/ stopmusic.setEnabled(true);/ / );loopmusic.addActionListener(new ActionListener() Overridepublic void actionPerformed(ActionEvent e) loopMusic();loopmusic.setEnabled(false);/ startmusic.setEna
23、bled(true);stopmusic.setEnabled(true););stopmusic.addActionListener(new ActionListener() Overridepublic void actionPerformed(ActionEvent e) stopMusic();stopmusic.setEnabled(false);/ startmusic.setEnabled(true);loopmusic.setEnabled(true););/=/添加预览图片与拼图图片private void addPreviewImage() /创建一个面板,包含拼图区与 预
24、览区JPanel panel = new JPanel();panel.setLayout(new GridLayout(1, 2);/设置布局为 表格布局/-/拼图区canvas = new PictureCanvas();canvas.setBorder(new TitledBorder(“拼图区“); /添加边框/图片预览区preview = new PicturePreview();preview.setBorder(new TitledBorder(“预览区“);/添加边框/把拼图区 与 图片预览区 添加到中间的面板中panel.add(canvas, BorderLayout.WE
25、ST);/左边panel.add(preview, BorderLayout.EAST);/右边/-/把面板显示在主界面中this.add(panel, BorderLayout.CENTER);/居中显示/添加组件private void addComponent() /创建用来在主界面上方显示的面板, 在面板中要包含按钮区 与 游戏状态区JPanel panel = new JPanel();panel.setLayout(new GridLayout(1, 2);/创建左边按钮区面板JPanel leftPanel = new JPanel();leftPanel.setBorder(n
26、ew TitledBorder(“按钮区“ );/添加边框leftPanel.setBackground(Color.PINK);/设置背景色/添加单选按钮addNumInfo = new JRadioButton(“数字提示“,false);clearNumInfo = new JRadioButton(“清除提示“, true);/添加按钮组ButtonGroup buttonGroup = new ButtonGroup();/添加下拉框box = new JComboBox(items);/添加开始按钮start = new JButton(“Start“);/添加单选按钮到按钮组中b
27、uttonGroup.add(addNumInfo);buttonGroup.add(clearNumInfo);/设置背景色addNumInfo.setBackground(Color.PINK);clearNumInfo.setBackground(Color.PINK);start.setBackground(Color.PINK);/添加组件到面板中leftPanel.add(addNumInfo);leftPanel.add(clearNumInfo);leftPanel.add(new JLabel(“ 选择图片: “);leftPanel.add(box);leftPanel.a
28、dd(start);panel.add(leftPanel, BorderLayout.WEST);/左边/-/创建右边游戏状体区面板JPanel rightPanel = new JPanel();rightPanel.setBorder(new TitledBorder(“游戏状态“);/添加边框rightPanel.setBackground(Color.PINK);/设置背景色rightPanel.setLayout(new GridLayout(1, 2);/设置布局为表格布局/添加组件 图片名称name = new JTextField(“图片名称:小女孩儿“);/添加组件 步数s
29、tep = new JTextField(“步数:0“);/设置文本框不能编辑name.setEditable(false);step.setEditable(false);/添加组件 播放音乐/ startmusic=new JButton(“播放音乐“);/添加组件 停止播放stopmusic=new JButton(“停止播放“);/l添加组件 循环播放loopmusic=new JButton(“重播音乐“);/把组件添加到游戏状态面板中rightPanel.add(name, BorderLayout.WEST);/左边rightPanel.add(step, BorderLayou
30、t.EAST);/右边/ rightPanel.add(startmusic, BorderLayout.CENTER);rightPanel.add(stopmusic, BorderLayout.EAST);rightPanel.add(loopmusic, BorderLayout.EAST);panel.add(rightPanel, BorderLayout.EAST);/右边/-/设置panel 在主界面的上方显示this.add(panel, BorderLayout.NORTH);/上面/=音乐=/ TODO Auto-generated method stubString b
31、gMusicName=“182.wav “;AudioClip bgMusicClipOnce,bgMusicClipLoop;boolean loopStatus;public void loadMusic()trybgMusicClipOnce=Applet.newAudioClip(getClass().getResource(“182.wav“);/装载一次播放的背景音乐receivemedia.aubgMusicClipLoop=Applet.newAudioClip(getClass().getResource(“182.wav“);/装载可循环播放的背景音乐receivemedi
32、a.aucatch(Exception e)System.err.println(“不能打开声音文件!“ );public void startMusic()/开始播放声音if(loopStatus)/如果循环播放状态;bgMusicClipLoop.loop() ;/循环播放声音bgMusicClipLoopelsebgMusicClipOnce.play();/播放一次声音bgMusicClipOncepublic void loopMusic()/循环播放声音if(!loopStatus)/如果当前状态是非循环状态 loopStatus=true;/改变为循环状态为真;bgMusicCl
33、ipOnce.stop() ;/一次播放声音片段bgMusicClipOnce停止;bgMusicClipLoop.loop();/循环播放声音片段 bgMusicClipLoop播放;bgMusicClipLoop.loop() ;/声音片段bgMusicClipLoop循环播放;public void stopMusic()/停止播放声音;if(loopStatus)bgMusicClipLoop.stop();bgMusicClipOnce.stop(); /=/* 界面初始化方法*/private void init() /设置窗口的标题this.setTitle(“拼图大作战“);/
34、设置窗口的大小this.setSize(1000, 720);/设置窗口的显示位置this.setLocation(150, 10);/设置窗口的大小为固定大小this.setResizable(false);/设置窗口的默认关闭操作this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/* 图片预览类*/package gameui;import java.awt.Graphics;import java.awt.Image;import javax.swing.ImageIcon;import javax.swing.JPanel;/* 图
35、片预览类*/public class PicturePreview extends JPanel /重写绘制组件方法,显示图片的显示Overrideprotected void paintComponent(Graphics g) super.paintComponent(g);/指定图片的路径/String filename = “picture1.jpg“;String filename = “picture“+PictureCanvas.pictureID+“.jpg“;/通过图片的路径,获取到对应的图片中的图像ImageIcon icon = new ImageIcon(filename);Image image = icon.getImage();/把图像 绘制在 预览区的面板中g.drawImage(image, 20, 20, 450, 600, this);