下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、ZU XINHUA UNIVEIIIYJAVA程序设计A课程设计目 基于JAVA的扫雷游戏的设计与实现(系)信息工程学院计算机科学与技术(2)班教(13)软件实验室起止时间:2014年6月9日至2014年6月13日Java程序设计A课程设计任务分工及成绩课程设计题目基于JAVA的扫雷游戏的设计与实现课程用JAVA实现扫雷游戏,了解扫雷游戏的基本结构,和理 解扫雷的算法,并努力对算法进行改进,调试过程中修复程 序中的bugg,使该扫雷游戏尽可能完善。设计内容:1、扫雷游戏分为初级、中级和高级三个级别。单击游戏 菜单可以选择“初级”、“中级”和“高级”。2选择级别后将出现相应级别的扫雷区域,这时用
2、户使 用鼠标左键单击“开始”便启动计时器。3、用户要揭开某个方块,可左键单击它。若所揭方块下 有雷,用户便输了这一局,若所揭方块下无雷,则显示一个 数字,该数字代表方块的周围的8个方块中共有多少颗雷。4、如果用户认为某个方块下埋着雷,单击右键可以在万 块上标识一个用户认为是雷的图标,即给出一个扫雷标记。 用户每标记出一个扫雷标记(无论用户的标记是否正确),程 序将显示的剩余雷数减少一个。小 组 成 员 及 任 务 分 配姓名学号承担任务成绩算法实现游戏布局设置监听器院(系):信息工程学院教研室:软件教研室基于JAVA的扫雷游戏的设计与实现摘要随着时代的发展,电脑进入了普通老百姓的生活, 越来越
3、多的人使用电脑 办 公、娱乐、上网,游戏行业发展一日千里, 该行业极大的影响和改变了人们的 生 活和娱乐方式, 游戏为消费者提供丰富多彩的虚拟空间,使消费者可以自由自 在的享受虚拟世界的乐趣,实现自己在现实生活着那个可能永远不能实现的梦 想,满足了消费者的心理和精神需求。扫雷 游戏 是 Windows 操作系统 自 带的一款 小游戏 ,本系统要 是模仿WINDOW系统的扫雷,对于实现过程中出现的bug进行调试解决。我这里用的是 C# 编写 了与它功能相似的扫雷游戏。程序的功能是随机生成地雷数, 通过鼠标操作玩游戏, 不接受键盘, 按任意键结束程序。 单击屏幕上的笑脸可以重新开始游戏。当鼠标左键
4、单击到地雷时提 示游戏失败。 报告首先介绍了进行该游戏课程设计的目的, 然后是任务描述和设 计的相关要求, 最后是最重要的需求分析和设计方案。 重点介绍了在游戏过程中为最要,各事件的处理,其中又以鼠标事件和清除未靠近地雷区方块这两方面最鼠标事件是利用鼠标所发出的信息了解用户的意图,进而做出相对应的动作。清 除未靠近地雷区的方块较为复杂。关键词:扫雷游戏,算法设计,事件, JAVA1.1 选题的目的及意义1.2 程序设计任务与要求 2 需求分析2.1 扫雷游戏的需求分析2.2 扫雷游戏的基本功能操作2.3 功能要求 3 详细设计3.1 系统总体设计3.1.1 算法思想3.1.2 设计思想3.1.
5、3 功能分析3.2 系统详细设计3.2.1类的设计3.2.2 模块的划分及调用关系4系统测试与实现4.1 程序测试结果4.1.1 游戏玩家通过右击鼠标来进行扫雷,并显示“雷”4.1.2 游戏玩家因触到雷而导致游戏结束4.1.3 游戏玩家扫雷成功4.1.4 游戏玩家可选择游戏难度总结10参考文献11附录121.1 选题的目的及意义本次课程设计的主要目的是为了通过具体的程序来加深对 Java 语言的掌 握,提高自己的编程水平。选择的题目来自 Java 课程设计(第二版)中的扫 雷游戏,这是一个综合性的题目,可以对 Java 中的各项功能有更好的理解和使 用,同时也为以后的工作打下一定的基础。1.2
6、 程序设计任务与要求扫雷游戏是一个很有趣的游戏。本章的课程设计使用 Java 语言编写一个与 其类似的扫雷游戏。具体要求如下:(1) 扫雷游戏分为初级、 中级和高级三个级别。 单击游戏菜单可以选择 “初级”、 “中级”和“高级”。(2) 选择级别后将出现相应级别的扫雷区域, 这是用户使用鼠标左键单击雷区中 任何一个方块便启动计时器。(3) 用户要揭开某个方块,可单击它。若所揭方块下有泪,用户便输了这一局, 若所揭方块下五雷, 则显示一个数字, 该数字代表方块的周围的 8 个方块中共有 多少颗雷。(4) 如果用户认为某个方块下埋着雷, 单击右键可以在方块上标识一个用户认为 是雷的图标, 即给出一
7、个扫雷标记 雷'。用户每标记出一个扫雷标记 (无论用户的标记是否正确 ) ,程序将显示的剩余雷数减少一个。(5) 扫雷胜利后,游戏中的标签会显示“你赢了! ”(6) 如果在扫雷过程中一不小心碰到了雷,游戏会显示“你输了,这个游戏不适 合你!”。2需求分析2.1扫雷游戏的需求分析随着社会的不断进步,人们的压力也不断的提高,在游戏层出不穷的时刻, 扫雷游戏任然受到不少人的青睐,其本身的性质,决定了人们对它的喜爱的程 度,不需要特殊的技巧,不需要不断的升级,还不需要太多的时间进行熟悉,简 简单单却趣味无穷。2.2扫雷游戏的基本功能操作本程序需实现的主要功能有:(1) 用户可以自定义级别,并确
8、定雷的个数。(2) 具有计时功能,即显示用户完成扫雷所花费的时间。(3) 点击开始进行扫雷。(4) 用户识别雷右击可标记“雷”。2.3功能要求(1)程序的总体功能如图2.1所示。图2.1总体功能图 程序总体流程如图2.2所示。开始定义并初始化个按钮,菜单等结束图2.2总体流程图3 详细设计3.1 系统总体设计3.1.1 算法思想(1) 计算按钮周围雷数。 随机分布。扫雷游戏要求在M行N列的网格游戏区随即的不上bon个雷, 且bon的取值应小于M和N的乘积。这可以在一张M*N的网格上通过均匀分布的 随即算法视线。其中bon的网格是雷区,剩下的网格是非雷区。游戏的目标是尽 可能快地找到所有的雷区,
9、 而不踩到地雷。 Java 提供了视线随即算法的类 Math, 通过Math类的random ()方法这可以很方便的实现随即布雷的功能。3.1.2 设计思想1)扫雷棋盘的布局设计系统的整体布局为:CardLayout布局,采用了菜单、按钮、面板等组件, 菜单主要包括开始,选择级别,标记, 按钮的功能是重新开始新的游戏。2)雷区的设计ScanLei1类是继承了 JFrame实现了 ActionListener 接口,该类里声明了 组键,并进行布局,go方法通过设置是否显示窗体,主方法 main()实例化窗体对象, out() 方法是 ScanLei1 类中的重要方法之一,也就是扫雷的算法。act
10、ionPerformed(ActionEvent e)就是单击按钮触发的事件,如果是初级按钮触发, 分配初级雷区按钮布局。 如果是中级按钮触发, 分配中级雷区按钮布 局。如果是高级按钮触发,分配高级雷区按扭布局。如果是开始按钮触发,开始 计数,并随机分配雷, 并计算没有雷的按钮周围有雷的数目。 如果按钮按键触发, 调用 ScanLei1 类中的 out() 方法进行扫雷。NormoreMouseEve nt()继承了鼠标适配器,当右击按钮后,根据该按钮上的图标来判断该按钮是否被右击过,如果有图标,将图标删除,并雷的个数加一。如果该按钮没有被右击过,在该按钮中添加图标,并将雷的个数减一。雷区设计
11、流程图如图3.3所示。定义并初始化MineGrid 类73.1.3功能分析用户可以玩扫雷游戏并能自定义级别(初等,中等,高等);具有计时功能, 即显示用户完成扫雷任务所花费的时间。3.2系统详细设计3.2.1类的设计(1)i ni tMi neArea(i nt,i nt,i nt,i nt)的宽度、高度以及雷区的级别。方法可根据参数提供的数据设置雷区(2)actio nP erformed(Actio nEve nt)是 Min eArea 类实现的 Actio nListe ner接口中的方法。当用户单击blockview 中的某个方块时,actionPerformed(ActionEve
12、nt)方法负责执行有关算法,例如,当用鼠标左键单击方块上的按钮后,若该方块下有雷,actionPerformed(ActionEvent)方法将使用户输掉本局,若该方块下无雷,actio nP eformed(Actio nEve nt)方法将显示blockview对象中的标签,该标签上是一个数字,该数字代表当前方块的周围的 8个方块中共有多少颗雷。show()方法是一个递归方法。actionPerformed(ActionEvent)方法执行 时将调用show方法进行扫雷。m ouse Pressed(MouseEve nt)方法是 Min eArea 类实现的 MouseListe ner
13、接口中的方法,当用户按下鼠标有件事mouse Pressed(MouseEve nt)方法负责让方块上显示一个探雷标记。i nquireWinO 方法用来判断用户是否扫雷成功,如果成功该方法负责让record对话框可见。所谓扫雷成功是指不仅找到了全部的累而且用时最少。322模块的划分及调用关系Mai nF rameLedNumberMin eGridAboutDialogCustomDialogImageFactoryLevelI nfoLogDialogUserDialogVoiceJLableJButt on图3.4关系图4系统测试与实现4.1程序测试结果 4.1.1游戏玩家通过右击鼠标来
14、进行扫雷,并显示“雷”S我劑6 开蜡Jib01i雷雷雷雷1D回E3宣n计科2班扫畫玫图4.1扫雷图4.1.2游戏玩家因触到雷而导致游戏结束g 11H秫2M扫S钛件'Ir-111雷雷31111W雷1雷1雷希需图4.2扫雷失败图3伽輸了迭个dft威不ii合你24.1.3游戏玩家扫雷成功4.1.4游戏玩家可选择游戏难度总结这个扫雷游戏是完全模拟微软系统自带的扫雷游戏, 所以难度是很大, 必然 在编程过程中也遇到很多问题, 有些问题比较简单但就不知道错在哪里, 有些大 问题之道在哪就是不知道怎么办才好, 后来经过自己的不断调试, 这个扫雷游戏 终于大功告成。经过编写这个扫雷游戏,我认识到应该注
15、意细节问题,虽然是很小的问题, 但可以提高自己编程的能力, 而且还可以培养自己编程的严谨性, 同时还可以为 以后的编程积累经验。 编写完这个扫雷游戏, 我发现自己有很多的不足, 我想如 果让我来单独来编写这个游戏, 我感觉能编出来的可能性很小, 因为这个游戏涉 及到好多算法。 感触最深的就是我们真的要扎扎实实的打基础! 并且我感觉到只 要我们自己肯下功夫学习, 我们也可以做出很好的东西, 不需要每次都抄袭别人 的,只有自己的才是最珍贵的!123456.7.8.9.参考文献耿祥义. Java 大学实用教程.北京:清华大学出版社,2009.耿祥义. Java 课程设计.北京:清华大学出版社, 20
16、08.王鹏.Java Swing图形界面开发与案例详解.北京:清华大学出版社,2008.丁振凡. Java 语言实验教程.北京:北京邮电大学出版社, 2005.郑莉.孙全党雷之宇,赵玉阳,李茏怡,Java 语言程序设计.北京:清华大学出版社,2006.王吴迪 赵枫朝, Java 程序设计应用教程,电子工业出版社, 2006.2Java 项目开发实践网络篇,中国铁道出版社,Java 从入门到精通,清华大学出版社, 2006.8Java 编程实例讲解,高等教育出版社, 2005.112005.510. 张利国,Java 实用教程案例,北京:清华大学出版社, 2003.10import java.a
17、wt.BorderLayout;/导入边框布局import java.awt.Container;/ 导入一个容器,也是一个组件,在这个容器里你可以添加其他 awt 的组件import java.awt.Font; / 导入字形,字体import java.awt.GridLayout;/导入网格式布局import java.awt.Insets;/ Insets 对象描述容器的边界区域。它指定一个容器在它的各个边界上应留出的空白区间。这个空白可以是一个边界,一个不显示区域或一个标题。import java.awt.event.ActionEvent; / ActionEvent 是一个类,指
18、示发生了组件定义的动作的语义事件。import java.awt.event.ActionListener;/ ActionListener 用于接收操作事件的侦听器接口。继承自 EventListener 。import java.awt.event.MouseAdapter; / 导入鼠标监听适配器,负责对鼠标事件进行监听import java.awt.event.MouseEvent;/ 接口import javax.swing.JButton;/ 导入按钮类import javax.swing.JFrame;/ 导入面板类import javax.swing.JLabel;/ 导入标签
19、类import javax.swing.JMenu; / 菜单import javax.swing.JMenuBar; /用来创建水平菜单栏import javax.swing.JMenuItem; /创建带有设置文本或图标的JMenuItem 菜单项import javax.swing.JPanel; / 面板import javax.swing.Timer; / 定时器, 功能是在指定的时间间隔内反复触发指定窗口的定时器事件。public class ScanLei1 extends JFrame implements ActionListener/扫雷类继承了 JFrame 实现了 Ac
20、tionListener 接口private static final long serialVersionUID = 1L;/ serialVersionUID 用来表明类的不同版本间的兼容性private Container contentPane; /内容面板,每一个 JFrame 对应一个内容面板,所有 的组件应该置于内容面板之上private JButton btn; /声明一个按钮对象,开始按钮,对象名为 btn,private 的意思是 把变量或方法声明成私有的,只有在本类中或本类实例可以访问,其他类不可以private JButton btns;/声明一个按钮数组雷区的每一个雷
21、都是一个按钮,所有按钮放置到该数组中private JLabel b1;/声明一个标签对象,该标签用于放置剩余的雷的个数private JLabel b2; /声明一个标签对象,该标签用于放置已经游戏的时间private JLabel b3; /声明一个标签对象,该标签用于放置游戏的结果private Timer timer;/ 声明一个定时器对象private int row=9;/行,用于指定雷区的行private int col=9;/列 用于指定雷区的列private int bon=10;/布雷的个数private int a;/声明一个int型的二维数组,二维数组的中元素,有以下含
22、义,值为100 ,则说明说明该元素所对应的坐标所在的按钮既不是雷又不是周围有雷的按钮,如果是private int b;/ 声明 int 型的变量 b 剩余雷的个数private int a1;/声明int型数组a1,放置随机数,用于确定雷应该布到雷区的位置private JPanel p,p1,p 2, p3;/ 声明面板public ScanLei1(String title) /定义扫雷的构造方法,该构造方法有个 String 类型的参数,参数名为 titlesuper(title);/调用JFrame的构造方法,将title字符串传入该构造方法,这样的话窗体显示时,标题栏会显示传入的
23、title 值con te ntPan e=getCo nte ntPan e();/获取当前 JFrame对象的内容面板,注意因为ScanLei1类继承了 JFrame对象,所以 ScanLei1的对象也是 JFrame对象setSize(300,400);/设置扫雷窗体的大小事300*400像素this.setBounds(400, 100, 400, 500);/ setBounds(x,y,width,height); x:组件在容器 X轴上的起点y:组件在容器丫轴上的起点width:组件的长度height:组件的高度setDefaultCloseOperation(JFrame.EX
24、IT_ON_CLOSE); /设置当点击窗体右上角的X 按钮时的窗体的行为,这里设置的是当点击这个按钮时关闭并退出程序,没有设置的话timer =new Timer(1000,(ActionListener) this);/ 每隔 1000 毫秒触发一次动作事件的监听a = new introw+2col+2;/创建数组a,a是一个二维数组,数组时 11列,11行initGUI();/调用初始化图形界面方法public void initGUI()/ 声明初始化图形界面方法p3=new JPanel();/ 创建一个面板b=bon;/将bon的值赋值给变量bJMenuBar menuBar=n
25、ew JMenuBar();/ 创建一个菜单栏对象JMenu menu1=new JMenu(" 游戏");/创建游戏菜单JMenu menu2=new JMenu(" 帮助");/创建帮助菜单JMenuItem mi1=new JMenuItem(" 初级 ");/创建初级菜单项JMenuItem mi2 = new JMenuItem(" 中级 ");/创建中级菜单项JMenuItem mi3 =new JMenuItem(" 高级 ") ; /创建高级菜单项mi1.addActionLis
26、tener(this);/ 为初级菜单项加入动作事件监听器,当你单击鼠标左键点初级菜单项时会执行 actionPerformed(ActionEvent e) 方法menu1.add(mi1);mi2.addActionListener(this);menu1.add(mi2);mi3.addActionListener(this);menu1.add(mi3);/以上几个操作类似men uBar.add(me nu1); 将游戏菜单加入到菜单栏men uBar.add(me nu2);/将帮助菜单加入到菜单栏p3.add(menuBar); / 将菜单栏加入到 p3 面板上去b1=new J
27、Label(bon+"");/ 创建一个标签 ,标签的内容是 bon 的值 10 a1=new intbon;/ 创建 a1 数组,数组的长度为 10 btn =new JButton(" 开始 ");/ 创建开始按钮btn.addActionListener(this);/ 为开始按钮加入动作事件监听器b2=new JLabel("0");/ 创建标签 b2, b2 的内容是 0 b3=new JLabel("");/ 创建标签 b3,b3 暂时内容为空btns=new JButtonrow*col;/创建一个按
28、钮数组,数组的个数为row*col,这个程序中就是 9*9 个,每一个雷的位置就是一个按钮p=new JPanel();/ 创建一个面板p.setLayout(new BorderLayout(); /设置容器的边框布局,边框布局的样式大致是这样contentPane.add(p); / 将 panl 放置到内容面板上去,为什么将一个面板放到内panl 上最多可以直接放置五个容面板,而不是将组件放到内容面板上去呢,你可以看到p.add(p3,BorderLayout.NORTH);/p3 添加到面板的北边,也就是在北边放上了菜单栏,结果就如图了/combo=new JComboBox(new
29、Object" 初级 ","中级 ","高级 " );/加监听 /*combo.addItemListener(new ItemListener();*/p1=new JPanel();/ 创建一个面板/Alignment 列队/在那个位置 /(FlowLayout)p1.getLayout().setAlignment(FlowLayout.RIGHT);p1.add(b1);/将标签b1添加到面板上 p1.add(bt n);/将开始按钮添加到面板上 p1.add(b2);/将标签b2添加到面板上 p1.add(b3);/将标签b
30、3添加到面板上p.add(p3,BorderLayout.NORTH);/ 这行代码重复 还是将菜单栏加入到窗体的北边p.add(p1,BorderLayout.CENTER);/ 将带有一个开始按钮, 三个标签的按钮加入到窗体的中间位置p2=new JPanel();/ 创建面板 p2p2.setLayout(new GridLayout(row,col,0,0); / GridLayout 网格布局, p2 设置为网格布局,该布局的最多可以 9 行 9 列,正好可以放置 81 个雷按钮,按钮和按钮之间的水for(int i=0;i<row*col;i+)/ 为按钮数组赋值,此处的作用
31、是创建 81 个雷按钮对象btnsi=new JButton("");/ 创建雷按钮btnsi.setMargin(new Insets(0,0,0,0);/ 设置雷按钮与其他组件的间距btnsi.setFont(new Font(null,Font.BOLD,25); / 设置字体字形。黑体 25px btnsi.addActionListener(this);/ 为雷按钮添加监听器,监听动作事件btnsi.addMouseListener(new NormoreMouseEvent();/ 添加鼠标监听器, 监听普通鼠标事件p2.add(btnsi);/ 将雷按钮添加到
32、面板 p2 上contentPane.add(p,BorderLayout.NORTH);contentPane.add(p2,BorderLayout.CENTER);/ 将 p2 添加到窗体的中间public void go()/创建 go 方法go 方法将go 方法将setVisible(true);/ 设置是否显示窗体,设置为 true 就是显示当前窗体public static void main(String args)/ 主方法,作用是实例化窗体对象,调用 窗体显示到屏幕上来new ScanLei1("11 计科 2 班扫雷软件 ").go(); /实例化窗体
33、对象,调用窗体显示到屏幕上来public void out(int a,JButton btns,ActionEvent e,int i,int x,int y)int p=1;if(axy=0)/ 如果一个按钮既不是雷周围又没有雷axy=10;/ 将该按钮对应的值设置为 10btnsi.setEnabled(false);/且这个按钮不可用状态for(int l=y-1;l<=y+1;l+)/ 排除按钮左右的位置int m=x-1-1;/ 上两行int n=l-1;/ 左两列p=1;System.out.println(a12);if(n>-1&&n<col
34、&&m>-1&&m<row) / 如果 n 值和 m 值在雷区的范围之内for(int q=0;q<row&&p=1;q+)/col->row;if(n+col*q)>=(m*col)&&(n+col*q)<(m+1)*col)if(ax-1l!=0&&ax-1l!=10)/ 如果该按钮上一行前面左右的按钮相应位置的值既不是雷又没雷且又不是已经btnsn+col*q.setText(ax-1l+"");/ 那 么 应该将周围雷的个数显示到按钮上去ax-1l=1
35、0;/ 设置按钮对应的位置值是 10 btnsn+col*q.setEnabled(false);/ 设置按钮不可用else if(ax-1l=0)/ 如果这个按钮上一行前面和左右方向仍然是既不是雷又不是周围有雷,那么递归判断这个/ax-1l=10;out(a,btns,e,n+col*q,x+1,l);/55/out(a,btns,e,n+col*q,x-1,l); /55/ ax-1l=10;btnsn+col*q.setEnabled(false);p=0;p=1;m=x;if(n>-1&&n<col&&m>-1&&m&l
36、t;col)/ 如果该按for(int q=0;q<row&&p=1;q+)if(n+col*q)>=(m*col)&&(n+col*q)<(m+1)*col)钮下一行后面以及左右的按钮相应位置的值既不是雷又没雷且又不if(ax+1l!=0&&ax+1l!=10)btnsn+col*q.setText(ax+1l+"");ax+1l=10;btnsn+col*q.setEnabled(false);else if(ax+1l=0)/如果这个按钮下一行后面和左右方向仍然是既不是雷又不是周围有雷,那么递归判断这个
37、按钮周围的其他按钮是什么情况ax+1l=10;btnsn+col*q.setEnabled(false);p=0;int m=x-1;int n=y-1-1;p=1;if(n>-1&&n<col&&m>-1&&m<col)for(int q=0;q<row&&p=1;q+)if(n+col*q)>=(m*col)&&(n+col*q)<(m+1)*col)if(axy-1!=0&&axy-1!=10)btnsn+col*q.setText(axy-1+&qu
38、ot;");axy-1=10;btnsn+col*q.setEnabled(false);else if(axy-1=0)out(a,btns,e,n+col*q,x,y-1);axy-1=10;btnsn+col*q.setEnabled(false);p=0;p=1;m=x-1;n=y+1-1;if(n>-1&&n<col&&m>-1&&m<col)for(int q=0;q<row&&p=1;q+)if(n+col*q)>=(m*col)&&(n+col*q)&l
39、t;(m+1)*col)if(axy+1!=0&&axy+1!=10)btnsn+col*q.setText(axy+1+"");axy+1=10;btnsn+col*q.setEnabled(false);else if(axy+1=0)out(a,btns,e,n+col*q,x,y+1);axy+1=10;btnsn+col*q.setEnabled(false);p=0;public void actionPerformed(ActionEvent e) if(e.getActionCommand()=" 初级 ")/ 如果你单击
40、的是游戏菜单中初级菜单项row=9;/ 设置雷的行数是 9 col=9;/ 列数是 9 bon=10;a1=new intbon;b=bon;/setSize(297,377);a = new introw+2col+2;this.remove(p2);/ 从窗体中央移除雷区面板timer.stop();/ 计时器停止b1.setText("10");/ 设置标签 b1 的内容为 10 b2.setText("0");/b2 的标签内容为 0 b3.setText("");/b3 的标签内容为空btns=new JButtonrow*
41、col;/ 创建雷区雷按钮数组p2=new JPanel();/ 重新创建面板 p2p2.setLayout(new GridLayout(row,col,0,0);/ 设置 p2 为网格布局,同样还是 9行 9 列,每一个单元格放一个雷for(int i=0;i<row*col;i+)btnsi=new JButton("");/为每一个雷按钮实例化一个按钮对象btnsi.setMargin(new Insets(0,0,0,0);/ 设置雷按钮的间距btnsi.setFont(new Font(null,Font.BOLD,25);/ 设置雷按钮上文字的字体为黑体
42、 25pxbtnsi.addActionListener(this);/ 添加动作事件监听器btnsi.addMouseListener(new NormoreMouseEvent();/ 添加普通按钮事件监听器p2.add(btnsi);/ 将雷按钮放置到 p2 面板上contentPane.add(p2,BorderLayout.CENTER);/setSize(297,377);this.pack();/ 设置窗体的大小为紧紧包容着所有组件for(int i=0;i<row*col;i+)btnsi.setText(" ");/ 设置所有雷按钮的内容为空格btn
43、si.setEnabled(true);/ 设置所有雷按钮为可用状态for(int i=0;i<row+2;i+)for(int j=0;j<col+2;j+)aij=0;/ 将二维数组 a 的所有元素初始化为 0else if(e.getActionCommand()=" 中级 ")row=16;/ 设置雷区有 16*16 个雷 以下代码作用和选初级时相同,不再注释了col=16;bon=40;/setSize(33*col,33*row+80);a1=new intbon;a = new introw+2col+2;b=bon;this.remove(p2)
44、;timer.stop();b1.setText("40");b2.setText("0");b3.setText("");btns=new JButtonrow*col;p2=new JPanel();p2.setLayout(new GridLayout(row,col,0,0);for(int i=0;i<row*col;i+)btnsi=new JButton("");btnsi.setMargin(new Insets(0,0,0,0);btnsi.setFont(new Font(null,Fon
45、t.BOLD,25);btnsi.addActionListener(this);btnsi.addMouseListener(new NormoreMouseEvent();p2.add(btnsi);contentPane.add(p2,BorderLayout.CENTER);this.pack();/setSize(33*col,33*row+80);for(int i=0;i<row*col;i+)btnsi.setText("");btnsi.setEnabled(true);for(int i=0;i<row+2;i+)for(int j=0;j&
46、lt;col+2;j+)aij=0;else if(e.getActionCommand()=" 高级 ")/ 如果选择的是高级菜单项row=16;/ 设置雷区是 16*32 以下代码和初级游戏代码作用相同,不在注释了col=32;bon=99;setSize(33*col,33*row+80);a1=new intbon;a = new introw+2col+2;b=bon;this.remove(p2);timer.stop();b1.setText("99");b2.setText("0");b3.setText("
47、");btns=new JButtonrow*col;p2=new JPanel();p2.setLayout(new GridLayout(row,col,0,0);for(int i=0;i<row*col;i+)btnsi=new JButton("");btnsi.setMargin(new Insets(0,0,0,0);btnsi.setFont(new Font(null,Font.BOLD,25);btnsi.addActionListener(this);btnsi.addMouseListener(new NormoreMouseEven
48、t();p2.add(btnsi);contentPane.add(p2,BorderLayout.CENTER);/setSize(33*col,33*row+80);this.pack();for(int i=0;i<row*col;i+)btnsi.setText("");btnsi.setEnabled(true);for(int i=0;i<row+2;i+)for(int j=0;j<col+2;j+)aij=0;if(e.getSource()=btn)/ 如果点击了开始按钮timer.start();/ 计时器开始计时b=bon;b3.se
49、tText("");/ 设置标签 b3 的内容为空/System.out.println(bon);/清空for(int i=0;i<row*col;i+)btnsi.setText("");/ 设置所有的雷区的雷按钮的内容为空btnsi.setEnabled(true);/ 设置所有雷按钮可用,也就是可以单击的状态for(int i=0;i<row+2;i+)for(int j=0;j<col+2;j+)aij=0;/ 初始化数组 a 所有元素为 0 值/产生随机数,随机数的作用用于布雷时随机的指定雷所在的位置,for(int i=0
50、;i<bon;i+) int p=1;int m=(int)(Math.random()*row*col);/ 产生一个 0-雷按钮数的整数 while(p=1)int l=1;int j;for( j=0;j<i&&l=1;j+)/ 遍历数组,查看 m 值是否已经产生过了,如果数组a1中已经有m值,重新产生 m值,如果没有产生 m值,那么将 m值赋值if(a1j=m)m=(int)(Math.random()*row*col);l=0;if(j=i)a1i=m;p=0;b1.setText(bon+"");b2.setText("0&
51、quot;);/布雷for(int i=0;i<bon;i+)int x=(a1i/col+1);int y=(a1i%col+1);axy=100;/ 布雷的位置的值为 100for(int i=0;i<row+2;i+)for(int j=0;j<col+2;j+)if(i=0|j=0|i=row+1|j=col+1)aij=0;/指定雷区四周位置的值为 0for(int i=1;i<=row;i+)for(int j=1;j<=col;j+)if(aij!=100)/ 如果 aij 不等与 100,就说明这个位置的雷按钮不是地雷,是安全的,但是安全的按钮上通
52、常是要显示该按钮附近有几个雷的for(int l=j-1;l<=j+1;l+)if(ai-1l=100)aij+;/ 如果 i 和 j 值对应的按钮上一行前后左右有雷的话 aij的值加if(ai+1l=100)aij+;/ 如果 i 和 j 值对应的按钮下一行前后左右有雷的话 aij的值加if(aij-1=100)aij+;/ 如果同一行左侧有雷 aij 值加 1if(aij+1=100)aij+ ;/ 如果同一行右侧有雷 aij 值加 1if(e.getSource()=timer)/ 如果监听器监听到定时器产生动作事件String time=b2.getText().trim();/ 获取 b2 标签的内容的值int t=Integer.parseInt(time);/ 将 b2 标签的内容转化为整数/System.out.println(t);if(t>=600)/ 如果该值大于 600,则定时器停止timer.stop();elset+;/如果t小于600, t在原来基础上加1 b2.setText(t+"");/ 然后将时间设置到 b2 标签上作为标签的内容for(i nt i=0;i<col*row;i+)if(btnsi.getT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中职保险公估(保险公估基础)试题及答案
- 2025年大学产品设计(产品造型设计)试题及答案
- 2026年中职第二学年(酒店管理)餐饮服务规范试题及答案
- 2025年中职(环境监测)环境监测技术试题及答案
- 2025年中职(旅游服务与管理)旅游心理学阶段测试题及答案
- 2025年大学三年级(工业互联网技术)工业网络应用阶段测试试题及答案
- 《儿童金融教育 App 计划书》
- 深度解析(2026)《GBT 18310.45-2003纤维光学互连器件和无源器件 基本试验和测量程序 第2-45部分试验 浸水耐久性》
- 深度解析(2026)《GBT 18247.1-2000主要花卉产品等级 第1部分鲜切花》(2026年)深度解析
- 深度解析(2026)《GBT 17980.115-2004农药 田间药效试验准则(二) 第115部分杀菌剂防治大白菜霜霉病》
- 简单词考研英语5500单词表
- 学术论文文献阅读与机助汉英翻译智慧树知到答案2024年重庆大学
- 译林英语苏教版教学实践经验
- (高清版)TDT 1013-2013 土地整治项目验收规程
- 洁净工作台性能参数校准规范
- 如果历史是一群喵16
- 华为HCIA存储H13-611认证培训考试题库(汇总)
- 美国史智慧树知到答案章节测试2023年东北师范大学
- GB/T 15924-2010锡矿石化学分析方法锡量测定
- GB/T 14525-2010波纹金属软管通用技术条件
- GB/T 11343-2008无损检测接触式超声斜射检测方法
评论
0/150
提交评论