资源描述
学年论文(JAVA面向对象程序设计 2015-2016 第二学期)题目: JAVA课程设计 作者: 陈炳宏 所在学院: 信息科学与工程学院 专业年级: 信息安全14-1 指导教师: 杨晴雯 职称: 副教授 2016年6月 4 日基于JAVA的拼图游戏的设计摘要 拼图游戏是一款非常经典的小游戏,因为它比较简单有趣,老少皆宜。拼图游戏的设计对每一个Java语言设计者进行语言提高和进阶都是一个很好的锻炼机会。拼图游戏的设计比较复杂,它涉及面广、牵涉方面多,如果不好好考虑和设计,将难以成功开发出这个游戏。在这个游戏的设计中,牵涉到图形界面的显示与更新、数据的收集与更新,并且在这个游戏的开发中,还要应用类的继承机制以及一些设计模式。因此,如何设计和开发好这个拼图游戏,对于提高Java开发水平和系统的设计能力有极大的帮助。在设计开发过程中,需要处理好各个类之间的继承关系,还要处理各个类相应的封装,并且还要协调好各个模块之间的逻辑依赖关系和数据通信关系。关键词:拼图游戏 Java语言 开发The design of JAVA software based on the puzzleAbstract:Jigsaw puzzle is a very classic game, because it is easy and fun, both old and young, are more suitable.Jigsaw design language for each Java language designers to improve and advance is an excellent exercise opportunities. Puzzle design is more complex, its scope, and involves many more, if you do not think and design, would be difficult to successfully developed this game. In the design of the game involves display of the graphical interface and updating, data is collected and updated, and in the development of this game, class inheritance mechanism, and some design patterns you want to apply. Therefore, how to design and develop this jigsaw puzzle, for raising the level of Java development, and system design capabilities are of great help. During the process of design and development, you need to handle the inheritance relationships between the classes, also have to deal with each type of appropriate packaging, and also to coordinate the various logical dependencies between modules and data communication.Keywords:Jigsaw puzzle Java language develop 目录一、需求分析41.程序分析42.执行方式43.程序执行的命令包括44.测试数据5二、概要设计71.拼图游戏流程图72.设计思路73.主要类文件说明8三、详细设计91.建立MenuFrame菜单首页类92.建立CardFrame首页说明类103.建立ShowImage目标图显示类114.建立Grades分数记录类115.建立split原图划分类移动点击事件类126.建立ButtonClick拼图移动点击事件类137.建立Gameover判断游戏结束类148.建立Puzzle拼图游戏主类14四、调试分析161.程序的运行162.游戏测试16五、用户手册171.游戏三个状态172.游戏菜单选项183.游戏提示框20六、测试结果22七、附录(源码)24课程设计题目:基于JAVA的拼图游戏1、 需求分析1.程序分析本游戏是一个Java语言的拼图游戏,在eclipse上使用JAVA语言编写并且利用Java Swing设计显示。拼图中有一个格子是空的,其他格子内随机放置由目标图片切割成的若干个小图片,图片按照不同难度结合目标图片分辨率进行切割。用户通过点击空位置中周围的任何非空图块来移动非空图块到空位置,一直重复直到拼回目标图片的样子后游戏成功,记录名次分数。2.执行方式 在开始游戏之前,可以选择游戏等级后再点击“开始”菜单里的“新游戏”,进行拼图游戏,被打乱的目标图片依次设置到拼图中的各个按钮中,利用按钮的点击事件,点击可移动的,设置按钮背景图片为空,临近按钮设置背景图片为刚点击按钮背景图片,重复以往,直到方块一行一行的按图片的原始样子拼好即可完成该游戏。游戏拼完后,会弹出一个“信息”框,显示你玩游戏所用的步数与时间,点击“确定”后,会弹出一个“输入”框,可以在里面输入游戏者的姓名,单击“确定”后会弹出游戏的记录框。3.程序执行的命令包括(1) 菜单开始: 包括菜单项新游戏,游戏记录,退出游戏,显示背景图片;(2) 菜单选择: 包括菜单项等级选择和背景图片选择,其中等级选择包括难、中、易三个子菜单项,背景图片包含已添加到images文件夹下的图片菜单项;(3) 菜单关于: 包含帮助和关于两个菜单项;(4) 按钮点击事件: 用于接收按钮图片移动请求并做出相应移动;(5) 游戏记录存储: 游戏结束后,在不同难度下,如果打破纪录的记录会被写入Game.rc文件中;(6) panel面板显示:用于不同页面间的切换显示;4.测试数据 (1) 目标图片如图1:图1 目标图片 (2) 难度:难度易游戏如图2:图2 难度易游戏图片(3) 难度普通游戏如图3:图3 难度普通游戏图片(4) 难度难游戏如图4: 图4 难度难游戏图片 2、 概要设计1. 拼图游戏流程图游戏结束窗体显示图片放置动作事件的监听事件响应是否开始游戏拼图完整 图5 JAVA拼图游戏框架图2. 设计思路为实现上述游戏功能,首先需要写出MenuFrame首页,在该布局里添加基础选项和标签,并添加到程序首页布局上,然后CardFrame继承MeauFrame并设置程序说明和焦点事件以完成暂停继续,接着设计ShowImage类用于显示原来图像,设计Grades类来记录游戏者游戏信息以及最终成绩并借助Arg传递到Game.rc文件中,其中包含Data类用来辅助Grades保存数据,设计split类来划分图块,接着设计ButtonClick来实现图片的点击移动事件,其中引用point类辅助设置移动,并引用设计GameOver实现游戏过程中的计时、暂停、结束等功能并返回,最后设计Puzzle主类继承于CarFrame类用于添加上述各种点击事件并调用相关功能,包括在模板显示由split类划分的传到拼图矩阵后的整个拼图图块,最后完善整个功能需要。3. 主要类文件说明本程序包含8个主要模块:1) ButtonClick.class该类主要是实现鼠标事件,让玩家在用鼠标点击能够移动拼图的小图片,移动到周围空格的地方2) CardFrame.class该类主要实现,初始界面的相关提示信息。3)GameOver.class 该类主要实现游戏过程中的计时、暂停、结束等功能,游戏结束时的信息。4) split.class 该类主要实现图片的提取与切割的功能。5)Grades.class 该类主要实现成绩记录的初始化,在拼图成功后可记录游戏者姓名的功能,并直接提取等级、步数与时间等信息的功能。保存成绩记录信息,以便游戏者查看。6)MenuFrame.class 该类主要实现有主菜单与子菜单的功能。并设置相关的快捷键功能。7)Puzzle.class 该类是该游戏程序的主程序,从游戏界面大小到游戏过程中出现的所有信息框等相关功能都到了实现,调用相关类实现其功能。8)ShowImage.class 该类用于新建窗口显示目标图像。3、 详细设计1.建立MenuFrame菜单首页类菜单首页的建立完成了以下设计,设置主页菜单结构、设置菜单位于桌面位置和退出方式、设置快捷键、点击事件选择难度,默认普通、添加开始子菜单点击事件好快捷键、添加难度选择子菜单项并调用点击事件、添加文件选择点击事件、关于菜单设置、图片预览点击事件设置更新,很好的构建了整个游戏的架构,下面列出该类的菜单结构和一些重要的方法代码:(省略非关键代码,可在文末源代码查看)public abstract class MenuFrameextends JFrame/设置主页菜单结构 . private JMenu m = new JMenu(开始(B).; private JMenu mm = new JMenu(等级(L).;public MenuFrame()/设置菜单位于桌面位置和退出方式super(拼图游戏);addMenu();.this.getToolkit().getScreenSize().width/3 - this.getWidth()/3;private void addMenu()/设置快捷键m0.setMnemonic(B);initMenuBegin() .private void menuLevelClick(String nm)/点击事件选择难度,默认普通type = 3;if (nm.equals(困难).private void initMenuBegin()/添加开始子菜单点击事件好快捷键JMenuItem mI = new JMenuItem(新游戏(N).; mI0.setMnemonic(N); .mI0.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e)menuNewClick(););mI1,mI2.m0.add(mI0);.private void initMenuLevel()/添加难度选择子菜单项并调用点击事件JRadioButtonMenuItem mi = new JRadioButtonMenuItem(困难).; for (int i = 0; i 3; i+) mii.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) JRadioButtonMenuItem mi = (JRadioButtonMenuItem)e.getSource(); menuLevelClick(mi.getText(););.public void initMenuBackground()/添加文件选择点击事件.File list = bkg.listFiles();int j = 0;for (int i = 0; i datatype.time | (t = datatype.time & s = datatype.step)return;datatype.name = JOptionPane.showInputDialog(null,你打破了记录!n请输入你的名字。);try/显示更新后的排名PrintStream f = new PrintStream(Arg.rc);f.printf(%s %d %dn, data0.name, data0.time, data0.step);.catch (Exception e).show();public void show()/调用显示现有记录trycreatData();readData();.JOptionPane.showMessageDialog(null, title+h+n+e);catch (Exception e).5.建立split原图划分类移动点击事件类 原图花分类里,首先按照难度不同,根据不同的尺寸进行原图划分判断如果没被划分过,则对图案划分并返回,接着新建图片文件夹,并返回已建立,最后引用选中的图片文件夹里的图片,并且根据难度不同,对图片进行划分,并且写入到图片数组 BufferedImage中去。public class Split/建立划分类,按照难度不同,根据不同的尺寸进行原图划分public static final int HARD = 0;public static final int NORMAL = 1;public static final int EASY = 2;public static final String pvo = png;public static final int level = 100, 160, 200;.public static Split get()/判断如果没被划分过,则对图案划分并返回.public boolean set(String fn)/新建图片文件夹,并返回已建立filename = fn;path = Arg.path + / + filename;File file = new File(path);return file.exists();public BufferedImage divid(int type)/引用选中的图片文件夹里的图片,并且根据难度不同,对图片进行划分,并且写入到图片数组 BufferedImage中去。tryBufferedImage image = ImageIO.read(new File(path);int len = leveltype;int cal = image.getWidth() / len;int row = image.getHeight() / len;BufferedImage subimage = new BufferedImagerowcal;for (int i = 0; i row; i+)for (int j = 0; j cal; j+)subimageij = image.getSubimage(j*len, i*len, len, len);return subimage;.6.建立ButtonClick拼图移动点击事件类 ButtonClick拼图移动点击事件类先将按钮点击事件链接接口,然后判断点击的非空按钮周围是否为空,如果为空就先把该非空按钮设置图案为空,然后将空白的按钮设置为刚才的图案,并且判断是否成功。public class ButtonClick implements ActionListener/按钮点击事件链接接口private JButton button;private point pint;private int row;private int cal;private int matrix;private GameOver gOver;private boolean end;public ButtonClick(JButton b, point p, int m, int r, int c, GameOver g) button = b;pint = p;matrix = m;row = r;cal = c;gOver = g;end = false;public void actionPerformed(ActionEvent e)/判断点击的非空按钮周围是否为空,如果为空就先把该非空按钮设置图案为空if (end | !pint.neighbor(row, cal) return;int r = pint.getRow();int c = pint.getCal();buttonrc.setIcon(buttonrowcal.getIcon();buttonrowcal.setIcon(null);pint.set(row, cal);int t = matrixrc;matrixrc = matrixrowcal;matrixrowcal = t;end = gOver.judge();7.建立Gameover判断游戏结束类public class GameOver/引入游戏结束标志,暂停标志,和图片矩阵等private boolean gameOver;private boolean stop;private int matrix; .public GameOver (Puzzle frm)/构造方法Main = frm;public void start(int m)/开始方法,对数据初始化gameOver = false;matrix = m;step = 0;Date d = new Date();now = d.getTime();stop = false;countTime = 0;public boolean judge()/比对原来的拼图,判断现在的拼图是否与目标图案一样,一样则返回结束标志if (gameOver)return true;step+;int c = 1;for (int i = 0; i matrix.length; i+)for (int j = 0; j “背景图片”中选择你自己的图片,然后选择“等级”-“困难”或“普通”或“简单”,进行等级选择,最后选择“开始”-“新游戏”就可以拼自己想拼的图了。初始窗口如图6所示: 图6 游戏初始窗口2)游戏进行状态 当游戏者选择好图片与等级后,就可以进行拼图游戏了及进入游戏的进行图 图7 游戏进行状态态。如图7所示:3)游戏暂停状态 当游戏者,在游戏过程中半途暂停游戏的话,将出现如图8所示的游戏暂停状态的界面。当游戏者又想继续游戏时,直接单击界面上的“继续”字样,就可以继续游戏了。 图8 游戏暂停状态2. 游戏菜单选项1)“开始”菜单。包括了,“新游戏”、“成绩记录”、“图片预览”、“退出游戏”。如图9所示。 “新游戏”:单击可以开始游戏,如图10所示游戏进行状态。 “成绩记录”:单击可以查看游戏者的游戏最佳成绩记录。如图8所示。初始的成绩记录。 “图片预览”:在游戏过程中可以单击预览图片,对照着拼,如图11所示。 “退出游戏”:游戏者要结束游戏可直接单击退出游戏。 图9 游戏开始菜单 图10 游戏最佳成绩记录 图11 目标图片预览2)“选择”菜单。包括了,“等级”、“背景图片”。如图12所示。当运行 图12 选择菜单游戏时,如果没有把“background”这个文件夹放入主程序的目录下,在运行游戏选择背景图片时,将没有图片可选,这是可以按照“初始状态”界面上的提示进行操作。若正常的有“background”在主程序路径下的话,运行游戏选择背景图片的话,就可以选择图片了,界面如图13所示。 “等级”:在游戏者开始游戏之前,要进行游戏等级选择,共有困难、普通、简单三种选择。其图片的切割块数,会根据选择的等级不同,而有所不同。 “背景图片”:这里保存了所要拼的所有图片。在游戏前要进行选择。 图13 选择菜单 3)“关于”菜单。包括了“帮助”、“关于”两个下拉菜单。 “帮助”:在游戏时,可以单击查看游戏的简单规则。 “关于”:可查看该游戏的版本、作者、与作者的Email的相关信息 3.游戏提示框1)提示信息窗口 当游戏者运行游戏时,如果没有把“background”这个文件夹放入主程序的目录下,在运行游戏选择背景图片时,将没有图片可选,若此时直接“开始”-“新游戏”,将会弹出如下提示信息框。界面如图14所示。图14 提示信息框2)拼图成功界面,若选择abc.jpg图片拼图时,若拼图成功,界面如图15所示。图15 拼图成功3)成绩记录输入框 当游戏者完成拼图游戏后,将出现一个成绩记录框(“输入”框),输入游戏者的姓名。如图16所示。输入后单击确定按钮,将弹出总的成绩记录框。 图16 输入名字 如图17所示: 图17 成绩记录框6、 测试结果(1) 易破纪录测试结果如图18,输入记录如图19,最终成绩记录如图20:图片18 易难度破纪录图图片19输入易记录图图片20最终成绩记录图(2)普通破纪录测试结果如图21,输入记录如图22,最终成绩记录如图23:图片21 普通破纪录测试结果图图片22 普通输入纪录图图片23 最终成绩记录图(3)困难游戏过程和显示图片如图24:图24 困难难度游戏进行图7、 附录(源码)Arg.javapublic interface Argpublic static final String path = background;public static final String rc = Game.rc;ButtonClick.javaimport java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JOptionPane;public class ButtonClick implements ActionListenerprivate JButton button;private point pint;private int row;private int cal;private int matrix;private GameOver gOver;private boolean end;public ButtonClick(JButton b, point p, int m, int r, int c, GameOver g)button = b;pint = p;matrix = m;row = r;cal = c;gOver = g;end = false;public void actionPerformed(ActionEvent e)if (end | !pint.neighbor(row, cal)return;int r = pint.getRow();int c = pint.getCal();buttonrc.setIcon(buttonrowcal.getIcon();buttonrowcal.setIcon(null);pint.set(row, cal);int t = matrixrc;matrixrc = matrixrowcal;matrixrowcal = t;end = gOver.judge();CardFrame.javaimport java.awt.BorderLayout;import java.awt.CardLayout;import java.awt.Container;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowEvent;import java.awt.event.WindowAdapter;import javax.swing.JButton;import javax.swing.JLabel;import javax.swing.JPanel;public abstract class CardFrame extends MenuFrameprivate CardLayout card;private Container con;protected JPanel panel = new JPanel(), new JPanel();public CardFrame()con = this.getContentPane();card = new CardLayout();con.setLayout(card);panel0.setLayout(null);JLabel label;label = new JLabel(请输入你的图片到);label.setBounds(10, 15, 190, 30);panel0.add(label);label = new JLabel(背景图片文件夹。n);label.setBounds(10, 30, 190, 45);panel0.add(label);label = new JLabel(单击选择-背景图片);label.setBounds(10, 50, 190, 65);panel0.add(label);label = new JLabel(选择图片。n);label.setBounds(10, 65, 190, 80);panel0.add(label);label = new JLabel(接着, 单击 开始-新游戏 可以);label.setBounds(10, 85, 190, 100);panel0.add(label);label = new JLabel(开始游戏。);label.setBounds(10, 100, 190, 115);panel0.add(label);panel1.setLayout(new BorderLayout();JButton button = new JButton(继 续);button.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)FrameGetFocus(););panel1.add(button, BorderLayout.CENTER);con.add(panel0, 游戏);con.add(panel1, 暂停);card.show(con, 游戏);this.addWindowListener(new WindowAdapter()public void windowDeactivated(WindowEvent e)FrameLostFocus(););protected void nextCard()card.next(con);protected abstract void FrameLostFocus();protected abstract void FrameGetFocus();GameOver.javaimport java.util.Date;public class GameOverprivate boolean
展开阅读全文