【Java精品源码栏目提醒】:网学会员鉴于大家对Java精品源码十分关注,论文会员在此为大家搜集整理了“java扫雷游戏课程设计报告_带有详细注释 - 大学课件”一文,供大家参考学习
《高级语言程序设计2》 课程设计任务书 题 目 扫雷游戏程序 学生姓名 王大伟 学号 201001010117 专业班级 计算 1001 【问题描述】 整个扫雷游戏程序的整体布局为:CardLayout 布局 采用了菜单、按钮、面板…… 等组件,菜单主要包括开始,选择级别,按钮的功能是重新开始新的游戏。
【软件功能】 1, 用户可以玩扫雷游戏并能自定义级别(初等,中等,高等) 2, 具有计时功能,即显示用户完成移动盘子所花费的时间。
【基本要求】 1,扫雷游戏分为初级、中级和高级三个级别。
单击游戏菜单可以选择“初级”、 。
“中级”和“高级” 设 “开始” 2,选择级别后将出现相应级别的扫雷区域,这时用户使用鼠标左键单击‘ 计 便启动计时器。
内 3,用户要揭开某个方块,可左键单击它。
若所揭方块下有雷,用户便输了这一局, 容 若所揭方块下无雷,则显示一个数字,该数字代表方块的周围的 8 个方块中共有多少 与 颗雷。
要 4,如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是 求 雷的图标,即给出一个扫雷标记。
用户每标记出一个扫雷标记无论用户的标记是否正 确,程序将显示的剩余雷数减少一个。
5,当用户点中雷时,将有“你输了”的提示出现,胜利时,将有“你赢了”的提 示出现。
6,源程序中要有充分的注释,报告中要有详细的流程图和文字材料。
7,运行的结果以及图形用户界面要进行屏幕拷贝,插入报告中。
【提交成果】 1“《高级语言程序设计2》课程设计任务书”和“《高级语言程序设计2》
课程 设计
报告”打印件各一份; 2 先将上面两项内容的
word 文档,通过电子邮件交到指导教师,待许可后,打 印装袋。
起止时间 指导教师签名系(教研室)主任签名 学生签名任务书限定一页附:课程
设计报告格式 》课程设计报告 《高级语言程序设计(2) 专业 班级 学号 姓名(签名) 完成日期 指导教师(签名) 1、 程序设计说明书 【设计题目】 扫雷游戏程序 【问题描述】 整个扫雷游戏
程序的整体布局为:CardLayout 布局 采用了菜单、按钮、面板……等组件,菜单主要包括开始,选择级别,按钮的功能是重新开始新的游戏。
【
软件功能】 ; 用户可以玩扫雷游戏并能自定义级别(初等,中等,高等) 具有计时功能,即显示用户完成移动盘子所花费的时间。
【算法思想】 1,计算按钮周围雷数。
2,随机分布。
扫雷游戏要求在 M 行 N 列的网格游戏区随即 雷 且 的不上 bon 个 , bon 的取值应小于 M 和 N 的乘积。
这可以在一张 MN 的网格上通过均匀分布 的随即算法视线。
其中 bon 的网格是雷区,剩下的网格是非雷区。
游戏的目标是尽可能快地找到所 有的雷区,而不踩到地雷。
Java 提供了视线随即算法的类 Math,通过 Math 类的 random()方法这 可以很方便的实现随即布雷的功能。
【类的设计】 1initMineAreaintintintint方法可根据参数提供的数据设置雷区的宽度、高度以及雷区的级别。
2actionPerformedActionEvent是 MineArea 类实现的 ActionListener 接口中的方法。
当用户单击 blockView 中的某个方块时,actionPerformedActionEvent方法负责执行有关算法,例如,当用鼠标左键单击方块上的按钮后,若该方块下有雷,actionPerformedActionEvent方法将使用户输掉本局,若该方块下无雷,actionPerformedActionEvent方法将显示 blockView 对象中的标签,该标签上是一个数字,该数字代表当前方块的周围的 8 个方块中共有多少颗雷。
3show方法是一个递归方法。
actionPerformedActionEvent方法执行时将调用 show 方法进行扫雷。
4mousePressedMouseEvent方法是 MineArea 类实现的 MouseListener 接口中的方法,当用户按下鼠标有件事 mousePressedMouseEvent方法负责让方块上显示一个探雷标记。
5inquireWin方法用来判断用户是否扫雷成功,如果成功该方法负责让 record 对话框可见。
所谓扫雷成功是指不仅找到了全部的累而且用时最少。
【用户界面】【程序技巧】运用二维数组来判断雷区的每一个按钮是否有雷。
当单击 blockView 中的某个方块时,actionPerformedActionEvent 方 法 负 责 执 行 有 关 算 法 。
当 按 下 鼠 标 有 件 事mousePressedMouseEvent方法负责让方块上显示一个探雷标记。
inquireWin方法用来判断用户是否扫雷成功,如果成功该方法负责让 record 对话框可见。
【模块划分及调用关系】 MainFrame LedNumber MineGrid AboutDialog CustomDialog ImageFactory LevelInfo LogDialog UserDialog Voice JLable JButton【模块流程图】 开始 定义并初始化 MineGrid 类 获取相应的设 置,并为方 块产 生随即数字赋值 计数器数小于 等级雷数 鼠标是否 存放赋值雷区,计 点击 数器加 1 处理周围信息,并显 示相应效果 开始【运行说明】运用 JDK 环境下或 eclipse 运行。
2、 程序上机调试报告 )导致程序运行时出现大量错误。
2,【语法错误及其排除】1,不止一次忘记行程序后面的分号(;程序后面的注释要加//,而多次忘记双斜杠或者直接写成单斜杠。
3,if,else 语句不是很熟悉导致了许多不该犯的错误。
4,将和混淆,导致了不少语法错误。
【算法错误及其排除】在设计排雷的过程中,一个雷区中的一个按钮的周围通常是八个相邻的按钮而不是四个,致使在程序算法设计的过程中没有充分考虑到,最后才加上。
还有 actionPerformed是 MineArea 类实现的 ActionListener 接口中的方法。
当用户单击 blockView 中的某个方块时,actionPerformedActionEvent方法负责执行有关算法,例如,当用鼠标左键单击方块上的按钮后,若该方块下有雷,actionPerformedActionEvent方法将使 用 户 输 掉 本 局 , 若 该 方 块 下 无 雷 , actionPerformedActionEvent 方 法 将 显 示blockView 对象中的标签,该标签上是一个数字,该数字代表当前方块的周围的 8 个方块中共有多少颗雷。
此方法开始运用不恰当,导致若方块下有雷,依然显示标签上的数字,最后运行检查的时候才发现错误,得以改正。
3、 程序测试结果【输出结果】 【收获及体会】这个扫雷游戏是完全模拟微软
系统自带的扫雷游戏,所以难度是很大,必然在编程过程中也遇到很多问题,有些
问题比较简单但就不知道错在哪里,有些大问题之道在哪就是不知道怎么办才好,后来经过自己的不断调试,这个扫雷游戏终于大功告成。
经过编写这个扫雷游戏,我认识到应该注意细节问题,虽然是很小的问题,但可以提高自己编程的能力,而且还可以培养自己编程的严谨性,同时还可以为以后的编程积累经验。
编写完这个扫雷游戏,我发现自己有很多的不足,我想如果让我来单独来编写这个游戏,我感觉能编出来的可能性很小,因为这个游戏涉及到好多算法。
感触最深的就是我们真的要扎扎实实的打基础!并且我感觉到只要我们自己肯下功夫
学习,我们也可以做出很好的东西,不需要每次都抄袭别人的,只有自己的才是最珍贵的! 4、 源程序代码(注释) import
java.awt.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 是一个类,指示发生了组件定义的动作的语义事件。
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//导入标签类 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 实现了 ActionListener 接口 private static final long serialVersionUID 1L // serialVersionUID 用来表明类的不同版本间的兼容性 private Container contentPane //内容面板,每一个 JFrame 对应一个内容面板,所有的组件应该置于内容面板之上 private JButton btn //声明一个按钮对象,开始按钮,对象名为 btnprivate 的意思是把变量或方法声明成私有的,只有在本类中或本类实例可以访问,其他类不可以 private JButton btns//声明一个按钮数组 雷区的每一个雷都是一个按钮,所有按钮放置到该数组中 private JLabel b1//声明一个标签对象该标签用于放置剩余的雷的个数 private JLabel b2 //声明一个标签对象,该标签用于放置已经游戏的时间 private JLabel b3 //声明一个标签对象,该标签用于放置游戏的结果 private Timer timer//声明一个定时器对象 private int row9 //行,用于指定雷区的行 private int col9 //列 用于指定雷区的列 private int bon10 //布雷的个数 private int a//声明一个 int 型的二维数组,二维数组的中元素,有以下含义,值为 0 说明该元素所对应的坐标所在的按钮既不是雷又不是周围有雷的按钮,如果是 100,则说明该元素所对应的坐标所在的按钮时雷,如果该元素是 10,在说明对应的坐标所在的按钮已经被单击过,如果不是以上几个值,则这个元素的值代表了该按钮附近可能有几颗雷。
private int b//声明 int 型的变量 b 剩余雷的个数 private int a1//声明 int 型数组 a1,放置随机数,用于确定雷应该布到雷区的位置 private JPanel pp1p2p3//声明面板 public ScanLei1String title //定义扫雷的构造方法,该构造方法有个 String 类型的参数,参数名为 title supertitle//调用 JFrame 的构造方法,将 title 字符串传入该构造方法,这样的话窗体显示时,标题栏会显示传入的 title 值 contentPanegetContentPane//获取当前 JFrame 对象的内容面板, 注意因为 ScanLei1 类继承了 JFrame 对象,所以 ScanLei1 的对象也是 JFrame 对象 setSize300400//设置扫雷窗体的大小事 300400 像素 this.setBounds400 100 400 500 // setBoundsxywidthheight x:组件在容器 X 轴上的起点 y:组件在容器 Y 轴上的起点 width:组件的长度 height:组件的高度, 在这里的意思就是该窗体打开时,会以屏幕的左上角为原点的水平方向是 400 像素,垂直方向是 100 像素的位置显示,后面设置的400500 像素指的是窗体的大小,所以最终窗体的大小是 400500 像素,覆盖掉了上面 setSize300400的值 setDefaultCloseOperationJFrame.EXIT_ON_CLOSE //设置当点击窗体右上角的 X 按钮时的窗体的行为,这里设置的是当点击这个按钮时关闭并退出程序,没有设置的话默认点关闭时只是隐藏窗体在后台进程中还可以看到 timer new Timer1000ActionListener this//每隔 1000 毫秒触发一次动作事件的监听 a new introw2col2//创建数组 a,a 是一个二维数组,数组时 11 列,11 行 initGUI //调用初始化图形界面方法 public void initGUI//声明初始化图形界面方法 p3new JPanel//创建一个面板 bbon//将 bon 的值赋值给变量 b JMenuBar menuBarnew JMenuBar//创建一个菜单栏对象 JMenu menu1new JMenuquot游戏quot//创建游戏菜单 JMenu menu2new JMenuquot帮助quot//创建帮助菜单 JMenuItem mi1new JMenuItemquot初级quot//创建初级菜单项 JMenuItem mi2 new JMenuItemquot中级quot//创建中级菜单项 JMenuItem mi3 new JMenuItemquot高级quot//创建高级菜单项 mi1.addActionListenerthis//为初级菜单项加入动作事件监听器,当你单击鼠标左键点初级菜单项时会执行 actionPerformed ActionEvent e方法 menu1.addmi1 mi2.addActionListenerthis menu1.addmi2 mi3.addActionListenerthis menu1.addmi3//以上几个操作类似 menuBar.addmenu1//将游戏菜单加入到菜单栏 menuBar.addmenu2//将帮助菜单加入到菜单栏 p3.addmenuBar //将菜单栏加入到 p3 面板上去 b1new JLabelbonquotquot//创建一个标签标签的内容是 bon 的值 10 a1new intbon//创建 a1 数组,数组的长度为 10 btn new JButtonquot开始quot//创建开始按钮 btn.addActionListenerthis//为开始按钮加入动作事件监听器 b2new JLabelquot0quot//创建标签 b2,b2 的内容是 0 b3new JLabelquotquot//创建标签 b3,b3 暂时内容为空 btnsnew JButtonrowcol//创建一个按钮数组,数组的个数为 rowcol,这个程序中就是99 个,每一个雷的位置就是一个按钮 pnew JPanel//创建一个面板 p.setLayoutnew BorderLayout //设置容器的边框布局,边框布局的样式大致是这样北东 中 西南 这样的话这个 panl 中就可以放置五个组件了 contentPane.addp // 将 panl 放置到内容面板上去,为什么将一个面板放到内容面板,而不是将组件放到内容面板上去呢,你可以看到 panl 上最多可以直接放置五个组件或者容器,但如果将组件或者容器直接放置到内容面板上去的话,就只能放一个组件或者容器了。
p.addp3BorderLayout.NORTH//p3 添加到面板的北边,也就是在北边放上了菜单栏,结果就如图了游戏 帮助东 中 西南 //combonew JComboBoxnew Objectquot初级quotquot中级quotquot高级quot //加监听 /combo.addItemListenernew ItemListener / p1new JPanel//创建一个面板 //在那个位置 //FlowLayoutp1.getLayout.setAlignmentFlowLayout.RIGHT //Alignment 列队 p1.addb1//将标签 b1 添加到面板上 p1.addbtn//将开始按钮添加到面板上 p1.addb2//将标签 b2 添加到面板上 p1.addb3//将标签 b3 添加到面板上 p.addp3BorderLayout.NORTH//这行代码重复 还是将菜单栏加入到窗体的北边 p.addp1BorderLayout.CENTER//将带有一个开始按钮,三个标签的按钮加入到窗体的中间位置游戏 帮助东 10 开始 0 西南 p2new JPanel//创建面板 p2 p2.setLayoutnew GridLayoutrowcol00 // GridLayout 网格布局,p2 设置为网格布局,该布局的最多可以 9 行 9 列,正好可以放置 81 个雷按钮,按钮和按钮之间的水平间隔,垂直间隔都为0px forint i0iltrowcoli//为按钮数组赋值,此处的作用是创建 81 个雷按钮对象 btnsinew JButtonquotquot//创建雷按钮 btnsi.setMarginnew Insets0000//设置雷按钮与其他组件的间距 btnsi.setFontnew FontnullFont.BOLD25 //设置字体字形。
黑体 25px btnsi.addActionListenerthis//为雷按钮添加监听器,监听动作事件 btnsi.addMouseListenernew NormoreMouseEvent//添加鼠标监听器,监听普通鼠标事件 p2.addbtnsi//将雷按钮添加到面板 p2 上 contentPane.addpBorderLayout.NORTH contentPane.addp2BorderLayout.CENTER//将 p2 添加到窗体的中间游戏 帮助东 10 开始 0 西南 public void go //创建 go 方法 setVisibletrue//设置是否显示窗体,设置为 true 就是显示当前窗体 public static void mainString args//主方法,作用是实例化窗体对象,调用 go 方法将窗体显示到屏幕上来 new ScanLei1quot扫雷 By 信息 1001 樊康quot.go //实例化窗体对象,调用 go 方法将窗体显示到屏幕上来 public void outint aJButton btnsActionEvent eint iint xint y int p1 ifaxy0//如果一个按钮既不是雷周围又没有雷 axy10//将该按钮对应的值设置为 10 btnsi.setEnabledfalse //且这个按钮不可用状态 forint ly-1llty1l//排除按钮左右的位置 int mx-1-1//上两行 int nl-1//左两列 p1 System.out.printlna12 ifngt-1ampampnltcolampampmgt-1ampampmltrow //如果 n 值和 m 值在雷区的范围之内 forint q0qltrowampampp1q//col--gtrow ifncolqgtmcolampampncolqltm1col .