拼图游戏报告.doc_第1页
拼图游戏报告.doc_第2页
拼图游戏报告.doc_第3页
拼图游戏报告.doc_第4页
拼图游戏报告.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

. 南京邮电大学计算机学院 20142015学年第1学期 JAVA语言课程期末考核报告 课题代号(单选)课题1 课题2 课题3 课题名称: 拼图游戏 小组成员人数(单选)1人 2人 3人 4人 小组成员名单(学号和姓名):(1)学号 姓名 (2)学号 姓名 (3)学号 姓名 (4)学号 姓名 课题实现采用的开发工具(如为其他,请填写具体工具名称) NetBeans Eclipse JDK命令行 其他_课题实现采用的操作系统(如为其他,请填写操作系统名称)Microsoft Windows Unix Linux 其他_课题实现形式(如为PC桌面应用程序之外的其他形式请填写)_ 课题完成时间:_2014年12月28日_ 对应提交的电子文档文件夹名称(准确填写):_=以下部分为教师填写区,请勿填写=评阅编号:( )( )成绩评定:软件运行_软件基本功能_软件提高功能_ 软件部分成绩_文档结构_文档理论_文档撰写_ 文档部分成绩_ 总成绩_备注_一、 游戏要求 基本要求:在游戏界面显示一幅完整图片,点击游戏开始后该图片自动被分割为指定的M*N(其中M和N分别为图块矩阵的行和列,例如3x3=9块,4x5=20块)个图片小方块并随机散布在游戏界面中,使用鼠标拖动小方块进行拼接,正确归位的方块将被固定,直到全部图片还原,游戏结束。 提高要求:可以有多张图片供游戏者选择;实现倒计时功能;可以给游戏者提供提示功能;实现游戏难度的自适应(例如M,N数值的自适应算法和小图块的散布算法),即在初始时以及对游戏水平低的人而言游戏应该比较容易,对水平高的人游戏应随之增加难度;游戏画面的精细完善,有最佳的动画以及声音效果。二、 分析与总体设计(1)、拼图游戏需要解决的问题有:1、 图片的读取2、 图片的分割3、 图片分割后打乱位置4、 图片缩放作为预览图适应界面大小(不同的图片大小统一)5、 分割后的图片移动6、 图片都恢复原位后判断拼图完成7、 主界面的整体布局还有菜单栏的设置JFramesplitImagesetpicturecheckrandarryJigsawactionPerformedRun(2)初步设计的流程图:(3)各部分主要作用:JFrame:主界面的设计splitImage:图片缩放和图片的分割setpicture:图片位置和将图片放入按钮之中check:判断游戏是否完成图片是否回归原位randarry:产生随机数组用于打乱图片ActionListener:注册事件每个组件事件的具体内容,其中移动图片的机制是将一个按钮设置为null;所以当非空按钮边有一个空按钮时将其中的图片交换。三、 算法分析最初设计游戏的想法是利用按钮,将图片添加到每个按钮之中然后移动图片将相邻的按钮中的图片进行交换,再定义一个int变量用来记录步数。图片的分割中利用Graphics绘制一个指定大小的区域,然后将图片中的一部分绘制到区域中再用一个图像数组保存,此种方法即可以分割图片也可以压缩放大图片。打乱图片所利用的是随机数,由于每个分割后的图片都是存放在数组中的所以可以利用数组的下标再利用随机数将图片随机加入到按钮之中。当选择难度时定义了(n,m)所以直接将这两个变量的值换掉即可,需要注意的是每次选择难度之后都要先清除按钮中的事件,然后再重新初始化每个按钮。四、 详细设计1、 Jigsaw类(1)、成员变量成员变量名变量类型说明menu1-3JMenu菜单栏item1-6JMenuItem菜单选项lvl1-3JRadioButtonMenuItem难度等级选择labelstate,labelstepJLabel步数,状态标签filenameString图片文件名preimageImageIcon预览图n,m,width,heightint分割n*m,每块高宽btn,starJButton按钮数组,开始按钮picImageIcon图片preButtonJButton存放预览图的按钮(2)、方法方法名功能备注setpicture设置图片位置和将图片放入按钮中该方法中还涉及到按钮图片的初始化,图片分割splitImage图片的分割和缩放用到Graphics类分割图片和对图片的缩放checkBoolean型判断是否完成拼图返回truerandarry生成随机数组用于分割后的图片打乱actionPerformed组件事件的重写即具体化包含所有按钮还有所有菜单条菜单选项2、 Run主函数创建Jigsaw类的具体实例;运行整个程序。五、 具体代码(1)、Jigsaw.javaimport java.awt.*;import javax.swing.*;import java.awt.event.*;/程序主代码class Jigsaw extends JFrame implements ActionListener JMenuBar menubar=new JMenuBar();/创建菜单条JMenu menu1=new JMenu(操作);/菜单条JMenu menu2=new JMenu(设置);JMenu menu3=new JMenu(帮助);/菜单中的选项JMenuItem item1=new JMenuItem(重新开始);JMenuItem item2=new JMenuItem(退出游戏);JMenuItem item3=new JMenuItem(选择图片);JMenu item4=new JMenu(难度设置);JMenuItem item5=new JMenuItem(关于我们);JMenuItem item6=new JMenuItem(游戏说明);/单选菜单JRadioButtonMenuItem lvl1=new JRadioButtonMenuItem(简单), lvl2=new JRadioButtonMenuItem(中等), lvl3=new JRadioButtonMenuItem(困难);/原始图片String filename=a.jpg;ImageIcon preimage=null;JButton prebutton=null;/初始化难度int n=3,m=3;int width=100,height=100;/拼图步数初始化int step=0;JLabel labelstep=new JLabel(步数:0步);JLabel labelstate=new JLabel(状态:未开始);JButton star=new JButton(开始游戏);/图片控件设置ImageIcon pic=null;JButton btn=null;Rectangle p=null;/主程序Jigsaw()setTitle(拼图游戏);setName(拼图游戏);setBounds(400,100,400,550);setLayout(null);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);labelstep.setBounds(10,10,100,50);labelstate.setBounds(10,30,200,50);star.setBounds(25,70,140,30);this.add(labelstep);this.add(labelstate);this.add(star);/菜单显示menubar.add(menu1);menubar.add(menu2);menubar.add(menu3);menu1.add(item1);menu1.add(item2);menu2.add(item3);menu2.add(item4);menu3.add(item5);menu3.add(item6);item4.add(lvl1);item4.add(lvl2);item4.add(lvl3);lvl1.setSelected(true);item1.addActionListener(this);item2.addActionListener(this);item3.addActionListener(this);item5.addActionListener(this);item6.addActionListener(this);lvl1.addActionListener(this);lvl2.addActionListener(this);lvl3.addActionListener(this);star.addActionListener(this);this.setJMenuBar(menubar);validate();setVisible(true);setResizable(false);setpicture();/图片切割和缩放public Image splitIamge(String file,int row,int col)Image t=new ImageIcon(file).getImage();int w=t.getWidth(this)/row;int h=t.getHeight(this)/col;return splitImage(t,row,col,w,h);public Image splitImage(String file,int row,int col,int w,int h)Image t=new ImageIcon(file).getImage();return splitImage(t,row,col,w,h);public Image splitImage(Image t,int row,int col,int w,int h)Image p=new Imagerow*col;tryfor(int i=0;irow*col;i+)pi=createImage(w,h);Graphics g=pi.getGraphics();g.translate(-i%col)*w,(-i/col)*h);g.drawImage(t,0,0,w*row,h*col,0,0,t.getWidth(this),t.getHeight(this),this);catch(Exception e)return p;/图片位置设置public void setpicture()labelstate.setText(状态:未开始(设置中选图片));step=0;labelstep.setText(步数:+step+ 步);width=350/n;height=350/m;Imagea=splitImage(filename,1,1,140,140);/缩放preimage=new ImageIcon(a0);/预览图if(prebutton=null)prebutton=new JButton(preimage);elseprebutton.setIcon(preimage);prebutton.setBounds(200,5,140,140);this.add(prebutton);/图片分割pic=new ImageIconn*m;if(btn=null)btn=new JButtonnm;Image t=splitImage(filename,n,m,width,height);/图片分割成n*m型/按钮事件添加for(int i=0;i n*m;i+)int x1=i/m;int y1=i%m;if(btnx1y1=null)btnx1y1=new JButton();btnx1y1.setBounds(y1*width+25,x1*height+150,width,height);/控件的位置具体设置btnx1y1.addActionListener(this);this.add(btnx1y1);int temp=randarray(n*m);for(int i=0;in*m;i+)/image放入imageicon中pici=new ImageIcon(ti);for(int i=1;in*m;i+)/打乱图片btni/mi%m.setIcon(pictempi);btn00.setIcon(null);this.repaint();/生成随机数组public int randarray(int n)int a=new intn;for(int i=0;in;i+)ai=i;for(int i=1;in;i+)int t;int s=(int)(Math.random()*(n-1)+1);t=ai;ai=as;as=t;return a;/注册事件public void actionPerformed(ActionEvent e)/重新开始if(e.getSource()=item1)for(int i=0;in*m;i+)int x2=i/m;int y2=i%m;btnx2y2.removeActionListener(this);/移除按钮事件setpicture();return;/退出游戏if(e.getSource()=item2)System.exit(0);/关于我们if(e.getSource()=item5)JOptionPane.showMessageDialog(this,制作人:* n2014年12月22日);/调用JOptionPane类对话框return;/游戏说明if(e.getSource()=item6)JOptionPane.showMessageDialog(this,游戏开始前现在游戏设置中选择图片,然后点击开始按钮开始游戏,n+ 游戏过程中可选择操作菜单中的重新开始。或者直接点击界面按钮重新开始!);return;/选择图片if(e.getSource()=item3)FileDialog f=new FileDialog(this,选择图片,FileDialog.LOAD);/调用FileDialog选择文件对话框f.setVisible(true);if(f.getFile()=null)return;filename=f.getDirectory()+f.getFile();for(int i=0;in*m;i+)int x2=i/m;int y2=i%m;btnx2y2.removeActionListener(this);Imagea=splitImage(filename,1,1,140,140);/缩放preimage=new ImageIcon(a0);if(prebutton=null)prebutton=new JButton(preimage);elseprebutton.setIcon(preimage);prebutton.setBounds(200,5,140,140);this.add(prebutton);pic=new ImageIconn*m;if(btn=null)btn=new JButtonnm;Image t=splitImage(filename,n,m,width,height);/图片分割成n*m型for(int i=0;in*m;i+)/image放入imageicon中pici=new ImageIcon(ti);for(int i=0;in*m;i+)/打乱图片btni/mi%m.setIcon(pici);return;if(e.getSource()=star)star.setText(重新开始);for(int i=0;in*m;i+)int x2=i/m;int y2=i%m;btnx2y2.removeActionListener(this);if(e.getSource()=star)setpicture();labelstate.setText(状态:开始);return;/难度事件if(e.getSource()=lvl1)/难度一:简单lvl1.setSelected(true);lvl2.setSelected(false);lvl3.setSelected(false);for(int i=0;in*m;i+)int x2=i/m;int y2=i%m;this.remove(btnx2y2);/移除按钮内容便于setpicture()函数重新建立n=m=3;btn=null;setpicture();return;if(e.getSource()=lvl2)/难度二:中等lvl1.setSelected(false);lvl2.setSelected(true);lvl3.setSelected(false);for(int i=0;in*m;i+)int x2=i/m;int y2=i%m;this.remove(btnx2y2);/移除按钮内容便于setpicture()函数重新建立n=m=4;btn=null;setpicture();return;if(e.getSource()=lvl3)/难度三:困难lvl1.setSelected(false);lvl2.setSelected(false);lvl3.setSelected(true);for(int i=0;in*m;i+)int x2=i/m;int y2=i%m;this.remove(btnx2y2);n=m=5;btn=null;setpicture();return;/图片移动事件for(int i=0;i0&btnx2-1y2.isVisible()&btnx2-1y2.getIcon()=null)btnx2-1y2.setIcon(btnx2y2.getIcon();btnx2y2.setIcon(null);step+;labelstep.setText(步数: +step+ 步);/下移if(x20&btnx2y2-1.isVisible()&btnx2y2-1.getIcon()=null)btnx2y2-1.setIcon(btnx2y2.getIcon();btnx2y2.setIcon(null);step+;labelstep.setText(步数: +step+ 步);/右移if(y2m-1&btnx2y2+1.isVisible()&btnx2y2+1.getIcon()=null)btnx2y2+1.setIcon(btnx2y2.getIcon();btnx2y2.setIcon(null);step+;labelstep.setText(步数: +step+ 步);btnx2y2.setBackground(null);/判断是否完成if(check()for(i=0;in*m;i+)int x3=i/m;int y3=i%m;btnx3y3.removeActionListener(this);/完成后清除所有事件btn00.setIcon(pic0);JOptionPane.showMessageDialog(this,恭喜你完成了游戏!n共走了+step+ 步);/判断游戏是否完成private boolean check()boolean a=true;for(int i=1;in*m;i+)int x1=i/m;int y1=i%m;if(btnx1y1.getIcon()!=null&btnx1y1.getIcon()=pici)elsea=false;return a;(2)、Run.javapublic class Run public static void main(String args)new Jigsaw();六、 测试及结果分析1、 打开程序之后的界面2、 选择图片及后界面 3、 游戏开始后界面(注意步数变化)4、 不同难度的界面 5、 游戏帮助对话框6、 游戏完成后七、 调试过程中的问题(1)、运行程序后分割的图片只有一张,只有分割图片的第一张,初步分析是认为setpicture()出现了问题然后在Image加入ImageIcon处设置了断点调试时发现在pic根本只有第一个图片的存在,所以回到splitImage()出调试最终确定是该方法中的g.translate(i%col)*w,(i/col)*h问题应是g.translate(-i%col)*w,(-i/col)*h)。(2)、初次运行程序后出现了布局上的问题,布局错乱并非想像中的那样。主要的问题是在设置按钮布局时出错。导致很多个按钮都堆积到了一起。(3)、当打开游戏之后选择图片后直接进行分割没有按照题目中的要求,先是打开图片显示完整的图片然后点击开始按钮之后再打乱图片。为此我们在选择图片事件下加入一段代码,如下: Imagea=splitImage(filename,1,1,140,140);/缩放preimage=new ImageIcon(a0);if(prebutton=null)prebutton=new JButton(preimage);elseprebutton.setIcon(preimage);prebutton.setBounds(200,5,140,140);this.add(prebutton);pic=new ImageIconn*m;if(btn=null)btn=new JButtonnm;Image t=splitImage(filename,n,m,width,height);/图片分割成n*m型for(int i=0;in*m;i+)/image放入imageicon中pici=new ImageIcon(ti);for(int i=0;in*m;i+)/打乱图片btni/mi%m.setIcon(pici);该段代码的作用是将分割后的图片没有进过随机数组而是直接添加到组件之中。(4)、最初分割图片,简单类分割正确,但是中等、困难最后一行无法分割。主要出现的问题是图片在布局时漏掉了最后一行。将setpicture()中的设置图片位置的for语句的条件更改一下即可。(5)、图片分割之后应该是要出现一个空的按钮,而且该按钮应该在最后将btn00添加进去组合成一个完整的图案但是最初这个空的按钮无法显示也就是说,一直都是所有的图片都存在。这里出现

温馨提示

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

评论

0/150

提交评论