毕业论文-基于JAVA的扫雷游戏设计18480.doc_第1页
毕业论文-基于JAVA的扫雷游戏设计18480.doc_第2页
毕业论文-基于JAVA的扫雷游戏设计18480.doc_第3页
毕业论文-基于JAVA的扫雷游戏设计18480.doc_第4页
毕业论文-基于JAVA的扫雷游戏设计18480.doc_第5页
免费预览已结束,剩余24页可下载查看

下载本文档

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

文档简介

课 程 设 计 报 告 课程名称: 计算机技术综合课程设计 题 目: 基于java语言的扫雷游戏设计 学 院: 信息工程 系: 计算机 专 业: 计算机科学与技术 班 级: 学 号: 学生姓名: 时 间: 2008年1月11日至1月25日 基于java语言的扫雷游戏设计摘 要:本文介绍的是扫雷游戏的设计方法。该游戏使用的是java语言编写,主要是用了java的程序界面设计的方法和各种事件监听和处理的方法。关键字:扫雷 界面设计 java 事件监听 事件处理1 前言扫雷游戏的目标是尽快找到雷区中的所有地雷,而不许踩到地雷。如果挖开的是地雷,您将输掉游戏。扫雷游戏在程序运行后生成指定的地雷,在鼠标左键点击下寻找地雷,右键点击下标记地雷,点击笑脸的标记开始重新游戏,并给出胜利和失败的条件:标出所有的地雷和左键点中地雷。点击键盘q键将推出游戏。在游戏菜单上,单击开局。单击游戏区中的任何方块,要启动计时器。通过单击即可挖开方块。如果挖开的是地雷,则您输掉游戏。如果方块上出现数字,则表示在其周围的八个方块中共有多少颗地雷。要标记您认为可能有地雷的方块,请右键单击它。游戏区包括雷区、地雷计数器和计时器。2 本课程设计的定位2.1 问题定义和内容简介本课程设计是用java编写一个扫雷游戏。程序的功能是生成指定数目的地雷,通过鼠标操作玩游戏。点击屏幕上的笑脸重新开始游戏;标出所有地雷后胜出;当鼠标左键击中地雷失败;按q键退出游戏。2.2 论文研究内容的意义扫雷游戏是windows系统自带的一个娱乐性的小游戏,在玩扫雷游戏的过程中 也可以很好的培养耐心和细心,同时在无聊得时候可以用以休闲娱乐,如果我们自己也能动手做一个小程序来实现这个功能,自然能乐在其中。3 扫雷游戏的相关知识点3.1 java的图形界面图形界面简称gui,是用图形的方式,借助菜单、按纽等标准界面元素和鼠标操作,帮助用户方便地想计算机系统发出指令、启动操作,并将系统的运行结果同样以图形方式显示给用户的技术。java的图形界面技术既为使用java.awt包来创建图形界面的方法,包括awt组件、窗口和菜单设计、布局管理器以及绘图操作等。3.2 awt概述awt既抽象窗口工具集,用于图形用户界面的开发。awt的功能包括以下方面:(1)丰富的图形界面组件。(2)强大的事件处理模型图形和图形工具,包括形状、颜色和字体。(3)布局管理器,可以进行灵活的的窗口布局,设计特定窗口的尺寸和和屏幕分辨率。(4)无关数据传送类,可以通过本地平台的剪贴板来进行剪切和粘贴操作。(5)打印和无鼠标操作。java.awt是java基本包中最大的一个,其中定义了所有的gui组件类,以及其他用于构造图形界面的类。3.3 awt基本组件(1)标签组件(label)标签组件显示的是静态文本,在通常情况下是不能编辑的,能起到提示的作用label组件有三种构造函数:label(): 创建空的标签label(string):创建一个带初始字符串的标签。label(string,int):创建一个带初始字符串及指定对齐方式的标签。(2)文本域文本域一般用来让用户输入姓名、信用卡号等这样的信息,它是一个能够接收用户的键盘输入的小块区域。textfield():创建空的文本域(3)按钮(button)几乎所有的交互式程序中都会有按纽,它是一种交互能力强且交互方便的控件,这个控件提供了“按下并动作”的基本用户界面。按纽的构造方法有:button():建立一个没有标示字符串的新按纽类对象。button(string label):建立一个标示字符串为label的新按纽类的对象(4)画板组件(panel)我们在界面上安排各种组件时,有时会需要将组件成组放置,这时就可以使用面板组件。panel是最简单的容器组件,本身是一个矩形区域,可以在其中放入各种组件。但它仅仅是安排各种组件的一种结构,需要最后加入到别的容器中才能实现gui的功能。面板组件的创建panel():用默认的布局管理器创建面板组件。panel(layoutmanager layout):用指定的布局管理器创建面板组件。(5)框架窗口组件(frame)frame是独立于浏览器的可独立运行的主窗口,通常用于进行开发桌面应用程序。frame拥有边界和标题栏设置,其大小可以进行设置调整。frame里面需要加入组件,也可以加入菜单,或在上面绘图。frame的创建frame():创建一个没有窗口标题的窗口框架。frame(string):创建一个指定窗口标题的窗口框架。(6)布局管理器flowlayout布局管理器flowlayout布局管理是一种最简单的布局管理方法,是panel的默认布局。它以流式的方式,自左向右,自上而下地放置容器中的组件,即组件按每行先后自左向后放置,一行放不下再换行。flowlayout布局管理器的创建flowlayout():创建默认的flowlayout布局管理器flowlayout(int):以指定的对齐方式创建flowlayout布局管理器。其中的参数有flowlayout.left、flowlayout.right、flowlayout.centerflowlayout(int,int,int):以指定的对齐方式及间距创建flowlayout布局管理器。其中第一个参数为对齐方式,第二个参数为组件间间距,第三个参数为列间距。(7)事件处理事件处理是一个接受事件、解释事件并处理用户交互的方法。事件处理有三个要素:事件源 事件源是一个时间的产生者,如按牛、窗口及文本域等。事件类型 java中所有的事件都封装成一个类,这些事件类被集中在java.awt.exent包和java.swing.event包中,所有的事件类均继承了awtevent类和一个方法getsouce()方法,该方法返回发生事件的对象。事件监听器 不同的类型事件发生后,由事件监听器接受事件并调用响应的事件处理方法,所有的事件监听器实际上都是一个java.awt.exent包中的借口,继承了java.util.eventlistener接口。不同的事件有不同的处理方法,(8)键盘事件处理该程序使用的是键盘监听事件,键盘事件对应的事件类是keyevent类,使用的该类的方法是getkeycode()获得按下或释放的键代码getkeytext()获得按下或释放的键的字符串。键盘事件对应的事件监听器为:keylistener或keyadapter实现键盘事件的操作步骤是:第一步,注册keylistener监听器addkeylistener().当事件源所在的类已经实现keylistener的接口时,参数可用this,否则需创建或继承一个keylistener第二步,实现keylistener接口的所有方法,即keypressed(keyevent e)、keyreleased(keyevent e)、keytyped(mouseevent e)。4 功能模块描述本扫雷游戏的实现,共分为五个模块,分别表述为:模块1 定义雷的类,鼠标左键点击不是雷,右键点击是雷,数字表示周围有多少个雷,具体实现函数如下示:class min extends jpanel /雷的类 /备注:鼠标的左键 = 1;右键 = 3;中键 = 2 private int flag = 0,statu = 0; /定义雷的属性 0:没有打开 1:打开 2:标示为雷 3:不确定 /flag = 0 不是雷 ; flag = 1是雷 private int but,count = 0; /but:哪一个鼠标键被按下去了 count:这个区域周围有多少个雷 private int mx = 0,my = 0,mw = 10; /定义雷的坐标和宽度 public min() /构造函数 statu = 0; public min(int f,int x,int y,int w) /构造函数 flag = f; mx = x; my = y; mw = w; public int getflag()return flag; public int getstatu()return statu; public int getmx()return mx; public int getmy()return my; public int getmw()return mw; public int getcount()return count; public void setflag(int f)flag = f; public void setcount(int c)count = c; public void setdata(int f,int x,int y,int w,int s) /传递值 flag = f; mx = (x-1)*w; my = (y-1)*w; mw = w-1; statu = s; /根据你点击鼠标的不同来改变雷的属性模块2:雷的分布和雷的画法具体实现函数的核心代码如下示:class drawpanel extends jpanel private int i,j; private int f = 0; /if f = 1 then game over ,if f =2 then win private int chx = 0,chy = 0; /专门记录坐标x,y的值 private int msum = 6,ksum = 0; /msum:雷的个数,ksum:标示雷的个数 private int bx = 10,by = 10,bw = 40; /bx,by:棋盘的大小,bw:棋子的大小 public min board = new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(), new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(), new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(), new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(), new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(), new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(), new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(), new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(), new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(), new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(), new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(), new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(), new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(), new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(), new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(), new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(), new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(), new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(), new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(), new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(), ; /画坐标为ax,ay区域的雷的状态 public void draw(graphics g,int ax,int ay) int x,y,w; /坐标x,y;和宽度:w int s,c,flag; /状态;雷的个数; int cx = bw/2 - 4; int cy = bw/2 + 4; x = boardaxay.getmx(); y = boardaxay.getmy(); w = boardaxay.getmw(); s = boardaxay.getstatu(); c = boardaxay.getcount(); flag= boardaxay.getflag();public int getcount(int ai,int aj) int sum = 0; if(boardaiaj.getflag() = 1) return sum; if(ai1&aj1&aibx&aj1&aj1&aj1&ai1&aibx&aj=by) sum = boardai-1aj-1.getflag()+ boardaiaj-1.getflag()+ boardai+1aj-1.getflag()+ boardai-1aj .getflag()+ boardai+1aj .getflag(); return sum; /传入参数:几列,几行,宽度,雷数 public void initmin(int ax,int ay,int aw,int as) int k = 1; /表明产生的第几个雷 random r; /随机数 f = 0; /f=0表示游戏还没有结束 ksum = 0; bx = ax; by = ay; bw = aw; msum = as; r = new random(); /初始化底盘的值 for(i = 1;i = bx;i+) for(j=1;j=by;j+) boardij.setdata(0,i,j,bw,0); /随机产生雷 while(k = msum) i = r.nextint(bx)+1; j = r.nextint(by)+1; if(boardij.getflag() != 1) boardij.setflag(1); k+; /非雷区的周围有几个雷,初始化其值 for(i = 1;i = bx;i+) for(j=1;j=by;j+) boardij.setcount(getcount(i,j); setbackground(color.white); repaint(); 模块3 图形界面的设计,具体实现函数如下示:public class mine extends jframe implements actionlistener container cp = getcontentpane(); jbutton bt = new jbutton(_); label l1 = new label(列:); label l2 = new label(行:); label l3 = new label(宽度:); label l4 = new label(雷的个数:); textfield tf1 = new textfield(10,2); /列 textfield tf2 = new textfield(10,2); /行 textfield tf3 = new textfield(40,2); /宽度 textfield tf4 = new textfield(15,2); /雷的个数 int x=10,y=10,w=40,sum=15; drawpanel dp = new drawpanel(x,y,w,sum); public mine() setbackground(color.white); cp.setlayout(null); cp.add(dp); cp.add(bt); cp.add(tf1); cp.add(tf2); cp.add(tf3); cp.add(tf4); cp.add(l1); cp.add(l2); cp.add(l3); cp.add(l4); l1.setbounds(20 ,10,20,20); tf1.setbounds(40,10,20,20); l2.setbounds(70,10,20,20); tf2.setbounds(90,10,20,20); l3.setbounds(120,10,40,20); tf3.setbounds(160,10,20,20); l4.setbounds(190,10,60,20); tf4.setbounds(250,10,20,20); bt.setbounds(300,10,80,20); dp.setbounds(20,40,x*w,y*w); setresizable(false); setsize(x*w+40,y*w+80); settitle(扫雷); show(); bt.addactionlistener(this); addwindowlistener(new windowadapter() public void windowclosing(windowevent e) system.exit(0); ); public void actionperformed(actionevent e) if(e.getsource() = bt) /x = integer.parseint(tf1.gettext(); /y = integer.parseint(tf2.gettext(); /w = integer.parseint(tf3.gettext(); sum = integer.parseint(tf4.gettext(); setsize(x*w+40,y*w+80); dp.setbounds(20,40,x*w,y*w); show(); dp.initmin(x,y,w,sum); 模块4 游戏胜利和失败的条件创建,当所有雷都被找出时胜利,当左键点击到雷时失败,具体实现函数如下示:public void paint(graphics g) int x,y,w; int s; int cx = bw/2 - 4; int cy = 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) font f = new font(11,1,70); font fo = g.getfont(); g.setcolor(color.white); g.setfont(f); /g.setsize(); g.drawstring(game over,0,200); g.setfont(fo); if( f = 2 ) font f = new font(11,1,70); font fo = g.getfont(); g.setcolor(color.white); g.setfont(f); /g.setsize(); g.drawstring(you win!,0,200); g.setfont(fo); 模块5 键盘事件的监听,使用q键退出图形界面,具体实现函数如下示:public void getq() int keycode; tf1.addkeylistener(new keyadapter() public void keypressed(keyevent e) if(e.getkeychar()=q|e.getkeychar()=q) system.exit(0); ); public static void main(string args) mine nowmine=new mine(); nowmine.getq();5 程序流程图的设计6 运行结果1 运行程序,生成指定行列数的扫雷游戏的图形界面,运行结果如图所示2 鼠标左键点击到雷时,失败,游戏结束,运行结果如图所示:3 改变雷的个数,从15个雷改为20个雷,开始游戏,运行结果如图所示:4 所有雷都被找出时,游戏胜利,运行结果如图所示:7总结这不是我第一次做课程设计,但这个扫雷游戏我平常也会经常的玩,所以对于做这个扫雷游戏的课程设计我也是很兴奋,虽然这设计过程中遇到很多困难,但都在尽力的克服,对于我自己做出的这个程序我还是比较满意的,基本功能基本都实现了,图形界面虽然不能说是非常友好,但好象也至少能看的过去,通过这个课程设计我学到了很多的东西,把以前所学的课本知识很好的用到了实践当中,并且通过实践,重新发现了很多问题和很多以前不理解的没掌握的知识点,并且通过完成这个设计,很好的重新的理解并掌握了各种知识点。以下是我对扫雷游戏的设计的总结:在这个设计过程中,雷的分布是一个关键,我是这样做的,首先我们在雷区上随机地放上雷,这可以用random类来实现。当没有雷的地方被点击后就会显示一个数字表示它周围有几个雷,这是怎么实现的呢?我们可以把整个雷区看成一个二维数组ai j ,如雷区:11 12 13 14 15 16 17 1821 22 23 24 25 26 27 2831 32 33 34 35 36 37 3841 42 43 44 45 46 47 4851 52 53 54 55 56 57 58我们可以发现a i j 周围存在着如下关系:a i 1 j 1 a i 1 j a i 1 j + 1 a i j 1 a i j a i j + 1 a i + 1 j - 1 a i + 1 j a i + 1 j + 1 于是 ,可以从a i j 的左上角顺时针开始检测。当然,如果超出边界,要用约束条件再加以判断!扫雷程序还会自动展开已确定没有雷的雷区。如果a34周围雷数为1,a23已被标示为地雷,那么a24,a25,a33,a35,a43,a44,a45将被展开,一直波及到不可确定的雷区。这也是实现的关键。我们可以把数组的元素设定为一个类对象,它们所属的类设定这样的一个事件:在被展开时,检查周围的雷数是否与周围标示出来的雷数相等,如果相等则展开周围未标示的雷区。这样新的雷区展开又触发这个事件,就这样递归下去,一直蔓延到不可展开的雷区。在了解以上两个关键要点后,然后在雷区这个类编写完全,如添加是否有雷标记,是否展开标记,周围雷数等,左右单击的鼠标事件等。这个程序还存在这一些问题:1、 当改变行列数时,无法实现图形界面的改变;2、 当使用右键标记时,在点击右键成旗帜标记,再点击一次右键成问号标记,然后就不能把问号标记点击回无标记。参考资料1耿祥义.java大学实用教程.电子工业出版社.2005.032朱战立,沈伟编著java程序设计实用指南电子工业出版社,2005.13美cay s.horstmann.程峰等译. java2核心技术.机械工业出版社.2003.06附录:源代码选摘import java.awt.*;import javax.swing.*;import java.util.random;import java.awt.event.*;class min extends jpanel /雷的类 /备注:鼠标的左键 = 1;右键 = 3;中键 = 2 private int flag = 0,statu = 0; /定义雷的属性 0:没有打开 1:打开 2:标示为雷 3:不确定 /flag = 0 不是雷 ; flag = 1是雷 private int but,count = 0; /but:哪一个鼠标键被按下去了 count:这个区域周围有多少个雷 private int mx = 0,my = 0,mw = 10; /定义雷的坐标和宽度 public min() /构造函数 statu = 0; public min(int f,int x,int y,int w) /构造函数 flag = f; mx = x; my = y; mw = w; public int getflag()return flag; public int getstatu()return statu; public int getmx()return mx; public int getmy()return my; public int getmw()return mw; public int getcount()return count; public void setflag(int f)flag = f; public void setcount(int c)count = c; public void setdata(int f,int x,int y,int w,int s) /传递值 flag = f; mx = (x-1)*w; my = (y-1)*w; mw = w-1; statu = s; /根据你点击鼠标的不同来改变雷的属性 public int sendkey(int key) /返回值,如果游戏结束则返回-1 int rtn = 1; if(key = 3) switch(statu) case 1: break; case 2: statu = 3; break; case 3: statu = 0; break; case 0: statu = 2; break; rtn = 1; if(key = 1 & statu = 0) switch(flag) case 0: statu = 1; rtn = 2; break; case 1: statu = 1; rtn = -1; break; return rtn; class drawpanel extends jpanel private int i,j; private int f = 0; /if f = 1 then game over ,if f =2 then win private int chx = 0,chy = 0; /专门记录坐标x,y的值 private int msum = 6,ksum = 0; /msum:雷的个数,ksum:标示雷的个数 private int bx = 10,by = 10,bw = 40; /bx,by:棋盘的大小,bw:棋子的大小 public min board = new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(), new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(),new min(), new min(),new min(),new min(),new min(),new min(),new min(),new min(),new

温馨提示

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

评论

0/150

提交评论