拼图游戏-java课设-含可运行程序_第1页
拼图游戏-java课设-含可运行程序_第2页
拼图游戏-java课设-含可运行程序_第3页
拼图游戏-java课设-含可运行程序_第4页
拼图游戏-java课设-含可运行程序_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

拼图游戏课程设计的目的本次课程设计的主要目的是设计一个拼图游戏。在这个拼图游戏中有自由选择图片的功能,可以根据自己的兴趣选择喜欢的图片进行游戏,为了减小难度,在游戏中参加了数字提示功能,在游戏界面中,左半局部是游戏区域,右半局部那么是原图预览局部,游戏开始时,系统会随机分配一块缺失,并将图片顺序打乱,用户可以根据原始图片进行移动复原过程。在游戏中会进行步数和时间的统计,以供玩家进行比照,本游戏完全通过鼠标来操作,简单上手。2.设计方案论证2.1设计思路2.1.1功能本次课程设计主要是用Java语言编写程序实现一个拼图游戏。该拼图游戏系统共包括3个java源文件和一个图片文件夹。这是个功能比拟齐全的拼图游戏,实现的是将图片分解,取出最右下角的图片,然后将剩余图片随即打乱,最关键的不用自己手动切割图片,再进行加载。而是应用类方法自动进行图片的加载,方便了用户的使用。该拼图游戏结合了许多元素,可以图片切割,同时还有游戏时间和步数的记录。在拼图时首先把图片添加到文件夹“java编程〞的目录下,程序会自动获取该目录下的所有图片文件,并加载到游戏中,进行切割后,显示在拼图按钮上。拼图结束时可以显示游戏成绩和记录的存档。开发环境本次设计的开发运行环境是:JCreater2.2设计方法在设计拼图游戏时,需要编写3个Java源文件:MyMainFrame.java、MyCanvas.java、Cell.java。MyMainFrame.java主类该类创立拼图游戏的主窗口,该类含有main方法,是程序的入口,该类是JFrame类的子类,定义了各个组件的动作并为窗口设置图标,MyMainFrame类的成员变量中有8种重要的变量及方法,choicePicL、picName、jcbo1、name、stepInfor、timeInfor、situation、panel1。MyCanvas.java该类是JPanel类的子类,实现了初始化游戏界面,创立并添加组件,盛放游戏信息的面板内容,声明6个静态方法,serialVersionUID、hasAddActionListener、Cell、cellNull、pictureID、stepNum。Cell.java 该类是JButton类的子类,加载打乱的图块进行初始化游戏,负责图快的移动。在本程序中各个类的关系如图1所示。MyMainFrameMyMainFrameCellMyCanvas图1功能模块图2.3程序流程图开始开始初始化游戏界面选择图片加载图片移动图片拼图正确?结束YN图2程序流程图2.4类、方法、属性说明2.4.1成员变量表1MyMainFrame成员变量表序号名称变量类型功能1choicePicLJLabel确定选择的图片2picNameString确定选择的图片3jcbo1JComboBox确定选择的图片4nameJTextField图片名称5stepInforJTextField玩家已走步数6timeInforJTextField时间7situationJTextField图片载入8startJRadioButton开始按钮9addPicNumJRadioButton数字提示10clearPicNumJRadioButton去除提示方法表2MyMainFrame方法表序号名称功能备注1MyMainFrame()完成窗口的初始化构造方法2actionPerformed(ActionEvente)游戏完成图接口方法3itemStateChanged(ItemEventarg0)下拉列表项接口方法4paintComponent(Graphicsg)重绘容器组件里的所有组件接口方法5mouseClicked(MouseEventarg0)单击鼠标发生事件接口方法6mouseEntered(MouseEventarg0)鼠标进入指定区域发生事件接口方法7ouseExited(MouseEventarg0)鼠标离开指定区域发生事件接口方法8mousePressed(MouseEventarg0)按下鼠标时发生事件接口方法9mouseReleased(MouseEventarg0)松开鼠标时发生事件接口方法10Main()程序运行的人口方法入口方法MyCanvas.java类〔1〕成员变量表3MyCanvas成员变量表序号名称变量类型备注1pictureIDint当前选择图片代号2stepNumInt游戏已走步数方法表4MyCanvas方法表序号名称功能备注1reLoadPictrue1()重新加载图片除去数字提示2reLoadPictrue2()重新加载图片除去数字提示3isFinish()检查拼图判断是否拼成4Start()重新排列对方格且将顺序打乱5mouseClicked(MouseEventarg0)单击鼠标发生事件接口方法6mouseEntered(MouseEventarg0)鼠标进入指定区域发生事件接口方法7mouseExited(MouseEventarg0)鼠标离开指定区域发生事件接口方法8mousePressed(MouseEventarg0)按下鼠标时发生事件接口方法9mouseReleased(MouseEventarg0松开鼠标时发生事件接口方法Cell.java类〔1〕成员变量表5Cell方法表序号名称变量类型备注1serialVersionUIDfinal值是1L〔2〕方法表6Cell方法表序号名称功能1Cell(Iconicon)规定拼图小块大小2Cell(Stringn,Iconicon)实际为ICON3move(Stringdirection,intsleep)实现拼图小块的移动3设计结果与分析将3个Java源文件:MyMainFrame.java、MyCanvas.java、Cell.java,以及所需要的名为imaage的文件夹的图像文件保存到E盘下的同一目录“java编程〞文件夹中。分别编译这3个Java源文件,或运行“javac*.java〞命令,编译全部的源文件,然后运行主类,即运行MyMainFrame.java类。通过运行结果图可以看到在界面上方有一个按钮区,其中有数字提示,对于初玩者可以单击一下列图块上就会出现数字提示,想去掉提示单击去除提示即可,image是个下拉框,根据自己的兴趣爱好选择自己喜欢的拼图进行游戏,单击start开始游戏。在界面下方有一行游戏状态栏,显示了图片名称,步数,时间,以及状态,运行结果图3所示。图3游戏初始界面单击start按钮开始游戏,界面自动加载并切割图片,玩家此时就可以通过鼠标来完成游戏了,单击空白区域旁边的图快就会移动,移动方向是向着空缺块移动,也就是说孔雀块四周都是可移动的块,而不是紧邻空缺块的图快那么不能移动,结果如图4所示。图4开始后的界面当玩家想有提示信息时可单击数字提示,单击后会在图块上出现带有顺序的数字,玩家可以通过数字更加容易的完成拼图游戏,如图5所示。如果不想显示数字提示那么可单击去除提示,结果那么如同上图4所示。图5数字提示界面图在游戏中,玩家每移动一块图快,状态栏中的步数就会自动加1,并在游戏状态中显示出来,游戏完成时会弹出一个对话框,提示玩家完成拼图游戏并显示所用步数,完成游戏结果图如图6所示。图6完成游戏对话框玩家假设想换一个图片进行游戏,那么可通过image下拉框实现,玩家可以根据自己的兴趣爱好进行选择,如图7所示图7image下拉框例如可以选择下拉框中的唯美,运行界面那么如图8所示图8唯美拼图界面4.设计体会通过一周的JAVA课程设计,是我对JAVA语言有个更深的一层理解,这一学期的学习只是为我们引导了一个学习的方向,更深入的知识还需要我们自己去学习,而本次课程设计才让我体会到学习JAVA语言的困难和解决困难后的乐趣,开始对课程设计毫无头绪,题目不知道定什么,本人对游戏比拟感兴趣,最后在坦克大战、俄罗斯方块、象棋和拼图游戏中选择了拼图游戏,个人觉得拼图游戏比拟新颖,而且可以上传好看的图片,在枯燥的编程过程中增加了趣味性,使编程不再那么乏味,在本次拼图游戏中,我设计了数字提示功能,提高了游戏的友好性。在程序运行时我遇到了相当大的困难,由于是三个源文件,还有一个image的文件夹,最初忘记应该把文件夹放在E盘下而费了好大周折,改正后,又忘记image文件夹应该放到源文件上级目录中,又折腾很久,最后在询问同学后终于解决了这个问题,成功运行出来了,当时心中的喜悦没人能够理解,总之课程设计在设计完成以后才会体验到快乐,并且锻炼了自己的动手和自学能力。5.参考文献[1]陈国君,陈磊,刘洋.Java2程序设计根底[M].北京:清华大学出版社,2007.11:221-286[2]朱站立,沈伟.Java程序设计实用教程[M].北京:电子工业出版社,2006.10:134-187[3]朱福喜,尹为民,余振坤等.Java语言与面向对象程序设计[M].武汉:武汉大学出版社,2006.1:97-128[4]张思民,梁维娜.Java程序设计实践教程[M].北京:清华大学出版社,2006.8:24-686.附录〔1〕//MyMainFrame类importjava.awt.BorderLayout;importjava.awt.Color;importjava.awt.FlowLayout;importjava.awt.Graphics;importjava.awt.GridLayout;importjava.awt.Image;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.ItemEvent;importjava.awt.event.ItemListener;importjava.awt.event.MouseEvent;importjava.awt.event.MouseListener;importjavax.swing.ButtonGroup;importjavax.swing.ImageIcon;importjavax.swing.JButton;importjavax.swing.JComboBox;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JPanel;importjavax.swing.JRadioButton;importjavax.swing.JTextField;importjavax.swing.border.TitledBorder;publicclassMyMainFrameextendsJFrameimplementsMouseListener{ /** * */ privatestaticfinallongserialVersionUID=1L; publicstaticMyCanvasmyCanvas; //选择图片复选框 privateJLabelchoicePicL=newJLabel("Image:"); privateString[]picName={"鲜橙","小企鹅","小猫","天使","SARAEVANS","唯一","唯美","小女孩儿","海报","雪人儿","倾听","范冰冰"};; privateJComboBoxjcbo1=newJComboBox(picName); JButtonstart; //盛放游戏信息的面板内容,〔Framesouth〕 privateJTextFieldname=newJTextField("图片名称:picture1"); publicstaticJTextFieldstepInfor=newJTextField("步数:0"); privateJTextFieldtimeInfor=newJTextField("时间:00:00:00"); privateJTextFieldsituation=newJTextField("状态:图片已载入"); //数字提示单项选择按钮 publicJRadioButtonaddPicNum; publicJRadioButtonclearPicNum; publicMyMainFrame(){ myCanvas=newMyCanvas(); this.setTitle("大拼图1"); this.setLocation(300,200); this.setSize(1000,770); this.setResizable(false); this.setDefaultCloseOperation(3); //放置按钮面板〔Framenorth〕 JPanelpanel1=newJPanel(); FlowLayoutflowLayout=newFlowLayout(); flowLayout.setAlignment(FlowLayout.LEFT); panel1.setLayout(flowLayout); start=newJButton("start"); addPicNum=newJRadioButton("数字提示",false); clearPicNum=newJRadioButton("去除提示",true); ButtonGroupaddNumGroup=newButtonGroup(); addNumGroup.add(addPicNum); addNumGroup.add(clearPicNum); panel1.setBackground(Color.pink); start.setBackground(Color.pink); addPicNum.setBackground(Color.pink); clearPicNum.setBackground(Color.pink); panel1.add(addPicNum); panel1.add(clearPicNum); panel1.add(choicePicL); panel1.add(jcbo1); panel1.add(start); panel1.setBorder(newTitledBorder("按钮区")); this.setLayout(newBorderLayout()); this.add(panel1,BorderLayout.NORTH); //盛放游戏信息的面板(Framesouth) JPanelpanel2=newJPanel(); name.setEditable(false); stepInfor.setEditable(false); timeInfor.setEditable(false); situation.setEditable(false); panel2.setLayout(newGridLayout(1,4)); panel2.add(name); panel2.add(stepInfor); panel2.add(timeInfor); panel2.add(situation); //盛放原尺寸预览图面板 finalpreviewPanel2panel4=newpreviewPanel2(); panel2.setBorder(newTitledBorder("游戏状态")); myCanvas.setBorder(newTitledBorder("拼图区")); panel4.setBorder(newTitledBorder("原图预览")); //盛放拼图和panel6的面板 JPanelpanel7=newJPanel(); panel7.setLayout(newGridLayout(1,2)); panel7.add(myCanvas,BorderLayout.WEST); panel7.add(panel4,BorderLayout.EAST); this.setLayout(newBorderLayout()); this.add(panel1,BorderLayout.NORTH); this.add(panel7,BorderLayout.CENTER); this.add(panel2,BorderLayout.SOUTH); this.setVisible(true); start.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ //TODOAuto-generatedmethodstub myCanvas.Start(); MyCanvas.stepNum=0; situation.setText("状态:游戏进行中。"); stepInfor.setText("步数:"+MyCanvas.stepNum); } }); addPicNum.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ myCanvas.reLoadPictrue2(); } }); clearPicNum.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ myCanvas.reLoadPictrue1(); } }); jcbo1.addItemListener(newItemListener(){ publicvoiditemStateChanged(ItemEventarg0){ //TODOAuto-generatedmethodstub MyCanvas.pictureID=jcbo1.getSelectedIndex()+1; myCanvas.reLoadPictrue1(); MyCanvas.stepNum=0; stepInfor.setText("步数:"+MyCanvas.stepNum); panel4.repaint(); situation.setText("状态:图片已载入。"); name.setText("图片名称:"+jcbo1.getSelectedItem()); } }); }publicstaticvoidmain(String[]args){ //TODO自动生成方法存根 MyMainFramepintu=newMyMainFrame(); pintu.setVisible(true); }classpreviewPanel1extendsJPanel{ /** * */ privatestaticfinallongserialVersionUID=1L; publicpreviewPanel1(){ } protectedvoidpaintComponent(Graphicsg){ super.paintComponents(g); ImageIconpreview=newImageIcon("E:/java编程/image/"+MyCanvas.pictureID+".jpg"); Imageviewer=preview.getImage(); g.drawImage(viewer,0,0,200,100,this); }}classpreviewPanel2extendsJPanel{ /** * */ privatestaticfinallongserialVersionUID=1L; publicpreviewPanel2(){ } protectedvoidpaintComponent(Graphicsg){ super.paintComponents(g); ImageIconpreview=newImageIcon("E:/java编程/imaage/"+MyCanvas.pictureID+".jpg"); Imageviewer=preview.getImage(); g.drawImage(viewer,20,20,450,600,this); }}publicvoidmouseClicked(MouseEventarg0){ //TODOAuto-generatedmethodstub}publicvoidmouseEntered(MouseEventarg0){ //TODOAuto-generatedmethodstub}publicvoidmouseExited(MouseEventarg0){ //TODOAuto-generatedmethodstub}publicvoidmousePressed(MouseEventarg0){ //TODOAuto-generatedmethodstub}publicvoidmouseReleased(MouseEventarg0){ //TODOAuto-generatedmethodstub}}〔2〕//MyCanvas类importjava.awt.Graphics;importjava.awt.Image;importjava.awt.Rectangle;importjava.awt.event.MouseEvent;importjava.awt.event.MouseListener;importjavax.swing.Icon;importjavax.swing.ImageIcon;importjavax.swing.JOptionPane;importjavax.swing.JPanel;publicclassMyCanvasextendsJPanelimplementsMouseListener{ /** * */ privatestaticfinallongserialVersionUID=1L; publicstaticbooleanhasAddActionListener=false;//设置方格的动作监听器的标志位,TRUE为已经添加上动作事件,FALSE是尚未添加动作事件 publicstaticCellcell[];//定义方格 publicstaticRectanglecellNull;//定义空方格区域 publicstaticintpictureID=1;//当前选择的图片代号 publicstaticintstepNum=0; publicMyCanvas(){ this.setVisible(true); this.setLayout(null); cellNull=newRectangle(320,470,150,150);//空方格区域在第三行每三列 cell=newCell[12]; Iconicon; //为9个方格加载图片,并初使化坐标,形成三行三列 for(inti=0;i<4;i++){ for(intj=0;j<3;j++){ icon=newImageIcon("E:/java编程/imaage/"+pictureID+"_"+(i*3+j+1)+".jpg"); cell[i*3+j]=newCell(icon); cell[i*3+j].setLocation(j*150+20,i*150+20); this.add(cell[i*3+j]); } } //移除最后一个多余的方格 this.remove(cell[11]); } //中选择其它图形进行拼图时,需重新加载新图片,除去数字提示 publicvoidreLoadPictrue1(){ Iconicon; for(inti=0;i<4;i++){ for(intj=0;j<3;j++){ icon=newImageIcon("E:/java编程/imaage/"+pictureID+"_"+(i*3+j+1)+".jpg"); cell[i*3+j].setText(""); cell[i*3+j].setIcon(icon); } } } //中选择其它图形进行拼图时,需重新加载新图片,添加数字提示 publicvoidreLoadPictrue2(){ Iconicon; for(inti=0;i<4;i++){ for(intj=0;j<3;j++){ icon=newImageIcon("E:/java编程/imaage/"+pictureID+"_"+(i*3+j+1)+".jpg"); cell[i*3+j].setText(""+(i*3+j+1)); cell[i*3+j].setHorizontalTextPosition(getX()/2); cell[i*3+j].setVerticalTextPosition(getY()/2); cell[i*3+j].setIcon(icon); } } } //根据坐标判断是否拼合成功 publicbooleanisFinish(){ for(inti=0;i<11;i++){ intx=cell[i].getBounds().x; inty=cell[i].getBounds().y; if((y-20)/150*3+(x-20)/150!=i) returnfalse; } returntrue; } //对方格进行重新排列,打乱顺序 publicvoidStart(){ while(cell[0].getBounds().x<=170&&cell[0].getBounds().y<=170){//当第一个方格距左上角较近时 intx=cellNull.getBounds().x; inty=cellNull.getBounds().y; intdirection=(int)(Math.random()*4);//产生0-4,对应空方格的上下左右移动 if(direction==0){//空方格左移动,与左侧方格互换位置,左侧方格右移动 x-=150; if(test(x,y)){ for(intj=0;j<11;j++){ if((cell[j].getBounds().x==x)&&(cell[j].getBounds().y==y)){//依次寻找左侧的按钮 cell[j].move("RIGHT",150); cellNull.setLocation(x,y); break;//找到后跳出for循环 } } } }elseif(direction==1){//RIGHT x+=150; if(test(x,y)){ for(intj=0;j<11;j++){ if((cell[j].getBounds().x==x)&&(cell[j].getBounds().y==y)){ cell[j].move("LEFT",150); cellNull.setLocation(x,y); break; } } } }elseif(direction==2){//UP y-=150; if(test(x,y)){ for(intj=0;j<11;j++){ if((cell[j].getBounds().x==x)&&(cell[j].getBounds().y==y)){ cell[j].move("DOWN",150); cellNull.setLocation(x,y); break; } } } }else{//DOWN y+=150; if(test(x,y)){ for(intj=0;j<11;j++){ if((cell[j].getBounds().x==x)&&(cell[j].getBounds().y==y)){ cell[j].move("UP",150); cellNull.setLocation(x,y); break; } } } } } if(!hasAddActionListener)//如果尚未添加动作事件,那么添加 for(inti=0;i<11;i++)//为第个方格添加动作事件,这样单击按钮就能移动了 cell[i].addMouseListener(this); hasAddActionListener=true; } privatebooleantest(intx,inty){ if((x>=20&&x<=320)||(y>=20&&y<=470)) returntrue; else returnfalse; } publicvoidmouseClicked(MouseEventarg0){ } publicvoidmouseEntered(MouseEventarg0){ } publicvoidmouseExited(MouseEventarg0) { } publicvoidmouseReleased(MouseEventarg0){ } //方格的鼠标事件,因为用到了MyCanvas中的一些方法,因此没有在Cell类中处理鼠标事件 publicvoidmousePressed(MouseEventarg0){ Cellbutton=(Cell)arg0.getSource(); intx1=button.getBounds().x;//得到所单击方格的坐标 inty1=button.getBounds().y; intx2=cellNull.getBounds().x;//得到空方格的坐标 inty2=cellNull.getBounds().y; if(x1==x2&&y1-y2==150)//进行比拟,如果满足条件那么进行交换 { button.move("UP",150); stepNum++; MyMainFrame.st

温馨提示

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

评论

0/150

提交评论