java课程设计(扫雷游戏)
JAVA课程设计扫雷含代码

0
随机生成:使用随 机数生成器生成地 图
地图大小:根据游 戏难度设置地图大 小
地雷分布:在地图 上随机分布地雷
标记地雷:在地图 上标记地雷位置, 方便玩家识别
雷区标记逻辑
初始化:创建雷区数组,设置初始状态 标记雷区:当玩家点击雷区时,标记为雷区 更新雷区:当玩家点击非雷区时,更新雷区状态 判断胜负:当所有非雷区都被标记时,游戏结束,判断胜负
游戏结束:当所有非雷方格都被点击,或者玩家踩到雷时,游戏结束
游戏界面设计
游戏界面分为两个部分:游戏区和菜单区 游戏区显示游戏地图和地雷位置 菜单区包括开始游戏、暂停游戏、重新开始、退出游戏等按钮 游戏界面采用简洁明了的设计风格,易于玩家操作和理解
游戏流程控制
初始化游戏:创建游戏界面,设置游戏参数 玩家输入:接收玩家输入的坐标,判断是否合法 游戏逻辑:根据玩家输入,更新游戏状态,判断是否触发雷 游戏结束:判断游戏是否结束,显示游戏结果 重新开始:提供重新开始游戏的选项,重新开始游戏流程
05
JAVA扫雷游戏代码实 现
游戏主程序代码实现
初始化游戏界面 生成随机雷区 玩家点击操作 判断输赢条件 游戏结束处理
游戏地图类代码实现
初始化地图,设置地雷位置 和状态
创建游戏地图类,定义地图 大小和地雷数量
实现地图显示,绘制地雷和 空白区域
实现地图更新,根据玩家操 作更新地雷状态和显示
游戏雷区类代码实现
感谢您的观看
汇报人:
兼容性:测试游戏在不同操作系统 和硬件配置下的兼容性
添加标题
添加标题
添加标题
添加标题
稳定性:测试游戏在长时间运行下 的稳定性
用户体验:测试游戏的易用性和用 户体验
JAVA课程设计扫雷小游戏

Java游戏设计报告院系计算机科学学院班级计科11002姓名张林峰设计日期2012.12.18—2012.12.291·设计内容及要求1.1·扫雷小游戏的基本要求扫雷小游戏主要采用Java语言编写,适合windows XP以下的系统,以eclipse 为平台。
具体要求如下:<1>扫雷小游戏分为初级、中级和高级三个级别,扫雷排行榜保存着每个级别的最好成绩,即挖出全部的地雷并且用时最少。
单机游戏菜单选择“初级”、“中级”和“高级”。
<2>游戏默认的是初级级别,用户可以选择不同级别将出现对应级别的扫雷区域,单击扫雷区域任一方格以便启动计时器。
<3>用户选择某个方格,单击它就行。
若所选择的放阁下有雷,这一局就结束了,若所选择方格下无雷,则会显示一个数字,该数字代表方格周围8个方格中共有几颗雷。
<4>如果用户认为某个方格下有雷,单击右键可以在方格上标记一个用户认为是雷的图标(一个小旗子)。
<5>用户可以选择标记为疑问的方格,可以选择游戏菜单下的标记,或者双击右键所选方格显示(?)图标。
<6>扫雷完成后,程序弹出保存成绩的对话框,用户可以根据自身选择是否保存。
<7>如果用户喜欢有提示音,可以选择游戏菜单中的声音选项,单击扫雷区域任一方格,就会听到吧嗒声。
当点中地雷时,将会有爆炸声音响起,胜利后,将播放凯旋的旋律。
1.2需求实现的主要功能(1)该游戏具有计时功能,即扫完全部地雷所花费的时间。
(2)用户可以选择是否有音效。
(3)用户可以自定义级别,还可以输入任意地雷数。
(4)自动保存扫雷排行榜。
2·需求分析2.1扫雷区域的布局设计系统的整体布局为:CardLayout布局,采用菜单、按钮、面板……等组件,菜单项主要有开始,选择级别,自定义,标记,声音,扫雷排行榜,退出,按钮的功能是重新开始游戏(可以选择游戏菜单里的开局,也可以点击企鹅图标重新开始游戏)。
(完整word版)JAVA课程设计--扫雷游戏

合肥学院计算机科学与技术系课程设计报告2009~2010学年第二学期课程Java语言与应用课程设计名称扫雷游戏学生姓名胡远远学号0604031005专业班级07网络工程一班指导教师许强张贯虹2010年09月1.设计内容及要求1.1 扫雷游戏的基本要求Windows 2000/XP系统提供的扫雷游戏是一个很有趣的游戏。
本章的课程设计使用Java语言编写一个与其类似的扫雷游戏。
具体要求如下:(1)选择级别后将出现相应级别的扫雷区域,这是用户使用鼠标左键单击雷区中任何一个方块便启动计时器。
(2)用户要揭开某个方块,可单击它。
若所揭方块下有雷,用户便输了这一局,若所揭方块下五雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。
(3) 如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。
用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。
(4)扫雷胜利后,显示游戏胜利。
(5) 用户可以右击空格,可以选择标记为“旗帜”、“问号”或者返回成空格。
1.2 需实现的主要功能(1)用户点击笑脸实现复位操作。
调用repaint()和validate()函数对界面进行重置以及刷新操作(2)可以显示用户完全扫雷成功所花时间。
文本框TF记录扫雷成功所花的时间(3)在失败和胜利后跳出失败或胜利的文本框JoptionPane 该类用来调出对话框并提示胜利2.需求分析2.1 扫雷棋盘的布局设计系统的整体布局为:CardLayout布局, 采用了文本框、按钮、面板、框架…等组件,菜单主要有run按钮笑脸和哭脸,按钮的功能是重新开始新的游戏。
2.2 雷区的设计MineArea类是javax.swing包中Jpanel容器的子类,实现了ActionListener 和MouseListener接口,所创建的对象:mineArea是MineGame类中最重要的成员之一,作为一个容器添加到MineGame窗口的中心。
java扫雷课程设计

java 扫雷 课程设计一、课程目标知识目标:1. 理解并掌握Java基本语法和程序结构;2. 学会使用二维数组存储和处理扫雷游戏的数据;3. 掌握循环、条件判断等基本编程逻辑;4. 了解随机数的生成和应用。
技能目标:1. 能够编写并调试简单的Java程序;2. 能够运用所学知识设计并实现扫雷游戏的初级版本;3. 提高问题分析、程序设计和编程实现的能力;4. 培养团队协作和沟通表达能力。
情感态度价值观目标:1. 培养学生对编程的兴趣和热情,激发学习积极性;2. 培养学生勇于尝试、面对挑战的精神;3. 增强学生的逻辑思维能力和解决问题的自信心;4. 引导学生关注程序设计在现实生活中的应用,认识到编程的价值。
课程性质分析:本课程为中学信息技术课程,结合Java编程语言和扫雷游戏设计,旨在提高学生的编程兴趣和实际操作能力。
学生特点分析:初中年级学生对新鲜事物充满好奇,具备一定的逻辑思维能力,但编程基础薄弱,需要通过实际操作和趣味性强的案例来提高学习兴趣。
教学要求:1. 注重理论与实践相结合,让学生在实际操作中掌握Java编程知识;2. 采用任务驱动法,引导学生主动探究和解决问题;3. 创设有趣的游戏场景,提高学生的学习积极性;4. 分阶段教学,逐步提高学生编程能力和逻辑思维能力。
二、教学内容1. Java基本语法与程序结构- 数据类型、变量、常量- 运算符、表达式、语句- 程序流程控制(顺序、分支、循环)2. 二维数组的使用- 二维数组的定义、初始化- 遍历二维数组- 二维数组的应用场景3. 编程逻辑- 循环结构(for、while)- 条件判断(if、else、switch)- 随机数的生成与应用4. 扫雷游戏设计与实现- 游戏规则及界面设计- 二维数组存储雷区数据- 排雷逻辑实现- 游戏胜负判断5. 编程实践- 设计并编写扫雷游戏代码- 调试与优化程序- 团队协作与分享教学内容安排与进度:第1-2课时:Java基本语法与程序结构第3课时:二维数组的使用第4课时:编程逻辑第5-6课时:扫雷游戏设计与实现第7课时:编程实践与总结教材章节关联:《Java编程基础》第1章:Java概述《Java编程基础》第2章:数据类型与运算符《Java编程基础》第3章:控制流程《Java编程基础》第4章:数组与方法《Java编程基础》第5章:面向对象编程(部分内容)教学内容科学性和系统性:确保教学内容符合学科知识体系,由浅入深,让学生逐步掌握Java编程基础知识,并通过实际案例将所学知识应用于实践。
扫雷java课程设计

扫雷java课程设计一、课程目标知识目标:1. 掌握Java基础语法,包括数据类型、运算符、控制流程等;2. 学会使用Java进行面向对象编程,理解类与对象的关系,掌握封装、继承、多态等概念;3. 了解Java图形用户界面(GUI)设计,掌握Swing组件的使用;4. 学会使用Java异常处理,提高程序的稳定性和可靠性;5. 掌握扫雷游戏的逻辑设计和实现。
技能目标:1. 能够运用Java编写简单的程序,实现基础功能;2. 能够运用面向对象思想进行问题分析,设计合理的类和对象;3. 能够独立完成扫雷游戏的编写,具备一定的编程实践能力;4. 能够运用所学知识解决实际问题,具备一定的创新和拓展能力。
情感态度价值观目标:1. 培养学生对编程的兴趣,激发学习动力;2. 培养学生良好的编程习惯,注重代码规范和优化;3. 培养学生面对问题积极思考、独立解决的能力,增强自信心;4. 培养学生团队合作精神,学会沟通与协作。
课程性质:本课程为Java语言编程实践课程,以项目为导向,注重培养学生的编程能力和实际操作能力。
学生特点:学生具备一定的计算机基础,了解编程基本概念,但对Java语言和面向对象编程尚不熟悉。
教学要求:结合学生特点,采用案例教学,由浅入深地引导学生掌握Java编程技能,注重实践操作,提高学生编程水平。
同时,关注学生情感态度价值观的培养,使学生在学习过程中形成积极、主动的学习态度。
通过课程学习,将目标分解为具体的学习成果,便于后续教学设计和评估。
二、教学内容1. Java基础语法:- 数据类型与变量- 运算符与表达式- 控制流程(if条件语句、for循环、while循环)- 数组的使用2. 面向对象编程:- 类与对象- 封装、继承、多态- 抽象类与接口- 包的使用3. Java图形用户界面设计:- Swing组件基本使用- 布局管理器- 事件处理机制4. 异常处理:- 异常的概念与分类- try-catch-finally结构- 自定义异常5. 扫雷游戏设计与实现:- 游戏逻辑分析- 界面设计- 功能模块编写(如:初始化雷区、计算周围雷数、标记与挖雷等)- 游戏测试与优化教学内容安排与进度:第一周:Java基础语法学习第二周:面向对象编程基础第三周:Java图形用户界面设计第四周:异常处理与扫雷游戏逻辑分析第五周:扫雷游戏功能模块编写与测试本教学内容根据课程目标,结合教材章节进行选择和组织,确保内容的科学性和系统性。
复制java扫雷游戏课程设计

复制java扫雷游戏课程设计一、课程目标知识目标:1. 让学生掌握Java基础语法和面向对象编程思想,能运用所学知识编写简单的游戏程序;2. 让学生了解扫雷游戏的基本规则和逻辑,理解游戏设计的基本流程;3. 使学生掌握使用Java进行二维数组操作和基本算法实现。
技能目标:1. 培养学生独立编写Java程序的能力,提高编程实践技能;2. 培养学生分析问题、解决问题的能力,能够将实际问题转化为程序逻辑;3. 培养学生团队协作和沟通能力,能够共同完成一个完整的游戏项目。
情感态度价值观目标:1. 激发学生对编程的兴趣,培养学生主动探究、自主学习的精神;2. 培养学生面对挑战时的坚持和耐心,树立克服困难的信心;3. 培养学生遵守编程规范,养成良好的编程习惯,提高职业道德素养。
课程性质:本课程为实践性较强的编程课程,以项目为导向,注重培养学生的动手能力和实际应用能力。
学生特点:学生具备一定的Java基础,对编程感兴趣,但实践经验不足,需要通过实际项目来提高。
教学要求:教师需引导学生掌握游戏设计的基本原理和编程技巧,注重启发式教学,鼓励学生积极参与讨论和实际操作。
同时,关注学生的个体差异,给予不同学生个性化的指导。
通过本课程的学习,使学生能够独立完成一个Java扫雷游戏的编写,达到预期的学习成果。
二、教学内容1. Java基础语法复习:变量、数据类型、运算符、控制结构(条件语句、循环语句);2. 面向对象编程:类与对象、继承与多态、接口与实现;3. 二维数组:数组声明、初始化,遍历和操作二维数组;4. 游戏设计原理:扫雷游戏规则、界面设计、逻辑实现;5. 编程实践:使用Java编写扫雷游戏的各个模块,如界面展示、地雷生成、翻开格子、标记地雷等;6. 算法实现:查找算法、递归算法等在扫雷游戏中的应用;7. 软件测试:单元测试、集成测试,确保游戏程序的正确性和稳定性;8. 项目实战:分组进行项目开发,按照软件工程流程,完成需求分析、设计、编码、测试和总结。
java扫雷的课程设计

java扫雷的课程设计一、课程目标知识目标:1. 理解Java语言基础,掌握面向对象编程的基本概念;2. 学会使用Java编写简单的图形用户界面(GUI)程序;3. 掌握扫雷游戏的规则和逻辑,了解二维数组的使用;4. 了解随机数的生成与应用。
技能目标:1. 能够运用所学知识,独立设计并编写Java扫雷游戏的代码;2. 培养分析问题、解决问题的能力,将实际问题转化为程序逻辑;3. 提高调试程序、解决问题的实际操作能力;4. 学会与他人合作,共同完成项目任务。
情感态度价值观目标:1. 培养学生对编程的兴趣和热情,激发主动学习的动力;2. 培养学生的耐心和毅力,面对困难时保持积极的态度;3. 培养团队协作精神,学会尊重他人,共同进步;4. 培养良好的编程习惯,注重代码规范和程序优化。
本课程针对的学生特点为具有一定Java基础知识和编程能力的初中生。
在教学过程中,要注意结合学生的实际水平和接受能力,循序渐进地引导他们掌握扫雷游戏的设计与实现。
通过本课程的学习,使学生将理论知识与实践相结合,提高编程技能,培养良好的编程习惯和团队协作精神。
同时,关注学生的情感态度价值观培养,激发学生的学习兴趣,提高他们面对困难的勇气和信心。
最终实现学生能够独立完成Java扫雷游戏的设计与实现,为后续学习奠定基础。
二、教学内容1. Java语言基础回顾:变量、数据类型、运算符、控制流程(条件语句、循环语句);2. 面向对象编程概念:类与对象、方法、属性、构造函数;3. Java GUI编程:Swing组件、事件处理、布局管理;4. 二维数组:定义、初始化、遍历、访问;5. 随机数生成:Random类、随机数在游戏中的应用;6. 游戏设计:扫雷游戏规则、游戏逻辑、界面设计;7. 编程实践:独立编写Java扫雷游戏代码,实现游戏基本功能;8. 团队合作:分组讨论、协作完成项目,分享编程经验;9. 程序调试与优化:代码审查、调试技巧、性能优化。
java扫雷课程设计

java 扫雷课程设计一、教学目标本课程旨在通过Java编程语言实现一个扫雷游戏,让学生在学习Java编程的同时,培养逻辑思维能力、问题解决能力和团队合作能力。
具体的教学目标如下:1.掌握Java编程语言的基本语法和数据结构。
2.了解面向对象编程的基本概念和方法。
3.能够运用Java编程语言实现简单的游戏。
4.能够运用面向对象编程的方法设计游戏规则和界面。
情感态度价值观目标:1.培养学生的团队合作意识,提高他们的问题解决能力。
2.培养学生的创新思维,鼓励他们积极探索和尝试新的编程方法。
二、教学内容本课程的教学内容主要包括Java编程语言的基本语法和数据结构、面向对象编程的概念和方法,以及扫雷游戏的实现。
具体的教学大纲如下:1.Java编程语言的基本语法和数据结构:–数据类型、变量和运算符–控制流程:条件语句、循环语句–函数和数组2.面向对象编程的概念和方法:–类和对象的概念–属性和方法的定义–继承和多态的概念3.扫雷游戏的实现:–游戏规则的设计和实现–游戏界面的设计和实现–游戏逻辑的实现:雷的布局、玩家的操作、判断雷和数字的逻辑等三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法相结合的方式进行教学。
具体的教学方法如下:1.讲授法:教师通过讲解Java编程语言的基本语法和数据结构、面向对象编程的概念和方法,为学生提供理论知识的基础。
2.案例分析法:教师通过分析实际案例,让学生了解和掌握Java编程的实践应用。
3.实验法:学生通过编写代码实现扫雷游戏,培养他们的实际编程能力和问题解决能力。
4.小组讨论法:学生分组合作,共同完成扫雷游戏的实现,培养他们的团队合作意识和创新思维。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将选择和准备以下教学资源:1.教材:《Java编程思想》2.参考书:《Java核心技术》3.多媒体资料:教学PPT、视频教程4.实验设备:计算机、网络设备以上是本课程的教学目标、教学内容、教学方法和教学资源的设计。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
成绩评定表课程设计任务书目录1.设计目的----------------------------------------------------------------------------- 4 2.总体设计----------------------------------------------------------------------------- 4 2.1设计需求------------------------------------------------------------------------------------------ 4 2.2程序功能模块图----------------------------------------------------------------------------------- 4 3.关键技术----------------------------------------------------------------------------- 7 4.程序流程----------------------------------------------------------------------------- 8 5.主要源代码-------------------------------------------------------------------------- 8 6.运行结果及结论------------------------------------------------------------------- 27 7.参考文献--------------------------------------------------------------------------- 291.设计目的通过选择扫雷游戏软件设计,这个综合性的题目作为本次的课程设计。
可以让我们更加熟悉Java 程序设计这门课程,学会熟练使用Java这个软件,加深对Java语言的掌握,提高编程水平。
同时培养独立思考和同学间团结合作的能力,为毕业设计以及将来的工作打下坚实的基础。
2.总体设计2.1 设计需求在设计扫雷游戏时,需要编写7个源文件:MineGame.java,MineArea.java,Block.java,BlockView.java,LayMines.java,ShowRecord.java,Record.java 除了这七个源文件外,还需要Java系统提供一些重要的类,如File,JButton和JLabel等类。
2.2 程序功能模块图2.2 程序功能模块图2.2.1 MineGame.java(主类):成员变量bar和fileMenu 提供菜单操作,单击菜单操作中的选项为“初级”,“中级”,“高级”或“扫雷英雄榜”;mineArea 是扫雷区域,提供有关雷的主要功能;英雄榜”负责存放三个级别的扫雷最好成绩;showHeroRecord负责显示英雄榜中的数据方法MineGame()是构造窗口,负责完成窗口的初始化。
ActionPerformed(ActionEvent)方法是MineGame类实现的ActionListener接口中的方法,该方法负责执行菜单发出的有关命令。
用户选择菜单中的菜单项可触发ActionEvent事件,导致actionPerformed(ActionEvent)方法执行相应的操作。
Main(String[])方法是程序运行的入口方法。
2.2.2 MineArea.java:成员变量block和Block类型的数组,用来确定雷区有多少需进行扫雷的方块;blockView是BlockView类型的数组,负责block数组中Block对象提供视图;lay是LayMines类型的对象,负责设置block数组中的哪些方块不是雷;record负责提供保存成绩的界面,是一个对话框,默认为不可见,用户只有扫雷成功后,才可以看见该对话框;reStart是一个按钮对象,用户单击它重新开始游戏;time是计时器对象,负责计算用户用时。
方法initMineArea(int,int,int,int)方法可根据参数提供的数据设置雷区的宽度,高度,类的数目以及雷区的级别。
actionPerformed(actionEvent)是MineArea类实现的ActionListener接口中的方法。
当用户单击blockView中的某个方块时actionPerformed(actionEvent)执行有关算法。
Show()方法是一个递归方法,actionPerformed(actionEvent)方法执行将调用show方法进行扫雷。
mousePressed(mouseEvent)方法是MineArea类实现的MouseListener接口中的方法,当用户按下鼠标右键时,mousePressed(mouseEvent)方法负责让方块上显示一个探雷标记。
inquireWin()方法用来判断用户扫雷是否成功,如果成功该方法负责让record对话框可见。
2.2.3 Block.java:成员变量name方块上的名字aroundMineNumber是方块周围雷的数目mineIcon是方块上雷的图标isMine用来表示方块是否是雷isMark用来表示方块是否被标记isOpen用来表示方块是否被挖开方法setAroundMineNumber(int)方法用来设置aroundMineNumber的值;getAroundMineNumber()方法用来获取aroundMineNumber的值。
2.2.4 BlockView.java成员变量blockNameOrIcon用来显示Block对象的name,number和mineIcon属性;blockCover用来遮挡blockNameOrIcon;card卡片式布局。
方法giveView(Block block)方法给参数指定的Block对象提供视图;seeBlockNameOrIcon()方法让用户看见视图中的标签,无法看见按钮;seeBlockCover()方法让用户看见视图中的按钮,无法看见标签。
2.2.5 LayMines.java:成员变量mineIcon用来存放一个格式为gif的图像。
方法layMinesForBlock(Block[][],int)方法对参数指定的Block数组进行设置,其中int参数指定雷的数目。
2.2.6 Record.java:成员变量textName提供用户扫雷优胜者出入姓名;用户单击“确定”按钮,可以保存成绩。
方法actionPerformed(ActionEvent)方法是Record类实现的ActionListener接口中的方法,当用户单击“确定”按钮后,该方法被执行,所执行的操作就是获取用户输入的名字和用时,然后调用writeRecord(String,String)方法将信息写入英雄榜中;writeRecord(String,String)负责将有关信息写入“英雄榜”文件。
2.2.7 ShowRecord:成员变量file存放文件的引用,用户单击“显示成绩”按钮,可以查看各个级别的最好成绩;用户单击“重新计分”按钮,可以将“英雄榜”中的成绩恢复为初始值。
方法actionPerformed(ActionEvent)方法是ShowRecord类实现的ActionListener接口中的方法,当用户单击“显示成绩”按钮后,该方法被执行,所执行的操作就是调用readAndShow()方法;readAndShow()方法负责读取存放在文件中的各个级别的扫雷最好成绩以及扫雷者姓名,并显示这些相关信息。
3.关键技术3.1 实现窗口的初始化:利用MineGame.java实现MineGame()是构造窗口,负责完成窗口的初始化。
ActionPerformed(ActionEvent)方法是MineGame类实现的ActionListener接口中的方法,该方法负责执行菜单发出的有关命令。
用户选择菜单中的菜单项可触发ActionEvent事件,导致actionPerformed(ActionEvent)方法执行相应的操作。
3.2 利用产生随机数的方法完成游戏中随机布雷的要求:利用MineArea.java实现initMineArea(int,int,int,int)方法可根据参数提供的数据设置雷区的宽度,高度,类的数目以及雷区的级别。
actionPerformed(actionEvent)是MineArea类实现的ActionListener接口中的方法。
当用户单击blockView中的某个方块时actionPerformed(actionEvent)执行有关算法。
Show()方法是一个递归方法,actionPerformed(actionEvent)方法执行将调用show方法进行扫雷。
mousePressed(mouseEvent)方法是MineArea类实现的MouseListener接口中的方法,当用户按下鼠标右键时,mousePressed(mouseEvent)方法负责让方块上显示一个探雷标记。
inquireWin()方法用来判断用户扫雷是否成功,如果成功该方法负责让record对话框可见。
4.程序流程4.1 程序流程图打开程序后点重新开始,游戏定义并初始化,用户开始进行游戏,计数器开始统计用户点击次数并记录,判断用户是否中雷,否继续游戏,是结束游戏并处理结果5.主要源代码import java.awt.event.*;import java.awt.*;import javax.swing.*;import javax.swing.border.*;import java.util.*;import java.io.*;public class MineGame extends JFrame implements ActionListener{ JMenuBar bar;JMenu fileMenu;JMenuItem 初级,中级,高级,扫雷英雄榜;MineArea mineArea=null;File 英雄榜=new File("英雄榜.txt");Hashtable hashtable=null;ShowRecord showHeroRecord=null;MineGame(){mineArea=new MineArea(16,16,40,1);add(mineArea,BorderLayout.CENTER);bar=new JMenuBar();fileMenu=new JMenu("游戏");初级=new JMenuItem("初级");中级=new JMenuItem("中级");高级=new JMenuItem("高级");扫雷英雄榜=new JMenuItem("扫雷英雄榜");fileMenu.add(初级);fileMenu.add(中级);fileMenu.add(高级);fileMenu.add(扫雷英雄榜);bar.add(fileMenu);setJMenuBar(bar);初级.addActionListener(this);中级.addActionListener(this);高级.addActionListener(this);扫雷英雄榜.addActionListener(this);hashtable=new Hashtable();hashtable.put("初级","初级#"+999+"#匿名");hashtable.put("中级","中级#"+999+"#匿名");hashtable.put("高级","高级#"+999+"#匿名");if(!英雄榜.exists()) {try{ FileOutputStream out=new FileOutputStream(英雄榜);ObjectOutputStream objectOut=new ObjectOutputStream(out); objectOut.writeObject(hashtable);objectOut.close();out.close();}catch(IOException e){}}showHeroRecord=new ShowRecord(this,hashtable);setBounds(100,100,280,380);setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);validate();}public void actionPerformed(ActionEvent e){if(e.getSource()==初级){mineArea.initMineArea(8,8,10,1);setBounds(100,100,200,280);}if(e.getSource()==中级){mineArea.initMineArea(16,16,40,2);setBounds(100,100,280,380);}if(e.getSource()==高级){mineArea.initMineArea(22,22,99,3);setBounds(100,100,350,390);}if(e.getSource()==扫雷英雄榜){if(showHeroRecord!=null)showHeroRecord.setVisible(true);}validate();}public static void main(String args[]){new MineGame();}}import java.awt.*;import java.awt.event.*;import javax.swing.*;public class MineArea extends JPanel implements ActionListener,MouseListener{ JButton reStart;Block [][] block;BlockView [][] blockView;LayMines lay;int row,colum,mineCount,markMount;//雷区的行数、列数以及地雷个数和用户给出的标记数ImageIcon mark;int grade;JPanel pCenter,pNorth;JTextField showTime,showMarkedMineCount; //显示用时以及标记数Timer time; //计时器int spendTime=0;Record record;public MineArea(int row,int colum,int mineCount,int grade) {reStart=new JButton("重新开始");mark=new ImageIcon("mark.gif"); //探雷标记time=new Timer(1000,this);showTime=new JTextField(5);showMarkedMineCount=new JTextField(5);showTime.setHorizontalAlignment(JTextField.CENTER);showMarkedMineCount.setHorizontalAlignment(JTextField.CENTER);showMarkedMineCount.setFont(new Font("Arial",Font.BOLD,16));showTime.setFont(new Font("Arial",Font.BOLD,16));pCenter=new JPanel();pNorth=new JPanel();lay=new LayMines();initMineArea(row,colum,mineCount,grade); //初始化雷区,见下面的LayMines() reStart.addActionListener(this);pNorth.add(showMarkedMineCount);pNorth.add(reStart);pNorth.add(showTime);setLayout(new BorderLayout());add(pNorth,BorderLayout.NORTH);add(pCenter,BorderLayout.CENTER);}public void initMineArea(int row,int colum,int mineCount,int grade){pCenter.removeAll();spendTime=0;markMount=mineCount;this.row=row;this.colum=colum;this.mineCount=mineCount;this.grade=grade;block=new Block[row][colum];for(int i=0;i<row;i++){for(int j=0;j<colum;j++)block[i][j]=new Block();}yMinesForBlock(block,mineCount);blockView=new BlockView[row][colum];pCenter.setLayout(new GridLayout(row,colum));for(int i=0;i<row;i++) {for(int j=0;j<colum;j++) {blockView[i][j]=new BlockView();blockView[i][j].giveView(block[i][j]); //给block[i][j]提供视图 pCenter.add(blockView[i][j]);blockView[i][j].getBlockCover().addActionListener(this);blockView[i][j].getBlockCover().addMouseListener(this);blockView[i][j].seeBlockCover();blockView[i][j].getBlockCover().setEnabled(true);blockView[i][j].getBlockCover().setIcon(null);}}showMarkedMineCount.setText(""+markMount);validate();}public void setRow(int row){this.row=row;}public void setColum(int colum){this.colum=colum;}public void setMineCount(int mineCount){this.mineCount=mineCount;}public void setGrade(int grade) {this.grade=grade;}public void actionPerformed(ActionEvent e) {if(e.getSource()!=reStart&&e.getSource()!=time) {time.start();int m=-1,n=-1;for(int i=0;i<row;i++) {for(int j=0;j<colum;j++) {if(e.getSource()==blockView[i][j].getBlockCover()){m=i;n=j;break;}}}if(block[m][n].isMine()) {for(int i=0;i<row;i++) {for(int j=0;j<colum;j++) {blockView[i][j].getBlockCover().setEnabled(false); if(block[i][j].isMine())blockView[i][j].seeBlockNameOrIcon();}}time.stop();spendTime=0;markMount=mineCount;}else {show(m,n); //见本类后面的show方法}}if(e.getSource()==reStart) {initMineArea(row,colum,mineCount,grade);}if(e.getSource()==time){spendTime++;showTime.setText(""+spendTime);}inquireWin();}public void show(int m,int n) {if(block[m][n].getAroundMineNumber()>0&&block[m][n].getIsOpen()==false){ blockView[m][n].seeBlockNameOrIcon();block[m][n].setIsOpen(true);return;}elseif(block[m][n].getAroundMineNumber()==0&&block[m][n].getIsOpen()==false){ blockView[m][n].seeBlockNameOrIcon();block[m][n].setIsOpen(true);for(int k=Math.max(m-1,0);k<=Math.min(m+1,row-1);k++) {for(int t=Math.max(n-1,0);t<=Math.min(n+1,colum-1);t++)show(k,t);}}}public void mousePressed(MouseEvent e){JButton source=(JButton)e.getSource();for(int i=0;i<row;i++) {for(int j=0;j<colum;j++) {if(e.getModifiers()==InputEvent.BUTTON3_MASK&&source==blockView[i][j].getBlockCover()){if(block[i][j].getIsMark()) {source.setIcon(null);block[i][j].setIsMark(false);markMount=markMount+1;showMarkedMineCount.setText(""+markMount); }else{source.setIcon(mark);block[i][j].setIsMark(true);markMount=markMount-1;showMarkedMineCount.setText(""+markMount); }}}}}public void inquireWin(){int number=0;for(int i=0;i<row;i++) {for(int j=0;j<colum;j++) {if(block[i][j].getIsOpen()==false)number++;}}if(number==mineCount){time.stop();record=new Record();switch(grade){case 1: record.setGrade("初级");break;case 2: record.setGrade("中级");break;case 3: record.setGrade("高级");break;}record.setTime(spendTime);record.setVisible(true);}}public void mouseReleased(MouseEvent e){}public void mouseEntered(MouseEvent e){}public void mouseExited(MouseEvent e){}public void mouseClicked(MouseEvent e){}}import javax.swing.ImageIcon;public class Block {String name; //名字,比如"雷"或数字 int aroundMineNumber; //周围雷的数目 ImageIcon mineIcon; //雷的图标boolean isMine=false; //是否是雷boolean isMark=false; //是否被标记boolean isOpen=false; //是否被挖开public void setName(String name) {=name;}public void setAroundMineNumber(int n) {aroundMineNumber=n;}public int getAroundMineNumber() {return aroundMineNumber;}public String getName() {return name;}public boolean isMine() {return isMine;}public void setIsMine(boolean b) {isMine=b;}public void setMineIcon(ImageIcon icon){mineIcon=icon;}public ImageIcon getMineicon(){return mineIcon;}public boolean getIsOpen() {return isOpen;}public void setIsOpen(boolean p) {isOpen=p;}public boolean getIsMark() {return isMark;}import javax.swing.*;import java.awt.*;public class BlockView extends JPanel{JLabel blockNameOrIcon; //用来显示Block对象的name、number和mineIcon属性 JButton blockCover; //用来遮挡blockNameOrIcon.CardLayout card; //卡片式布局BlockView(){card=new CardLayout();setLayout(card);blockNameOrIcon=new JLabel("",JLabel.CENTER);blockNameOrIcon.setHorizontalTextPosition(AbstractButton.CENTER); blockNameOrIcon.setVerticalTextPosition(AbstractButton.CENTER); blockCover=new JButton();add("cover",blockCover);add("view",blockNameOrIcon);}public void giveView(Block block){if(block.isMine){blockNameOrIcon.setText(block.getName());blockNameOrIcon.setIcon(block.getMineicon());}else {int n=block.getAroundMineNumber();if(n>=1)blockNameOrIcon.setText(""+n);elseblockNameOrIcon.setText(" ");}}public void seeBlockNameOrIcon(){card.show(this,"view");validate();}public void seeBlockCover(){card.show(this,"cover");validate();}public JButton getBlockCover(){return blockCover;}}import java.util.*;import javax.swing.*;public class LayMines{ImageIcon mineIcon;LayMines() {mineIcon=new ImageIcon("mine.gif");}public void layMinesForBlock(Block block[][],int mineCount){int row=block.length;int column=block[0].length;LinkedList<Block> list=new LinkedList<Block>();for(int i=0;i<row;i++) {for(int j=0;j<column;j++)list.add(block[i][j]);}while(mineCount>0){int size=list.size(); // list返回节点的个数int randomIndex=(int)(Math.random()*size);Block b=list.get(randomIndex);b.setIsMine(true);b.setName("雷");b.setMineIcon(mineIcon);list.remove(randomIndex); //list删除索引值为randomIndex的节点 mineCount--;}for(int i=0;i<row;i++){for(int j=0;j<column;j++){if(block[i][j].isMine()){block[i][j].setIsOpen(false);block[i][j].setIsMark(false);}else {int mineNumber=0;for(int k=Math.max(i-1,0);k<=Math.min(i+1,row-1);k++) {for(int t=Math.max(j-1,0);t<=Math.min(j+1,column-1);t++){ if(block[k][t].isMine())mineNumber++;}}block[i][j].setIsOpen(false);block[i][j].setIsMark(false);block[i][j].setName(""+mineNumber);block[i][j].setAroundMineNumber(mineNumber);}}}}}import java.io.*;import java.util.*;import javax.swing.*;import java.awt.event.*;import java.awt.*;public class Record extends JDialog implements ActionListener{int time=0;String grade=null;String key=null;String message=null;JTextField textName;JLabel label=null;JButton 确定,取消;public Record(){setTitle("记录你的成绩");this.time=time;this.grade=grade;setBounds(100,100,240,160);setResizable(false);setModal(true);确定=new JButton("确定");取消=new JButton("取消");textName=new JTextField(8);textName.setText("匿名");确定.addActionListener(this);取消.addActionListener(this);setLayout(new GridLayout(2,1));label=new JLabel("您现在是...高手,输入您的大名上榜");add(label);JPanel p=new JPanel();p.add(textName);p.add(确定);p.add(取消);add(p);setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);}public void setGrade(String grade){this.grade=grade;label.setText("您现在是"+grade+"高手,输入您的大名上榜"); }public void setTime(int time){this.time=time;}import java.io.*;import java.util.*;import javax.swing.*;import java.awt.event.*;import java.awt.*;public class ShowRecord extends JDialog implements ActionListener{ File file=new File("英雄榜.txt");String name=null;Hashtable hashtable=null;JButton 显示,重新记分;JLabel label初级[],label中级[],label高级[];public ShowRecord(JFrame frame,Hashtable h) {setTitle("扫雷英雄榜");hashtable=h;setBounds(100,100,320,185);setResizable(false);setVisible(false);setModal(true);label初级=new JLabel[3];label中级=new JLabel[3];label高级=new JLabel[3];for(int i=0;i<3;i++) {label初级[i]=new JLabel();label初级[i].setBorder(null);label中级[i]=new JLabel();label中级[i].setBorder(null);label高级[i]=new JLabel();label高级[i].setBorder(null);}label初级[0].setText("初级");label初级[1].setText(""+999);label初级[1].setText("匿名");label中级[0].setText("中级");label中级[1].setText(""+999);label中级[1].setText("匿名");label高级[0].setText("高级");label高级[1].setText(""+999);label高级[1].setText("匿名");JPanel pCenter=new JPanel();pCenter.setLayout(new GridLayout(3,3));for(int i=0;i<3;i++)pCenter.add(label初级[i]);for(int i=0;i<3;i++)pCenter.add(label中级[i]);for(int i=0;i<3;i++)pCenter.add(label高级[i]);pCenter.setBorder(BorderFactory.createTitledBorder("扫雷英雄榜"));显示=new JButton("显示成绩");重新记分=new JButton("重新记分");显示.addActionListener(this);重新记分.addActionListener(this);JPanel pSouth=new JPanel();pSouth.setLayout(new FlowLayout(FlowLayout.RIGHT));pSouth.add(重新记分);pSouth.add(显示);add(pCenter,BorderLayout.CENTER);add(pSouth,BorderLayout.SOUTH) ;}public void readAndShow(){try{ FileInputStream in=new FileInputStream(file);ObjectInputStream object_in=new ObjectInputStream(in);hashtable=(Hashtable)object_in.readObject();object_in.close();in.close();String temp=(String)hashtable.get("初级");StringTokenizer fenxi=new StringTokenizer(temp,"#"); label初级[0].setText(fenxi.nextToken());label初级[1].setText(fenxi.nextToken());label初级[2].setText(fenxi.nextToken());temp=(String)hashtable.get("中级");fenxi=new StringTokenizer(temp,"#");label中级[0].setText(fenxi.nextToken());label中级[1].setText(fenxi.nextToken());label中级[2].setText(fenxi.nextToken());temp=(String)hashtable.get("高级");fenxi=new StringTokenizer(temp,"#");label高级[0].setText(fenxi.nextToken());label高级[1].setText(fenxi.nextToken());label高级[2].setText(fenxi.nextToken());}catch(Exception e){}}public void actionPerformed(ActionEvent e) {if(e.getSource()==重新记分) {hashtable.put("初级","初级#"+999+"#匿名");label初级[0].setText("初级");label初级[1].setText(""+999);label初级[2].setText("匿名");hashtable.put("中级","中级#"+999+"#匿名");label中级[0].setText("初级");label中级[1].setText(""+999);label中级[2].setText("匿名");hashtable.put("高级","高级#"+999+"#匿名");label高级[0].setText("初级");label高级[1].setText(""+999);label高级[2].setText("匿名");try{ FileOutputStream out=new FileOutputStream(file);ObjectOutputStream object_out=new ObjectOutputStream(out); object_out.writeObject(hashtable);object_out.close();out.close();}catch(IOException event){}setVisible(false);}if(e.getSource()==显示){readAndShow();}}}6. 运行结果及结论6.1 运行过程6.2 运行界面7.参考文献[1] Java面向对象程序设计清华大学出版社董小园[2] Java2实用教程(第三版)清华大学出版社耿祥义[3] 基于MVC的Java Web设计与开发. 电子工业出版社孙卫琴[4]《JAVA 语言与面向对象程序设计》清华大学出版社印旻[5]《 JavaApplet 实例编程》中国水利水电出版社赤金、聂松编。