-1-南京邮电大学计算机学院2014/2015学年第1学期《JAVA语言》课程期末考核报告课题代号(单选)□课题1□课题2□课题3课题名称:拼图游戏小组成员人数(单选)□1人□2人□3人□4人小组成员名单(学号和姓名):(1)学号姓名(2)学号姓名(3)学号姓名(4)学号姓名课题实现采用的开发工具(如为其他,请填写具体工具名称)□NetBeans□Eclipse□JDK命令行□其他______________课题实现采用的操作系统(如为其他,请填写操作系统名称)□MicrosoftWindows□Unix□Linux□其他__________________课题实现形式(如为PC桌面应用程序之外的其他形式请填写)___________课题完成时间:_______2014年12月28日________________________对应提交的电子文档文件夹名称(准确填写):_______________________________________________________________===================以下部分为教师填写区,请勿填写=======================评阅编号:()-()成绩评定:软件运行______软件基本功能_______软件提高功能______软件部分成绩________文档结构______文档理论___________文档撰写__________文档部分成绩________总成绩_____________备注____________________________________________________________________-2-一、游戏要求①基本要求:在游戏界面显示一幅完整图片,点击游戏开始后该图片自动被分割为指定的M*N(其中M和N分别为图块矩阵的行和列,例如3x3=9块,4x5=20块)个图片小方块并随机散布在游戏界面中,使用鼠标拖动小方块进行拼接,正确归位的方块将被固定,直到全部图片还原,游戏结束。②提高要求:可以有多张图片供游戏者选择;实现倒计时功能;可以给游戏者提供提示功能;实现游戏难度的自适应(例如M,N数值的自适应算法和小图块的散布算法),即在初始时以及对游戏水平低的人而言游戏应该比较容易,对水平高的人游戏应随之增加难度;游戏画面的精细完善,有最佳的动画以及声音效果。二、分析与总体设计(1)、拼图游戏需要解决的问题有:1、图片的读取2、图片的分割3、图片分割后打乱位置4、图片缩放作为预览图适应界面大小(不同的图片大小统一)5、分割后的图片移动6、图片都恢复原位后判断拼图完成7、主界面的整体布局还有菜单栏的设置(2)初步设计的流程图:JFramesplitImagesetpicturecheckrandarryJigsawactionPerformedRun-3-(3)各部分主要作用:JFrame:主界面的设计splitImage:图片缩放和图片的分割setpicture:图片位置和将图片放入按钮之中check:判断游戏是否完成图片是否回归原位randarry:产生随机数组用于打乱图片ActionListener:注册事件每个组件事件的具体内容,其中移动图片的机制是将一个按钮设置为null;所以当非空按钮边有一个空按钮时将其中的图片交换。三、算法分析最初设计游戏的想法是利用按钮,将图片添加到每个按钮之中然后移动图片将相邻的按钮中的图片进行交换,再定义一个int变量用来记录步数。图片的分割中利用Graphics绘制一个指定大小的区域,然后将图片中的一部分绘制到区域中再用一个图像数组保存,此种方法即可以分割图片也可以压缩放大图片。打乱图片所利用的是随机数,由于每个分割后的图片都是存放在数组中的所以可以利用数组的下标再利用随机数将图片随机加入到按钮之中。当选择难度时定义了(n,m)所以直接将这两个变量的值换掉即可,需要注意的是每次选择难度之后都要先清除按钮中的事件,然后再重新初始化每个按钮。四、详细设计1、Jigsaw类(1)、成员变量成员变量名变量类型说明menu1-3JMenu菜单栏item1-6JMenuItem菜单选项lvl1-3JRadioButtonMenuItem难度等级选择labelstate,labelstepJLabel步数,状态标签filenameString图片文件名preimage[][]ImageIcon预览图n,m,width,heightint分割n*m,每块高宽btn[][],starJButton按钮数组,开始按钮picImageIcon图片preButtonJButton存放预览图的按钮(2)、方法-4-方法名功能备注setpicture设置图片位置和将图片放入按钮中该方法中还涉及到按钮图片的初始化,图片分割splitImage图片的分割和缩放用到Graphics类分割图片和对图片的缩放checkBoolean型判断是否完成拼图返回truerandarry生成随机数组用于分割后的图片打乱actionPerformed组件事件的重写即具体化包含所有按钮还有所有菜单条菜单选项2、Run主函数创建Jigsaw类的具体实例;运行整个程序。五、具体代码(1)、Jigsaw.javaimportjava.awt.*;importjavax.swing.*;importjava.awt.event.*;//程序主代码classJigsawextendsJFrameimplementsActionListener{JMenuBarmenubar=newJMenuBar();//创建菜单条JMenumenu1=newJMenu(操作);//菜单条JMenumenu2=newJMenu(设置);JMenumenu3=newJMenu(帮助);//菜单中的选项JMenuItemitem1=newJMenuItem(重新开始);JMenuItemitem2=newJMenuItem(退出游戏);JMenuItemitem3=newJMenuItem(选择图片);JMenuitem4=newJMenu(难度设置);JMenuItemitem5=newJMenuItem(关于我们);JMenuItemitem6=newJMenuItem(游戏说明);//单选菜单JRadioButtonMenuItemlvl1=newJRadioButtonMenuItem(简单),lvl2=newJRadioButtonMenuItem(中等),lvl3=newJRadioButtonMenuItem(困难);//原始图片Stringfilename=a.jpg;ImageIconpreimage=null;JButtonprebutton=null;//初始化难度intn=3,m=3;intwidth=100,height=100;//拼图步数初始化intstep=0;JLabellabelstep=newJLabel(步数:0步);JLabellabelstate=newJLabel(状态:未开始);JButtonstar=newJButton(开始游戏);-5-//图片控件设置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();}//图片切割和缩放publicImage[]splitIamge(Stringfile,introw,intcol){Imaget=newImageIcon(file).getImage();intw=t.getWidth(this)/row;inth=t.getHeight(this)/col;returnsplitImage(t,row,col,w,h);}publicImage[]splitImage(Stringfile,introw,intcol,intw,inth){Imaget=newImageIcon(file).getImage();returnsplitImage(t,row,col,w,h);-6-}publicImage[]splitImage(Imaget,introw,intcol,intw,inth){Image[]p=newImage[row*col];try{for(inti=0;irow*col;i++){p[i]=createImage(w,h);Graphicsg=p[i].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(Exceptione){}returnp;}//图片位置设置publicvoidsetpicture(){labelstate.setText(状态:未开始(设置中选图片));step=0;labelstep.setText(步数:+step+步);width=350/n;height=350/m;Image[]a=splitImage(filename,1,1,140,140);//缩放preimage=newImageIcon(a[0]);//预览图if(prebutton==null){prebutton=newJButton(preimage);}elseprebutton.setIcon(preimage);prebutton.setBounds(200,5,140,140);this.add(prebutton);//图片分割pic=newImageIcon[n*m];if(btn==null)btn=newJButton[n][m];Image[]t=splitImage(filename,n,m,width,height);