Java拼图游戏课程设计报告.doc_第1页
Java拼图游戏课程设计报告.doc_第2页
Java拼图游戏课程设计报告.doc_第3页
Java拼图游戏课程设计报告.doc_第4页
Java拼图游戏课程设计报告.doc_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java程序设计与应用开发课程设计报告设计题目拼图大作战学生姓名 学生班级 学生学号指导教师 完成时间:2016 年 06 月 21 日目录一、项目说明.2二、设计思路与关键数据结构.4三、系统的类和结构.6四、核心算法描述和相关技术说明.8五、总结和体会.9六、源代码清单.10一 项目说明1、 项目介绍该游戏是由以图片为主体的拼图小游戏,这个游戏是一个益智休闲的小游戏。该类似的小游戏在我们成长的过程中,曾经疯狂的流行着,这是一个老少皆宜的小游戏,它开发人们的智力,加强我们的动手能力和我们的眼睛的洞察力。该游戏简单方便易操作是一个很好的小游戏,也是一个经久不衰的游戏,在我们这代人中,可谓每个人都玩过这种类似的小游戏,简单易操作是其一直存在的原因之一。 游戏由简单的界面组成的,操作简单,该图像块是由12块小的小图像块构成的,其中有一个空白的小图像块,该图像块是来与别的图像块交换的,以此来实现大图像的拼凑。在java标准环境下运行,实现通过小的图像块的移动实现大的图像的拼凑。通过鼠标点击选取小的图像块,通过移动鼠标实现小图像的移动,使小图像块能够上下左右的移动从而完成大图像的拼凑的完成。2、 游戏展示与使用1.主体功能可以从多张图片中选择来进行拼图游戏通过移动鼠标实现小图像的移动,使小图像块能够上下左右的移动从而完成大图像的拼凑的完成。播放游戏音乐的功能统计游戏中走的步数游戏中体现友好性,加了数字提示的功能和一个原图预览的区域完成后,有设置提示弹框显示,所用的步数和恭喜2.如何使用如下图:可以先选择喜欢的图片来进行游戏,点击喜欢的图片后,再点击Start按钮便可以开始游戏在游戏过程冲,可以使用数字提示的功能,数字提示会按照1,2,9的顺序给予提示,借此降低游戏难度,增加可玩性也可以控制游戏音乐的播放与否在完成拼图后,会提恭喜完成的信息。若再想继续游戏,则继续选择喜欢的图片,再点击Start按钮继续游戏若不想玩游戏,则点击右上角叉叉,即可退出游戏。3基于Java技术,在Ecilpse下进行编译使用,作者使用环境SUMSUNG电脑,WIN10 64位操作系统 二、设计的思路与关键数据结构1、 设计思路主要是利用了Java中的Swing和Awt来实现界面上的静态显示和动态交互操作,播放音乐的技术使用到了Applet,在算法的实现上,利用了布局上的坐标方式,来计算每个小方格的坐标位置,进行小图片交换和判断是否复原拼图等操作。 2、实现思路 主要分为五个类来实现总体的功能在构思布局的过程中,想了3*4的布局,借此可以直接在面板上放置比较多的按钮来实现功能。在显示界面的思路上,分为四个方面,主界面,图片预览区,拼图区,小平图单元格。然后要有实现游戏总的一个类,启动类。所以总共五个类,利用UML时序图表示如下:3、关键算法 在决定做这个小游戏的时候,翻阅了书本,书本利用了坐标来计算每个小方块的关系,进行计算。但是不完善,在这个基础上,上网查阅了博客和一些IT网站,最后完成了算法方面的问题。第一个,打乱小拼图,利用第一个左上角的小方块与周围的小方块进行比较,若原理左上角的四块小方格,则表示打乱成功。第二个,如何将点击的小方块和空方块来进行交换,将两个方块坐标进行互换即刻,在判断四个方向即刻。利用UML时序图表示如下:三、系统的类和结构类结构与关系:启动起类,负责调用空的构造方法,来启动整个游戏。 主界面类,进行界面的初始化操作,和添加组件。 预览图片类,负责绘制预览区,将图片载入预览区。 拼图图片类,关键类,实现了方格移动的算法。 拼图单元格类,关键类,实现了方格移动的算法利用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.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;/随机产生一个方向,进行空方格与小方法的互换/产生0-3之间的随机数,对应空方格的上下左右移动int direction = (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:/空方格向上移动,与上边的方格进行互换位置,上侧方格要向下移动nullY -= 150;cellMove(nullX, nullY, DOWN);break;case 3:/空方格向下移动,与下边的方格进行互换位置,下侧方格要向上移动nullY += 150;cellMove(nullX, nullY, UP);break;五、总结和体会1、优缺点与自我评价(一)、这个游戏真的太过简单,游戏功能单一,日后要完善,学新的知识(二)、没和他人进行问题和知识上的学习交流(三)、自己没有充分利用好时间,课程设计匆匆完成(四)、图形交互界面不扎实,做的时候要看书,试来试去。算法方面,这次写的两个算法相对简单,但也耗费了大量脑力,以后要多思考,学习算法。(五)、这几天的精力都在做这个游戏中,破天荒给每行代码写好注释,以后要继续保持 2、课设与课程总结在没上java这门课之前,我就知道java的强大,在我们生活中的重要性。在学期开始的时候,那时我已经接触了Java,后来因为对前端方向感兴趣,所以就没怎么关心过Java,后台用的PHP多。有空的时候放开书本,发现这本书讲了好多“复古”的内容,在日常中,我并不多见到这些知识。在一次次地上网查询,了解相关的知识,从这些经历中,我打心底里对java有了新的了解,新的认识,从而对java产生了浓厚的兴趣以及好奇心,发现我之前太轻视这门课了。此时Java课堂教学虽已经停止,但是我私下,今后会继续学期这门语言,认真对待,尝试自己在这个暑假就利用Java做后台。这个小游戏挺简单的,三天的时间,没有请教别人,自己慢慢的就捣鼓出来了。我知道团结的重要性,团队的力量。以后做这方面的东西,开发,还是要多和他人讨论学习。对于XX老师,很感谢您的教学付出,您在我心中是一个很负责任的老师,认真严肃的同时还能这么关心学生,贴近学生,真的打心底里佩服。六、源代码清单package gamestart;import gameui.PictureMainFrame;/* * 启动器类 */public class MainApp public static void main(String args) /创建主界面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 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.getBounds().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;/* * 拼图类 */package 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 pictureID = 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 i = 0; i 4; i+) /代表的是行数for (int j = 0; j 3; j+) /代表的是列数/加载图片/ImageIcon icon = new ImageIcon(picture1_1.gif);/i=0,1/j=0,1,2/0*3+0+1 = 1/0*3+1+1 = 2/0*3+2+1 = 3/1*3+0+1 = 4/1*3+1+1 = 5ImageIcon icon = new ImageIcon(picture1_+(i*3+j+1)+.gif);/创建图片小方格celli*3+j = new Cell(icon);/指定图片小方格显示的位置celli*3+j.setLocation(j*150+20, i*150+20);/把图片小方格添加到拼图区显示this.add(celli*3+j);/删除第12个图片小方格this.remove(cell11);/指定一个空的小方格nullCell = new Rectangle(300+20, 450+20, 150, 150);/重新加载图片,并添加数字提示public void reLoadPictureAddNumber()/获取到每一个图片小方格for (int i = 0; i 4; i+) /行数for (int j = 0; j 3; j+) /列数/获取小方格 celli*3+j/设置小方格显示的图片ImageIcon icon = new ImageIcon(picture+pictureID+_+(i*3+j+1)+.gif);celli*3+j.setIcon(icon);/设置小方格显示的数字提示celli*3+j.setText( + (i*3+j+1);/设置小方格数字显示的位置celli*3+j.setVerticalTextPosition(this.getY()/2);/设置文字垂直显示位置居中显示celli*3+j.setHorizontalTextPosition(this.getX()/2);/设置文字水平显示位置居中显示/重新加载图片,并去除数字提示public void reLoadPictureClearNumber()/获取到每一个图片小方格for (int i = 0; i 4; i+) /行数for (int j = 0; j 3; j+) /列数/获取小方格 celli*3+j/设置小方格显示的图片ImageIcon icon = new ImageIcon(picture+pictureID+_+(i*3+j+1)+.gif);celli*3+j.setIcon(icon);/设置小方格显示的数字提示celli*3+j.setText();/对小方格进行重新位置排序,打乱顺序public void start()/如果没有给小方格添加鼠标点击监听的话,则添加监听if ( !hasAddActionListener) /添加监听for (int i = 0; i 11; i+) celli.addMouseListener(this);/更新鼠标点击监听的状态hasAddActionListener = true;/判断当前第一个小方格距离左上交的较近时,进行方格与空方格互换/如果第一个小方格在左上角的四个方格位置内,就不断的循环,进行方法与空方格位置的互换while(cell0.getBounds().x =170 & cell0.getBounds().y =170 )/获取到空方格的位置int nullX = nullCell.getBounds().x;int nullY = nullCell.getBounds().y;/随机产生一个方向,进行空方格与小方法的互换/产生0-3之间的随机数,对应空方格的上下左右移动int direction = (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:/空方格向上移动,与上边的方格进行互换位置,上侧方格要向下移动nullY -= 150;cellMove(nullX, nullY, DOWN);break;case 3:/空方格向下移动,与下边的方格进行互换位置,下侧方格要向上移动nullY += 150;cellMove(nullX, nullY, UP);break;/* * 方格与空方格位置互换 * param nullX 空方格的x轴坐标 * param nullY 空方格的y轴坐标 * param direction 方格要移动的方向 */private void cellMove(int nullX, int nullY, String direction) for (int i = 0; i 11; i+) /获取到与空方格位置相同的小方格if (celli.getBounds().x = nullX & celli.getBounds().y = nullY) /当前方格的移动celli.move(direction);/空方格的移动nullCell.setLocation(nullX, nullY);/交换位置后,结束循环break;Overridepublic void mouseClicked(MouseEvent e) Overridepublic void mousePressed(MouseEvent e) /鼠标按下去/获取到当前所点击的小方格Cell button = (Cell)e.getSource();/获取所点击方格的x,y坐标int clickX = button.getBounds().x;int clickY = button.getBounds().y;/获取当前空方格的x,y坐标int nullX = nullCell.getBounds().x;int nullY = nullCell.getBounds().y;/进行比较,如果满足条件进行位置的交换if (clickX = nullX & clickY - nullY = 150) /点击的为空方格下面的方格button.move(UP);/所点击的方格 向上移动 else if (clickX = nullX & clickY - nullY = -150) /点击的为空方格上面的方格button.move(DOWN);/所点击的方格 向下移动 else if(clickX - nullX = 150 & clickY = nullY)/点击的为空方格右面的方格button.move(LEFT);/所点击的方格 向左移动 else if(clickX - nullX = -150 & clickY = nullY)/点击的为空方格左面的方格button.move(RIGHT);/所点击的方格 向右移动 else return ;/ 不满足移动条件,就不进行任何的处理/更新空方格的位置nullCell.setLocation(clickX, clickY);/拼图区界面重新绘制this.repaint();/更新步数,将游戏状态区的步数更新stepNum+;PictureMainFrame.step.setText(步数:+stepNum);/判断当前游戏是否完成,若完成,给玩家一个友好提示if (this.isFinish() /弹出窗口提示JOptionPane.showMessageDialog(this, 恭喜你完成拼图,加油! n 所用步:+stepNum);/撤销每一个小方格上的鼠标点击监听, 让鼠标点击小方格步再起作用了for (int i = 0; i 11; i+) celli.removeMouseListener(this);/更新方格的动作监听器的状态hasAddActionListener = false;/判断当前游戏是否完成, 根据坐标判断是否拼图成功private boolean isFinish()for (int i = 0; i 11; i+) /获取每一个方格的位置int x = celli.getBounds().x;int y = celli.getBounds().y;if ( (y-20)/150*3 + (x-20)/150) != i ) /i=0, (20-20)/150*3 + (20-20)/150) = 0/i=1, (20-20)/150*3 + (170-20)/150) = 1/./i=5, (170-20)/150*3 + (320-20)/150)= 5 return false;return true;Overridepublic void mouseReleased(MouseEvent e) Overridepublic void mouseEntered(MouseEvent e) Overridepublic void mouseExited(MouseEvent e) /* * 主界面类 */package gameui;import java.applet.Applet;import java.applet.AudioClip;import java.awt.BorderLayout;import java.awt.Color;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.ItemEvent;import java.awt.event.ItemListener;import javax.swing.ButtonGroup;import javax.swing.JButton;import javax.swing.JCheckBox;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JRadioButton;import javax.swing.JTextField;import javax.swing.border.TitledBorder;/* * 主界面类 */public class PictureMainFrame extends JFrame private String items = 小萌妹,爱心,Baby,橙汁C,快乐节日,数字模式;private JRadioButton addNumInfo; / 数字提示private JRadioButton clearNumInfo; /清除提示private PictureCanvas canvas; / 拼图区private PicturePreview preview; /预览区private JComboBox 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();/添加预览图片与拼图图片addActionListener();/为组件添加事件监听loadMusic();startMusic();/为组件添加事件监听private void addActionListener() /数字提示addNumInfo.addActionListener(new ActionListener() /点击时激活下面的方法Overridepublic void actionPerformed(ActionEvent e) /完成数字提示的显示canvas.reLoadPictureAddNumber(););/清除提示clearNumInfo.addActionListener(new ActionListener() 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;/更新预览区preview.repaint();/重新绘制预览区界面/更新拼图区canvas.reLoadPictureClearNumber();/更新游戏状态区name.setText(名称:+ box.getSelectedItem();/设置图片名称int stepNum = PictureCanvas.stepNum = 0;/游戏步数清零step.setText(步数: + stepNum);/设置步数显示/按钮区/把按钮设置成 清除提示按钮选中状态clearNumInfo.setSelected(true););/开始按钮start.addActionListener(new ActionListener() Overridepublic void actionPerformed(ActionEvent e) /已移动的步数清零PictureCanvas.stepNum = 0;/游戏状体区 进行步数显示更新step.setText(步数: + PictureCanvas.stepNum);/对小方格进行重新位置排序,打乱顺序canvas.start(););/startmusic.addActionListener(new ActionListener() /Override/public void actionPerformed(ActionEvent 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.setEnabled(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() /创建一个面板,包含拼图区与 预览区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.WEST);/左边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(new 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);/添加单选按钮到按钮组中buttonGroup.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.add(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(图片名称:小女孩儿);/添加组件 步数step = 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, BorderLayout.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 bgMusicName=182.wav ; AudioClip bgMusicClipOnce,bgMusicClipLoop; boolean l

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论