java实训报告(扫雷)_第1页
java实训报告(扫雷)_第2页
java实训报告(扫雷)_第3页
java实训报告(扫雷)_第4页
java实训报告(扫雷)_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

学院课程设计(实训)报告系部_信息工程系__专业_软件技术班级__学号姓名课题扫雷指导教师_报告成绩_____________日期:2011年12月29日摘要本次课程设计是用java语言及相关知识设计一个扫雷游戏系统,完成扫雷的基本功能。并在此基础上,自行完善和优化系统功能。理解和掌握选择游戏级别,记录游戏时间和保存游戏成绩的方法,学习程序设计的基本思路和方法,培养计算机专业学生运用所学知识解决计算机应用领域内实际问题能力,进一步提高动手操作能力和用java语言综合编成能力,程序调试技能。目录一、前言…………………4二、正文…………………52.1设计题目及要求…………52.2概要(总体)设计………62.3详细设计…………………62.4程序的核心代码…………72.5调试中出现的问题………92.6运行结果…………………10三、总结………………12四、参考文献………12五、附录………………12

一、前言扫雷最原始的版本可以追溯到1973年一款名为“方块”的游戏。不久之后,“方块”被改写成了游戏“Rlogic”。在“Rlogic”里,玩家的任务是作为美国海军陆战队队员,为指挥中心探出一条没有地雷的安全路线,如果路全被地雷堵死就算输。两年后,汤姆·安德森在“Rlogic”的基础上又编写出了游戏“地雷”,由此奠定了现代扫雷游戏的雏形。1981年,微软公司的罗伯特·杜尔和卡特·约翰逊两位工程师在Windows3.1系统上加载了该游戏,扫雷游戏才正式在全世界推广开来。这款游戏的玩法是在一个9*9(初级),16*16(中级),16*30(高级),或自定义大小的方块矩阵中随机布置一定量的地雷(初级为10个,中级为40个,高级为99个)。由玩家逐个翻开方块,以找出所有地雷为最终游戏目标。如果玩家翻开的方块有地雷,则游戏结束。二、正文2.1设计题目及要求(需求分析)1设计题目:基于Java的扫雷游戏2游戏的描述:本产品是一个简单的游戏软件,目的是尽快找到雷区中的所有地雷,而不许踩到地雷。如果挖开的是地雷,您将输掉游戏。3实现的功能:可以实现简单的游戏功能开始游戏、改变雷数。4游戏的界面:游戏的菜单栏中有‘开始游戏’和‘列’‘行’‘宽’选项,游戏的显示界面中有游戏的主界面和信息界面(列、行、宽和雷的个数)。5软件可实现扫雷游戏的简单操作:1)、游戏功能:点击鼠标左键点击下寻找地雷右键点击下标记地雷点击笑脸的标记开始重新游戏计雷功能:游戏当前雷数2)、设置功能:设置扫雷的行、宽、列和改变雷数6用户的操作:在游戏菜单上,单击开局。单击游戏区中的任何方块,要启动计时器。通过单击即可挖开方块。如果挖开的是地雷,则您输掉游戏。如果方块上出现数字,则表示在其周围的八个方块中共有多少颗地雷。要标记您认为可能有地雷的方块,请右键单击它。

2.2概要(总体)设计1流程图

2扫雷概述(类)JAVA的图形界面图形界面简称GUI,是用图形的方式,借助菜单、按纽等标准界面元素和鼠标操作,帮助用户方便地想计算机系统发出指令、启动操作,并将系统的运行结果同样以图形方式显示给用户的技术。JAVA的图形界面技术既为使用java.awt包来创建图形界面的方法,包括AWT组件、窗口和菜单设计、布局管理器以及绘图操作等。AWT概述 AWT既抽象窗口工具集,用于图形用户界面的开发。AWT的功能包括以下方面:(1)丰富的图形界面组件。(2)强大的事件处理模型图形和图形工具,包括形状、颜色和字体。(3)布局管理器,可以进行灵活的的窗口布局,设计特定窗口的尺寸和和屏幕分辨率。(4)无关数据传送类,可以通过本地平台的剪贴板来进行剪切和粘贴操作。(5)打印和无鼠标操作。Java.awt是java基本包中最大的一个,其中定义了所有的GUI组件类,以及其他用于构造图形界面的类。AWT基本组件(1)标签组件(Label)标签组件显示的是静态文本,在通常情况下是不能编辑的,能起到提示的作用Label组件有三种构造函数:Label():创建空的标签Label(String):创建一个带初始字符串的标签。Label(String,int):创建一个带初始字符串及指定对齐方式的标签。(2)文本域文本域一般用来让用户输入姓名、信用卡号等这样的信息,它是一个能够接收用户的键盘输入的小块区域。TextField():创建空的文本域(3)按钮(Button) 几乎所有的交互式程序中都会有按纽,它是一种交互能力强且交互方便的控件,这个控件提供了“按下并动作”的基本用户界面。按纽的构造方法有:Button():建立一个没有标示字符串的新按纽类对象。Button(StringLabel):建立一个标示字符串为Label的新按纽类的对象(4)画板组件(Panel)我们在界面上安排各种组件时,有时会需要将组件成组放置,这时就可以使用面板组件。Panel是最简单的容器组件,本身是一个矩形区域,可以在其中放入各种组件。但它仅仅是安排各种组件的一种结构,需要最后加入到别的容器中才能实现GUI的功能。面板组件的创建Panel():用默认的布局管理器创建面板组件。Panel(LayoutManagerlayout):用指定的布局管理器创建面板组件。(5)框架窗口组件(Frame) Frame是独立于浏览器的可独立运行的主窗口,通常用于进行开发桌面应用程序。Frame拥有边界和标题栏设置,其大小可以进行设置调整。Frame里面需要加入组件,也可以加入菜单,或在上面绘图。 Frame的创建Frame():创建一个没有窗口标题的窗口框架。Frame(String):创建一个指定窗口标题的窗口框架。2.3详细设计游戏胜利和失败的条件创建,当所有雷都被找出时胜利,当左键点击到雷时失败,具体实现函数如下示:publicvoidpaint(Graphicsg)胜利失败条件g.clearRect(0,0,600,600);g.drawString("GameOver",0,200);2.4程序的核心代码publicvoidpaint(Graphicsg){intx,y,w;ints;intcx=bw/2-4;intcy=bw/2+4;g.clearRect(0,0,600,600);for(i=1;i<=bx;i++){for(j=1;j<=by;j++){draw(g,i,j);}}if(f==1){Fontf=newFont("11",1,70);Fontfo=g.getFont();g.setColor(Color.white);g.setFont(f);//g.setSize();g.drawString("GameOver",0,200);g.setFont(fo);}if(f==2){Fontf=newFont("11",1,70);Fontfo=g.getFont();g.setColor(Color.white);g.setFont(f);//g.setSize();g.drawString("Youwin!",0,200);g.setFont(fo);}}2.5调试中出现的问题1.类定义未找到错误java.lang.NoClassDefFoundError。原因分析⑴由于该程序调用到的JAVA类文件没有正确上传。⑵JAVA类文件已经上传,但应用服务器并未检测到,建议将JSP页面重新更新。解决方案⑴将JAVA类文件重新上传。⑵将JSP页面更新并上传;或将应用程序服务器进行重新启动。2.解决java.lang.StackOverflowError错误。错误信息严重:Exceptioninitializingpagecontextjava.lang.StackOverflowError原因分析运行一个程序,JVM会开辟一块内存空间去储存程序进行时的某些信息,当程序运行时需要储存的信息超过了分配的空间,就会出现那样的问题.比如死循环,递归次数过多,等等。解决方案首先从程序代码优化方面着手,检查是否有死循环、递归等程序,如果有,修正、优化相关代码。

2.6运行结果1运行程序,生成指定行列数的扫雷游戏的图形界面,运行结果如图所示2鼠标左键点击到雷时,失败,游戏结束,运行结果如图所示:3改变雷的个数,从15个雷改为20个雷,开始游戏,运行结果如图所示:4所有雷都被找出时,游戏胜利,运行结果如图所示:

三、总结这不是我第一次做课程设计,但这个扫雷游戏我平常也会经常的玩,所以对于做这个扫雷游戏的课程设计我也是很兴奋,虽然这设计过程中遇到很多困难,但都在尽力的克服,对于我自己做出的这个程序我还是比较满意的,基本功能基本都实现了,图形界面虽然不能说是非常友好,但好象也至少能看的过去,通过这个课程设计我学到了很多的东西,把以前所学的课本知识很好的用到了实践当中,并且通过实践,重新发现了很多问题和很多以前不理解的没掌握的知识点,并且通过完成这个设计,很好的重新的理解并掌握了各种知识点。四、参考文献[1]耿祥义.JAVA大学实用教程.电子工业出版社.2005.03[2]朱战立,沈伟编著.Java程序设计实用指南.电子工业出版社,2005.1[3][美]CayS.Horstmann.程峰等译.JAVA2核心技术.机械工业出版社.2003.06[4]陈占伟,刘旭,陈文霞《Java程序设计》武昌,武汉大学出版社,2011年7月第一版[5]朱庆生,古平,《java程序设计》北京,清华大学出版社,2011[6]包海山,李占玲,《java程序设计案例教程》,北京,机械工业出版社[7]刘瑞挺,侯冬梅,《java程序设计实用教程》,北京,清华大学出版社,2009五、附录全部程序代码importjava.awt.*;importjavax.swing.*;importjava.util.Random;importjava.awt.event.*;classMinextendsJPanel//雷的类{//备注:鼠标的左键=1;右键=3;中键=2privateintflag=0,statu=0;//定义雷的属性0:没有打开1:打开2:标示为雷3:不确定//flag=0不是雷;flag=1是雷privateintbut,count=0;//but:哪一个鼠标键被按下去了count:这个区域周围有多少个雷privateintmx=0,my=0,mw=10;//定义雷的坐标和宽度publicMin()//构造函数{statu=0;}publicMin(intf,intx,inty,intw)//构造函数{flag=f;mx=x;my=y;mw=w;}publicintgetFlag(){returnflag;}publicintgetStatu(){returnstatu;}publicintgetMx(){returnmx;}publicintgetMy(){returnmy;}publicintgetMw(){returnmw;}publicintgetCount(){returncount;}publicvoidsetFlag(intf){flag=f;}publicvoidsetCount(intc){count=c;}publicvoidsetData(intf,intx,inty,intw,ints)//传递值{flag=f;mx=(x-1)*w;my=(y-1)*w;mw=w-1;statu=s;}//根据你点击鼠标的不同来改变雷的属性publicintsendKey(intkey){//返回值,如果游戏结束则返回-1intrtn=1;if(key==3){switch(statu){case1:break;case2:statu=3;break;case3:statu=0;break;case0:statu=2;break;}rtn=1;}if(key==1&&statu==0){switch(flag){case0:statu=1;rtn=2;break;case1:statu=1;rtn=-1;break;}}returnrtn;}}classDrawPanelextendsJPanel{privateinti,j;privateintf=0;//iff=1thengameover,iff=2thenwinprivateintchx=0,chy=0;//专门记录坐标x,y的值privateintmsum=6,ksum=0;//msum:雷的个数,ksum:标示雷的个数privateintbx=10,by=10,bw=40;//bx,by:棋盘的大小,bw:棋子的大小publicMinboard[][]={{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},};//画坐标为ax,ay区域的雷的状态publicvoiddraw(Graphicsg,intax,intay){intx,y,w;//坐标x,y;和宽度:wints,c,flag;//状态;雷的个数;intcx=bw/2-4;intcy=bw/2+4;x=board[ax][ay].getMx();y=board[ax][ay].getMy();w=board[ax][ay].getMw();s=board[ax][ay].getStatu();c=board[ax][ay].getCount();flag=board[ax][ay].getFlag();switch(s){case0://没有打开状态{g.setColor(Color.black);g.fillRect(x,y,w,w);break;}case1://打开状态{g.setColor(Color.blue);g.fillRect(x,y,w,w);if(c!=0&&flag==0)//此处没有雷{g.setColor(Color.red);g.drawString(String.valueOf(c),x+cx,y+cy);}if(flag==1)//此处有雷{g.setColor(Color.red);g.fillRect(x,y,w,w);g.setColor(Color.blue);g.drawString("雷",x+cx,y+cy);}break;}case2://标雷状态{g.setColor(Color.green);g.fillRect(x,y,w,w);g.setColor(Color.blue);g.drawString("旗",x+cx,y+cy);break;}case3://不确定状态{g.setColor(Color.black);g.fillRect(x,y,w,w);g.setColor(Color.red);g.drawString("?",x+cx,y+cy);break;}default:break;}}//没有图形器的绘图函数:画出坐标ax,ay的雷的状态和图形publicvoiddraw(intax,intay){Graphicsg;g=this.getGraphics();draw(g,ax,ay);}//打开周围没有雷的地方,并且绘画所在区域点击左键触发publicintopenNoMin(intax,intay){inti,j;if(ax<1||ay<1||ax>bx||ay>by)return0;//鼠标点击的区域出界了if(board[ax][ay].getStatu()!=0)return0;//如果此区域打开了,返回board[ax][ay].sendKey(1);//如果返回值等于-1,就说明游戏结束draw(ax,ay);if(board[ax][ay].getFlag()==1)//如果游戏结束,把所有的雷都显示出来{for(i=1;i<=bx;i++){for(j=1;j<=by;j++){if(board[i][j].getFlag()==1){board[i][j].sendKey(1);draw(i,j);}}}return-1;}//如果游戏没有结束if(board[ax][ay].getCount()>0){ksum++;return1;//周围有雷,就不用打开周围地区}if(board[ax][ay].getCount()==0&&board[ax][ay].getFlag()==0)//周围没有雷,打开周围地区,直到有雷的地区{openNoMin(ax-1,ay-1);openNoMin(ax,ay-1);openNoMin(ax+1,ay-1);openNoMin(ax-1,ay);openNoMin(ax+1,ay);openNoMin(ax-1,ay+1);openNoMin(ax,ay+1);openNoMin(ax+1,ay+1);}ksum++;return1;}//计算坐标x,y的周围雷的个数publicintgetCount(intai,intaj){intsum=0;if(board[ai][aj].getFlag()==1){returnsum;}if(ai>1&&aj>1&&ai<bx&&aj<by){sum=board[ai-1][aj-1].getFlag()+board[ai][aj-1].getFlag()+board[ai+1][aj-1].getFlag()+board[ai-1][aj].getFlag()+board[ai+1][aj].getFlag()+board[ai-1][aj+1].getFlag()+board[ai][aj+1].getFlag()+board[ai+1][aj+1].getFlag();}if(ai==1&&aj==1){sum=board[ai+1][aj].getFlag()+board[ai][aj+1].getFlag()+board[ai+1][aj+1].getFlag();}if(ai==1&&aj==by){sum=board[ai][aj-1].getFlag()+board[ai+1][aj-1].getFlag()+board[ai+1][aj].getFlag();}if(ai==bx&&aj==1){sum=board[ai-1][aj].getFlag()+board[ai-1][aj+1].getFlag()+board[ai][aj+1].getFlag();}if(ai==bx&&aj==by){sum=board[ai-1][aj-1].getFlag()+board[ai][aj-1].getFlag()+board[ai-1][aj].getFlag();}if(ai==1&&aj>1&&aj<by){sum=board[ai][aj-1].getFlag()+board[ai+1][aj-1].getFlag()+board[ai+1][aj].getFlag()+board[ai][aj+1].getFlag()+board[ai+1][aj+1].getFlag();}if(ai==bx&&aj>1&&aj<by){sum=board[ai-1][aj-1].getFlag()+board[ai][aj-1].getFlag()+board[ai-1][aj].getFlag()+board[ai-1][aj+1].getFlag()+board[ai][aj+1].getFlag();}if(ai>1&&ai<bx&&aj==1){sum=board[ai-1][aj].getFlag()+board[ai+1][aj].getFlag()+board[ai-1][aj+1].getFlag()+board[ai][aj+1].getFlag()+board[ai+1][aj+1].getFlag();}if(ai>1&&ai<bx&&aj==by){sum=board[ai-1][aj-1].getFlag()+board[ai][aj-1].getFlag()+board[ai+1][aj-1].getFlag()+board[ai-1][aj].getFlag()+board[ai+1][aj].getFlag();}returnsum;}//传入参数:几列,几行,宽度,雷数publicvoidinitMin(intax,intay,intaw,intas){intk=1;//表明产生的第几个雷Randomr;//随机数f=0;//f=0表示游戏还没有结束ksum=0;bx=ax;by=ay;bw=aw;msum=as;r=newRandom();//初始化底盘的值for(i=1;i<=bx;i++){for(j=1;j<=by;j++){board[i][j].setData(0,i,j,bw,0);}}//随机产生雷while(k<=msum){i=r.nextInt(bx)+1;j=r.nextInt(by)+1;if(board[i][j].getFlag()!=1){board[i][j].setFlag(1);k++;}}//非雷区的周围有几个雷,初始化其值for(i=1;i<=bx;i++){for(j=1;j<=by;j++){board[i][j].setCount(getCount(i,j));}}setBackground(Color.white);repaint();}//构造函数publicDrawPanel(intax,intay,intaw,intas){initMin(ax,ay,aw,as);addMouseListener(newMouseAdapter(){publicvoidmousePressed(MouseEventme){intr;if(f!=0)return;//如果游戏结束,返回chx=me.getX();chy=me.getY();if(me.getButton()!=1){board[chx/bw+1][chy/bw+1].sendKey(me.getButton());draw(chx/bw+1,chy/bw+1);}elseif(me.getButton()==1){if(openNoMin(chx/bw+1,chy/bw+1)==-1){f=1;repaint();}elseif(ksum+msum==bx*by){f=2;repaint();}}}});}//重画所有的图形,包括一些修饰的图形publicvoidpaint(Graphicsg){intx,y,w;ints;intcx=bw/2-4;intcy=bw/2+4;g.clearRect(0,0,600,600);for(i=1;i<=bx;i++){for(j=1;j<=by;j++){draw(g,i,j);}}if(f==1){Fontf=newFont("11",1,70);Fontfo=g.getFont();g.setColor(Color.white);g.setFont(f);//g.setSize();g.drawString("GameOver",0,200);g.setFont(fo);}if(f==2){Fontf=newFont("11",1,70);Fontfo=g.getFont();g.setColor(Color.white);g.setFont(f);//g.setSize();g.drawString("Youwin!",0,200);g.setFont(fo);}}};//主类和程序的入口publicclassMineextendsJFrameimplementsActionListener{Containercp=getContentPane();JButtonbt=newJButton("^_^");

温馨提示

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

评论

0/150

提交评论