java实训报告扫雷Word文档格式.docx
《java实训报告扫雷Word文档格式.docx》由会员分享,可在线阅读,更多相关《java实训报告扫雷Word文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
![java实训报告扫雷Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-12/8/9f8017b6-e021-4edb-9636-a6c698c9a04f/9f8017b6-e021-4edb-9636-a6c698c9a04f1.gif)
在“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;
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.setFont(fo);
if(f==2)
Youwin!
"
2.5调试中出现的问题
1.类定义未找到错误java.lang.NoClassDefFoundError。
原因分析
⑴由于该程序调用到的JAVA类文件没有正确上传。
⑵JAVA类文件已经上传,但应用服务器并未检测到,建议将JSP页面重新更新。
解决方案
⑴将JAVA类文件重新上传。
⑵将JSP页面更新并上传;
或将应用程序服务器进行重新启动。
2.解决java.lang.StackOverflowError错误。
错误信息
严重:
Exceptioninitializingpagecontext
java.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;
中键=2
privateintflag=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)
//传递值
mx=(x-1)*w;
my=(y-1)*w;
mw=w-1;
statu=s;
//根据你点击鼠标的不同来改变雷的属性
publicintsendKey(intkey)
//返回值,如果游戏结束则返回-1
intrtn=1;
if(key==3)
switch(statu)
case1:
break;
case2:
statu=3;
case3:
case0:
statu=2;
rtn=1;
if(key==1&
&
statu==0)
switch(flag)
statu=1;
rtn=2;
rtn=-1;
returnrtn;
classDrawPanelextendsJPanel
privateinti,j;
privateintf=0;
//iff=1thengameover,iff=2thenwin
privateintchx=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(