JAVA拼图游戏课程设计.docx
- 文档编号:8617559
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:52
- 大小:4.28MB
JAVA拼图游戏课程设计.docx
《JAVA拼图游戏课程设计.docx》由会员分享,可在线阅读,更多相关《JAVA拼图游戏课程设计.docx(52页珍藏版)》请在冰豆网上搜索。
JAVA拼图游戏课程设计
学年论文
(JAVA面向对象程序设计2015-2016第二学期)
题 目:
JAVA课程设计
作 者:
陈炳宏
所在学院:
信息科学与工程学院
专业年级:
信息安全14-1
指导教师:
杨晴雯
职 称:
副教授
2016年6月4日
基于JAVA的拼图游戏的设计
摘要
拼图游戏是一款非常经典的小游戏,因为它比较简单有趣,老少皆宜。
拼图游戏的设计对每一个Java语言设计者进行语言提高和进阶都是一个很好的锻炼机会。
拼图游戏的设计比较复杂,它涉及面广、牵涉方面多,如果不好好考虑和设计,将难以成功开发出这个游戏。
在这个游戏的设计中,牵涉到图形界面的显示与更新、数据的收集与更新,并且在这个游戏的开发中,还要应用类的继承机制以及一些设计模式。
因此,如何设计和开发好这个拼图游戏,对于提高Java开发水平和系统的设计能力有极大的帮助。
在设计开发过程中,需要处理好各个类之间的继承关系,还要处理各个类相应的封装,并且还要协调好各个模块之间的逻辑依赖关系和数据通信关系。
关键词:
拼图游戏 Java语言 开发
ThedesignofJAVAsoftwarebasedonthepuzzle
Abstract:
Jigsawpuzzleisaveryclassicgame,becauseitiseasyandfun,botholdandyoung,aremoresuitable.
JigsawdesignlanguageforeachJavalanguagedesignerstoimproveandadvanceisanexcellentexerciseopportunities.Puzzledesignismorecomplex,itsscope,andinvolvesmanymore,ifyoudonotthinkanddesign,wouldbedifficulttosuccessfullydevelopedthisgame.Inthedesignofthegameinvolvesdisplayofthegraphicalinterfaceandupdating,dataiscollectedandupdated,andinthedevelopmentofthisgame,classinheritancemechanism,andsomedesignpatternsyouwanttoapply.Therefore,howtodesignanddevelopthisjigsawpuzzle,forraisingthelevelofJavadevelopment,andsystemdesigncapabilitiesareofgreathelp.Duringtheprocessofdesignanddevelopment,youneedtohandletheinheritancerelationshipsbetweentheclasses,alsohavetodealwitheachtypeofappropriatepackaging,andalsotocoordinatethevariouslogicaldependenciesbetweenmodulesanddatacommunication.
Keywords:
Jigsawpuzzle Javalanguage develop
课程设计题目:
基于JAVA的拼图游戏
一、需求分析
1.程序分析
本游戏是一个Java语言的拼图游戏,在eclipse上使用JAVA语言编写并且利用JavaSwing设计显示。
拼图中有一个格子是空的,其他格子内随机放置由目标图片切割成的若干个小图片,图片按照不同难度结合目标图片分辨率进行切割。
用户通过点击空位置中周围的任何非空图块来移动非空图块到空位置,一直重复直到拼回目标图片的样子后游戏成功,记录名次分数。
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难度难游戏图片
二、概要设计
1.拼图游戏流程图
图5JAVA拼图游戏框架图
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
该类用于新建窗口显示目标图像。
三、详细设计
1.建立MenuFrame菜单首页类
菜单首页的建立完成了以下设计,设置主页菜单结构、设置菜单位于桌面位置和退出方式、设置快捷键、点击事件选择难度,默认普通、添加开始子菜单点击事件好快捷键、添加难度选择子菜单项并调用点击事件、添加文件选择点击事件、关于菜单设置、图片预览点击事件设置更新,很好的构建了整个游戏的架构,下面列出该类的菜单结构和一些重要的方法代码:
(省略非关键代码,可在文末源代码查看)
publicabstractclassMenuFrameextendsJFrame{//设置主页菜单结构
.......
privateJMenu[]m={
newJMenu("开始(B)").......};
privateJMenu[]mm={
newJMenu("等级(L)").......};
publicMenuFrame(){//设置菜单位于桌面位置和退出方式
super("拼图游戏");addMenu();
.......
this.getToolkit().getScreenSize().width/3-this.getWidth()/3};
privatevoidaddMenu(){//设置快捷键
m[0].setMnemonic('B');initMenuBegin().......}
privatevoidmenuLevelClick(Stringnm){//点击事件选择难度,默认普通
type=3;if(nm.equals("困难")).......}
privatevoidinitMenuBegin(){//添加开始子菜单点击事件好快捷键
JMenuItem[]mI={
newJMenuItem("新游戏(N)").......};
mI[0].setMnemonic('N');
.......
mI[0].addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){menuNewClick();}});
mI[1],mI[2].......m[0].add(mI[0]);.......}
privatevoidinitMenuLevel(){//添加难度选择子菜单项并调用点击事件
JRadioButtonMenuItem[]mi={
newJRadioButtonMenuItem("困难").......};
for(inti=0;i<3;i++){
mi[i].addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
JRadioButtonMenuItemmi=(JRadioButtonMenuItem)e.getSource();
menuLevelClick(mi.getText());}});}.......}
publicvoidinitMenuBackground(){//添加文件选择点击事件
.......
File[]list=bkg.listFiles();intj=0;
for(inti=0;i if(! list[i].isFile()||list[i].isHidden())continue; mi=newJRadioButtonMenuItem(list[i].getName()); mi.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){.......}} privatevoidinitMenuAbout(){//关于菜单设置 JMenuItem[]mI={ newJMenuItem("帮助(H)"), newJMenuItem("关于(A)")}....... mI[0].addActionListener(newActionListener().......} publicvoidupdateMenuBegin(){//图片预览点击事件设置更新 if(! update){{m[0].remove (2);return;} JMenuItemmi=newJMenuItem("图片预览(S)"); mi.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){menuShowClick();); .......} 2.建立CardFrame首页说明类 首页说明类继承于首页菜单类,并加以完善,并且设置了聚集事件,以完成暂停和继续完成,最后定义聚焦事件为无限次。 下面列出该类的说明结构和一些重要的方法代码: (省略非关键代码,可在文末源代码查看) publicabstractclassCardFrameextendsMenuFrame{ //继承于首页菜单类,并加以完善 ....... publicCardFrame(){//设置首页提示标签 ....... JLabellabel; label=newJLabel("请输入你的图片到"); label.setBounds(10,15,190,30); ....... JButtonbutton=newJButton("继续"); button.addActionListener(newActionListener(){//设置聚集事件,以完成暂停和继续 publicvoidactionPerformed(ActionEvente){ FrameGetFocus();}}); panel[1].add(button,BorderLayout.CENTER); con.add(panel[0],"游戏"); con.add(panel[1],"暂停"); card.show(con,"游戏"); this.addWindowListener(newWindowAdapter(){ publicvoidwindowDeactivated(WindowEvente){ FrameLostFocus();}});} protectedvoidnextCard(){//完成无限次聚焦事件 card.next(con);} protectedabstractvoidFrameLostFocus(); protectedabstractvoidFrameGetFocus();} 3.建立ShowImage目标图显示类 目标图片显示类主要调用前面选择的目标图片,并且新建标签显示出来。 publicclassShowImageextendsJFrame//调用前面选择的目标图片,新建标签显示出来{ publicShowImage(Stringfn){ super("预览"); Containerc=getContentPane(); c.setLayout(newFlowLayout()); Stringpath=Arg.path+"/"+fn; ImageIconimage=newImageIcon(path); c.add(newJLabel(image)); setDefaultCloseOperation(HIDE_ON_CLOSE); setSize(image.getIconWidth()+10,image.getIconHeight()+30); setVisible(true);}} 4.建立Grades分数记录类 分数纪录类实现了以下功能: 首先用Data来新建数组,然后构造方法,用于后面接收前面穿过来的难度,接着新建文档用于存放记录,并且初始化成绩排名读取文件现有的记录,然后判断该难度下游戏结束后,时间和步数是否最少,是否打破纪录,接着显示更新后的排名,最后调用显示现有记录下面列出该类的存储显示结构和一些重要的方法代码: (省略非关键代码,可在文末源代码查看) classData{//用Data来新建数组 publicStringname;publicinttime;publicintstep;} publicclassGrades{ privatePuzzleapp; privateData[]data={ .......}; publicGrades(Puzzlem){//构造方法,用于后面接收前面穿过来的难度 app=m;} privatevoidcreatData(){//新建文档用于存放记录,并且初始化成绩排名 try{ Filefile=newFile(Arg.rc); if(file.exists()) return; file.createNewFile(); PrintStreamfout=newPrintStream(Arg.rc); .......fout.close();} catch(Exceptione){.......}} privatevoidreadData(){//读取文件现有的记录 try{ Filefile=newFile(Arg.rc); Scannercin=newScanner(file); data[0].name=cin.next(); ....... catch(Exceptione){ JOptionPane.showMessageDialog(null,Arg.rc+"can'tread! ");}} publicvoidset(intt,ints){//用于改难度下游戏结束后,时间和步数是否最少,是否打破纪录 inttype=app.getTypee(); creatData(); readData(); if(t>data[type].time||(t==data[type].time&&s>=data[type].step)) return; data[type].name=JOptionPane.showInputDialog(null,"你打破了记录! \n请输入你的名字。 "); try{//显示更新后的排名 PrintStreamf=newPrintStream(Arg.rc); f.printf("%s%d%d\n",data[0].name,data[0].time,data[0].step);.......} catch(Exceptione){.......} show();} publicvoidshow(){//调用显示现有记录 try{ creatData(); readData(); ....... JOptionPane.showMessageDialog(null,title+h+n+e);} catch(Exceptione){.......}}} 5.建立split原图划分类移动点击事件类 原图花分类里,首先按照难度不同,根据不同的尺寸进行原图划分判断如果没被划分过,则对图案划分并返回,接着新建图片文件夹,并返回已建立,最后引用选中的图片文件夹里的图片,并且根据难度不同,对图片进行划分,并且写入到图片数组BufferedImage[][]中去。 publicclassSplit{//建立划分类,按照难度不同,根据不同的尺寸进行原图划分 publicstaticfinalintHARD=0; publicstaticfinalintNORMAL=1; publicstaticfinalintEASY=2; publicstaticfinalStringpvo="png"; publicstaticfinalint[]level={ 100,160,200}; ....... publicstaticSplitget(){//判断如果没被划分过,则对图案划分并返回.......} publicbooleanset(Stringfn){//新建图片文件夹,并返回已建立 filename=fn; path=Arg.path+"/"+filename; Filefile=newFile(path); returnfile.exists();} publicBufferedImage[][]divid(inttype){//引用选中的图片文件夹里的图片,并且根据难度不同,对图片进行划分,并且写入到图片数组BufferedImage[][]中去。 try{ BufferedImageimage=ImageIO.read(newFile(path)); intlen=level[type]; intcal=image.getWidth()/len; introw=image.getHeight()/len; BufferedImage[][]subimage=newBufferedImage[row][cal]; for(inti=0;i for(intj=0;j subimage[i][j]=image.getSubimage(j*len,i*len,len,len);returnsubimage;}.......} 6.建立ButtonClick拼图移动点击事件类 ButtonClick拼图移动点击事件类先将按钮点击事件链接接口,然后判断点击的非空按钮周围是否为空,如果为空就先把该非空按钮设置图案为空,然后将空白的按钮设置为刚才的图案,并且判断是否成功。 publicclassButtonClickimplementsActionListener{//按钮点击事件链接接口 privateJButton[][]button; privatepointpint; privateintrow; privateintcal; privateint[][]matr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 拼图游戏 课程设计