java_扫雷_课程设计_报告

合集下载

JAVA课程设计扫雷含代码

JAVA课程设计扫雷含代码

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

java 扫雷 实验报告

java 扫雷 实验报告

java 扫雷实验报告Java 扫雷实验报告一、引言扫雷是一款经典的单人益智游戏,玩家需要根据数字提示,在雷区中揭开没有地雷的方块,同时避免触雷。

本实验旨在使用Java语言实现一个简单的扫雷游戏,并对实现过程和结果进行分析和总结。

二、实验过程1. 游戏界面设计使用Java的图形用户界面(GUI)工具包Swing,设计了一个扫雷游戏的界面。

界面包括一个方格矩阵,每个方格可以是未揭开、揭开、标记地雷三种状态之一。

同时,界面上显示了剩余地雷数量和游戏时间。

2. 游戏逻辑实现通过编写Java代码,实现了扫雷游戏的逻辑。

主要包括以下几个方面:- 初始化雷区:根据用户输入的难度级别,生成对应大小的雷区,并在其中随机布置地雷。

- 揭开方块:当玩家点击某个方块时,根据该方块周围的地雷数量,显示对应的数字或触雷。

- 标记地雷:当玩家认为某个方块是地雷时,可以标记该方块,以便后续操作时不会误触雷。

- 游戏结束判断:当玩家揭开所有没有地雷的方块时,游戏胜利;当玩家触雷时,游戏失败。

3. 用户交互设计为了提升用户体验,实现了以下交互设计:- 鼠标左键点击方块:揭开方块或触雷。

- 鼠标右键点击方块:标记地雷或取消标记。

- 双击方块:自动揭开周围未标记的方块,如果周围已标记地雷数量与方块上的数字相等。

三、实验结果经过实验,我们成功实现了一个简单的Java扫雷游戏。

游戏界面美观,操作流畅,能够满足基本的游戏需求。

玩家可以根据自己的喜好选择不同的难度级别,挑战不同规模的雷区。

四、实验总结通过这个实验,我们深入理解了Java语言的面向对象特性和图形用户界面的设计思想。

同时,我们学会了如何将一个复杂的问题分解为多个小问题,并通过合理的设计和编码实现整体功能。

在实验过程中,我们也遇到了一些挑战,比如如何处理用户输入、如何判断游戏是否结束等。

通过不断思考和尝试,我们最终找到了解决方案,并取得了满意的结果。

在今后的学习和工作中,我们将继续深入学习Java语言和相关技术,提升自己的编程能力。

java 扫雷 实验报告

java 扫雷 实验报告

java 扫雷实验报告
《Java 扫雷实验报告》
摘要:
本实验利用Java编程语言实现了一个简单的扫雷游戏,并对游戏的性能进行了测试和分析。

通过实验发现,使用Java语言编写的扫雷游戏在性能和用户体验方面表现良好,能够满足一般玩家的需求。

1. 引言
扫雷是一款经典的单人益智游戏,玩家需要根据数字提示来判断雷的位置,然后进行标记或清除。

本实验旨在利用Java编程语言实现一个简单的扫雷游戏,并对其性能进行测试和分析。

2. 实验方法
首先,我们使用Java语言编写了一个扫雷游戏的基本框架,包括游戏界面、游戏逻辑和用户交互等部分。

然后,我们利用性能测试工具对游戏进行了性能测试,包括内存占用、CPU占用和响应速度等指标。

3. 实验结果
通过性能测试,我们发现使用Java编写的扫雷游戏在内存占用方面表现良好,平均占用内存不超过100MB。

在CPU占用方面,游戏在运行时的平均CPU占用率不超过20%,并且响应速度较快,基本没有卡顿现象。

4. 实验讨论
根据实验结果,我们可以得出结论:使用Java编程语言实现的扫雷游戏在性能和用户体验方面表现良好,能够满足一般玩家的需求。

同时,我们也发现一些优化的空间,比如进一步减小内存占用、优化游戏界面等。

5. 结论
本实验利用Java编程语言实现了一个简单的扫雷游戏,并对游戏的性能进行了测试和分析。

通过实验发现,使用Java语言编写的扫雷游戏在性能和用户体验方面表现良好,能够满足一般玩家的需求。

希望本实验能够为Java游戏开发提供一些参考和借鉴。

java扫雷课程设计

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课程设计扫雷

java课程设计扫雷一、课程目标知识目标:1. 让学生掌握Java基础语法,包括变量声明、数据类型、运算符和流程控制语句;2. 培养学生运用面向对象编程思想,掌握类与对象的基本概念,以及继承、封装和多态等特性;3. 通过扫雷游戏的案例,让学生学会使用二维数组处理游戏逻辑。

技能目标:1. 培养学生运用所学知识独立编写程序的能力,实现扫雷游戏的主体功能;2. 提高学生分析问题、解决问题的能力,学会运用模块化思维进行编程;3. 培养学生团队协作意识,学会在项目中分工合作、共同完成项目。

情感态度价值观目标:1. 培养学生对编程的兴趣,激发学习热情,形成积极向上的学习态度;2. 培养学生面对困难敢于挑战、勇于克服的精神,增强自信心;3. 培养学生遵守编程规范,养成良好的编程习惯。

本课程针对高年级学生,在已有Java基础知识的基础上,通过设计扫雷游戏项目,使学生在实践中巩固和提高所学知识。

课程注重培养学生的编程技能、团队协作能力和解决实际问题的能力,同时关注学生的情感态度价值观培养,使学生在轻松愉快的氛围中学习编程。

课程目标具体、可衡量,为教学设计和评估提供明确方向。

二、教学内容1. Java基础语法复习:变量声明、数据类型、运算符、流程控制语句(包括条件语句、循环语句等);2. 面向对象编程:类与对象、构造方法、继承、封装、多态;3. 二维数组:声明、初始化、遍历、应用;4. 游戏设计原理:游戏循环、事件处理、界面设计;5. 扫雷游戏项目开发:需求分析、模块划分、编码实现、测试与优化。

教学内容参考教材相关章节,结合课程目标进行组织。

教学大纲安排如下:1. 复习Java基础语法(1课时);2. 面向对象编程知识讲解与练习(2课时);3. 二维数组知识讲解与练习(1课时);4. 游戏设计原理介绍(1课时);5. 扫雷游戏项目开发:需求分析、模块划分(1课时);6. 扫雷游戏项目开发:编码实现、测试与优化(3课时)。

java扫雷的课程设计

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编程语言实现一个扫雷游戏,让学生在学习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.实验设备:计算机、网络设备以上是本课程的教学目标、教学内容、教学方法和教学资源的设计。

java课程设计扫雷游戏总结

java课程设计扫雷游戏总结

java课程设计扫雷游戏总结一、课程目标知识目标:1. 学生能理解Java语言面向对象编程的基本概念,掌握类与对象的定义、属性和方法的使用。

2. 学生能运用数组管理二维空间数据,实现对扫雷游戏地图的表示与处理。

3. 学生能掌握异常处理机制,提高程序的健壮性。

技能目标:1. 学生能够运用所学知识独立设计并实现一个简易的扫雷游戏,具备基本的编程实践能力。

2. 学生能够通过分析问题,设计合理的类与对象,提高问题解决能力。

3. 学生能够运用调试工具,发现并修复程序中的错误,提高程序调试能力。

情感态度价值观目标:1. 学生在课程学习中,培养对编程的兴趣和热情,树立编程解决问题的自信心。

2. 学生通过小组合作,培养团队协作精神,增强沟通与交流能力。

3. 学生在游戏设计过程中,关注用户体验,培养产品思维和用户服务意识。

课程性质:本课程为Java语言编程实践课程,以项目为导向,注重学生动手能力培养。

学生特点:学生为初中生,具备一定的Java基础,对游戏编程有较高的兴趣。

教学要求:结合学生特点,课程要求以实践为主,注重引导学生自主探究和小组合作,提高编程实践能力。

将目标分解为具体的学习成果,以便于后续教学设计和评估。

二、教学内容1. 面向对象编程基础:- 类与对象的定义- 属性和方法的声明与使用- 构造方法的定义与重载2. 数组的使用:- 一维数组的基本操作- 二维数组的定义与应用- 数组在扫雷游戏地图中的应用3. 异常处理:- 异常的概念与分类- try-catch语句的使用- 自定义异常处理4. 游戏编程实践:- 扫雷游戏规则介绍- 游戏界面设计- 游戏逻辑实现(如:雷区生成、翻开格子、标记雷等)- 游戏胜负判断5. 教学大纲:- 第一课时:面向对象编程基础复习,类与对象的创建- 第二课时:二维数组在扫雷游戏中的应用,设计游戏地图- 第三课时:异常处理,提高程序健壮性- 第四课时:扫雷游戏逻辑实现,界面设计- 第五课时:游戏调试与优化,小组展示与评价教学内容依据教材相关章节,结合课程目标进行选择和组织,保证教学内容的科学性和系统性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《JAVA程序设计》课程设计报告系别:计算机与电子系专业班级:计算机科学与技术0803班学生姓名:曾一墙指导教师:徐鹏(课程设计时间:2011年6月13日——2011年6月24日)华中科技大学武昌分校课程设计报告撰写内容、格式与成绩评定一、课程设计报告的撰写内容与要求1.课程设计总结报告应包括:前言、基本原理或理论、设计计算书或实验报告、结论、图纸(框图、流程图)、参考资料等;或调查、访谈报告、调查问卷、调查提纲等。

2.课程设计总结报告应书写工整,文句通顺、精炼、逻辑性强,图纸和曲线的绘制应符合规范。

3.调查型课程设计应根据调查结果撰写调查报告。

调查报告内容包括:题目、参加时间、地点、方式、过程、调查对象一般情况、调查内容、发现的问题、调查结果和调查分析及体会等。

调查报告要求语言简练、准确;叙述清楚、明白;数据、资料可靠;结论有理、有据。

4.图纸应布局合理,比例恰当,线条分明,字体工整,符合国家制图标准。

5.课程设计报告字数要求:理工、艺术类不少于2000字,其他专业不少于3000字。

二、课程设计成绩评定1.学生的课程设计成绩由平时成绩、业务考核成绩两部分组成,均为百分制记分,其中平时成绩占总成绩的30%,业务考核成绩占70%。

业务考核含设计报告(计算说明书、调查提纲、调查问卷等)、绘制的图纸、编制的软件、制作的模型、撰写的论文或问卷统计、调查分析等的完成及质量情况;平时成绩含设计表现、到课率等。

2. 教师按学生实际成绩(百分制,含平时成绩和业务考核成绩两部分)登记并录入教务MIS系统,由系统自动转化为“优秀(90~100分)、良好(80~89分)、中等(70~79分)、及格(60~69分)和不及格(60分以下)”五等。

目录1.课程设计目的 (1)2.课程设计题目描述和要求 (1)3.课程设计报告内容 (2)3.1总体设计 (2)3.2详细设计 (4)3.3编码实现 (9)3.4系统测试 (27)3.5系统运行 (27)4.总结 (30)参考文献 (31)1.课程设计目的本次课程设计的主要目的是为了通过具体的程序来加深对Java语言的掌握,提高自己的编程水平。

选择的题目来自《Java课程设计(第二版)》中的扫雷游戏,这是一个综合性的题目,可以对Java中的各项功能有更好的理解和使用,同时也为以后的工作打下一定的基础。

2.课程设计题目描述和要求Windows 2000/XP系统提供的扫雷游戏是一个很有趣的游戏。

本章的课程设计使用Java语言编写一个与其类似的扫雷游戏。

具体要求如下:(1) 扫雷游戏分为初级、中级和高级三个级别,扫雷英雄榜存储每个级别的最好成绩,即挖出全部的地雷且用时最少者。

单击游戏菜单可以选择“初级”、“中级”和“高级”或“查看英雄版”。

(2) 选择级别后将出现相应级别的扫雷区域,这是用户使用鼠标左键单击雷区中任何一个方块便启动计时器。

(3) 用户要揭开某个方块,可单击它。

若所揭方块下有泪,用户便输了这一局,若所揭方块下五雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。

(4) 如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。

用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。

(5) 扫雷胜利后(用时最少者),程序弹出保存成绩的对话框。

(6)用户可以选择标记疑问的方块,用可以勾选游戏菜单下的标记即可,此时双击右键并可出现“?”标记。

另有颜色选项,当用户勾选此项时,游戏将以最低图像像素来显示。

(7)如果用户需要即使提示声,并可选中声音选项,此时将听到计时的卡塔声。

当用户点中雷时,将有爆炸声产生,胜利时,将有凯旋的旋律播放,此时程序中的头像出现欢悦表情。

3.课程设计报告内容3.1总体设计本程序需实现的主要功能有:(1) 用户可以自定义级别并且可以任意输入雷数;(2) 具有计时功能,即显示用户完成移动盘子所花费的时间;(3) 用户可以选择是否有音效;(4) 自动保存扫雷英雄榜。

程序的总体功能如图3-1所示:图3-1 总体功能图程序各个类之间的关系如图3-2所示:图3-2 类之间的关系图程序总体流程如图3-3所示:图3-3 总体流程图3.2详细设计(1)扫雷棋盘的布局设计系统的整体布局为:CardLayout布局, 采用了菜单、按钮、面板…等组件,菜单主要包括开始,选择级别,标记,扫雷英雄榜,退出,按钮的功能是重新开始新的游戏。

(2)雷区的设计MineArea类是javax.swing包中Jpanel容器的子类,实现了ActionListener和MouseListener接口,所创建的对象:mineArea是MineGame 类中最重要的成员之一,作为一个容器添加到MineGame窗口的中心。

标明MineArea类的主要成员变量、方法以及和MineGame类之间组合关系的UML图如图3-4所示:图3-4 MineArea类的UML图以下是UML图中有关数据和方法的详细说明:1、成员变量①block是Block类型的数组,用来确定雷区有多少需进行扫雷的方块;②blockView是BlockView类型的数组,负责为block数组中的Block对象提供视图;③lay是LayMines类型的对象,负责设置block数组中的哪些方块是雷或不是雷;④record负责提供保存成绩的界面,是一个对话框,默认不可见。

用户只有扫雷成功后(用时最少),才可以看见对话框;⑤reStart是一个按钮对象,用户单击它重新开始游戏;⑥time是计时器对象,负责计算用户的用时。

2、方法①initMineArea(int,int,int,int)方法可根据参数提供的数据设置雷区的宽度、高度、雷的数目以及雷区的级别;②actionPerformed(ActionEvent)是MineArea类实现的ActionListener接口中的方法。

当用户单击blockView中的某个方块时,actionPerformed(ActionEvent)方法负责执行有关算法,例如,当用鼠标左键单击方块上的按钮后,若该方块下有雷,actionPerformed(ActionEvent)方法将使用户输掉本局,若该方块下无雷,actionPerformed(ActionEvent)方法将显示blockView对象中的标签,该标签上是一个数字,该数字代表当前方块的周围的8个方块中共有多少颗雷;③show()方法是一个递归方法。

actionPerformed(ActionEvent)方法执行时将调用show方法进行扫雷;④mousePressed(MouseEvent)方法是MineArea类实现的MouseListener接口中的方法,当用户按下鼠标有件事mousePressed(MouseEvent)方法负责让方块上显示一个探雷标记;⑤inquireWin()方法用来判断用户是否扫雷成功,如果成功该方法负责让record对话框可见。

所谓扫雷成功是指不仅找到了全部的累而且用时最少。

雷区设计流程图如图3-5所示:图3-5 雷区设计流程图(3)音效的设计music类是java.awt包中Frame的子类,通过构造音效声音方法,在MainFrame主类中,通过ActionListener来监视是否已开始游戏,来决定播放计时声,之后又通过ActionListener来监视是否踩到雷和是否完成来决定,播放相应的音乐。

下面标明music类的主要成员变量、方法以及和MineFrame类之间组合关系的UML图如图3-6所示,音效设计流程图如图3-7所示:图3-6 music类的UML图图3-7 音效设计流程图(4)排行榜设计LogDialog是javax.swing包中Jdialog对话框的子类,并实现了ActiongListener接口。

LogDialog创建的对象dialog是MainFrame类(主类)的成员之一,当用户选择查看“英雄榜”菜单项时,该对话框可见,提供了查看扫雷的最好成绩的界面。

标明LogDialog类的主要成员变量、方法以及和MainFrame类之间组合关系的UML图如图3-8所示,排行榜设计流程图如图3-9所示:图3-8 LogDialog类的UML图N图3-9 排行榜设计流程图3.3编码实现MainFrame类:package nicholas.game.mine;import java.awt.*;import java.awt.event.*;import java.io.*;import javax.swing.*;import nicholas.awt.LedNumber;import nicholas.swing.AboutDialog;public class MainFrame extends JFrame implements ActionListener { Voice 声音;boolean control=false;//UI components:户界面组件private JLabel mineLabel;private JLabel timeLabel;private JLabel statusButton;private JPanel gridPanel;private JPanel statusPanel;private Dimension gpd;private Dimension spd;private MineGrid grid[][];private boolean mode[][];private final int margin = 7;private final int titleh = 52;private int xBound;private int yBound;private int mineCount;private int showCount; //the amount of grids openedprivate int leftCount; //the amount of mines not labeled private int timepassed;private boolean firstClick;private boolean markCheck;//Menu Components:目录组件private JMenuItem startItem;//开局private JMenuItem exitItem;//退出private JMenuItem logItem;//英雄榜private JMenuItem aboutItem;//关于private JRadioButtonMenuItem levelItem[];//级别private JCheckBoxMenuItem markCheckItem;//标记即是否能用?private JCheckBoxMenuItem soundItem; //声音//Game informations:游戏信息private LevelInfo levelInfo;private int currentLevel;private LevelLog log[];private LedNumber led;private GridMouseAdapter gma;private StatusMouseAdapter sma;private TimeThread timeThread;private boolean sound;public MainFrame() {super("扫雷");//defaultcurrentLevel = 0;levelInfo = LevelInfo.DEFAULT_LEVEL[currentLevel];log = new LevelLog[3];for(int i=0;i<3;i++)log[i] = new LevelLog();//read from filereadLog();led = new LedNumber();gma = new GridMouseAdapter();sma = new StatusMouseAdapter();//鼠标状态适配器//setup menussetMenuBar();setStatusPanel();resetPane();addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {writeLog();System.exit(0);}});setIconImage(ImageFactory.getInstance().getImageicon(16).getImage ());setResizable(false);}//execution application:应用执行即主类public static void main(String args[]) {MainFrame application = new MainFrame();try {UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName( ));} catch(Exception e) {}}//file operation:文件操作private void readLog() {//读取英雄榜try {File logFile = new File("mine.log");if(!logFile.exists()) return;ObjectInputStream ois = new ObjectInputStream(new FileInputStream(logFile));for(int i=0;i<3;i++) {log[i] = (LevelLog)ois.readObject();}markCheck = ois.readBoolean();currentLevel = ois.readInt();if(currentLevel==3) {levelInfo = (LevelInfo)ois.readObject();} else {levelInfo = LevelInfo.DEFAULT_LEVEL[currentLevel];}ois.close();} catch (Exception e) {System.out.println("read fail");} }private void writeLog() {//保存英雄榜try {File logFile = new File("mine.log");ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(logFile));for(int i=0;i<3;i++) {oos.writeObject(log[i]);}oos.writeBoolean(markCheck);oos.writeInt(currentLevel);if(currentLevel==3) {oos.writeObject(levelInfo);}oos.close();} catch (Exception e) {System.out.println("write fail");}}/**add status label to status panel*/private void setStatusPanel() {//状况显示板JPanel temp;statusPanel = new JPanel(new BorderLayout());mineLabel = new JLabel();//雷数显示mineLabel.setBorder(BorderFactory.createLoweredBevelBorder());temp = new JPanel(new FlowLayout(1,4,4));temp.add(mineLabel);temp.setBackground(Color.LIGHT_GRAY);statusPanel.add(temp,BorderLayout.WEST);timeLabel = new JLabel();//时间显示timeLabel.setBorder(BorderFactory.createLoweredBevelBorder());temp = new JPanel(new FlowLayout(1,4,4));temp.add(timeLabel);temp.setBackground(Color.LIGHT_GRAY);statusPanel.add(temp,BorderLayout.EAST);statusButton = new JLabel();//状态按钮statusButton.setBorder(BorderFactory.createRaisedBevelBorder());statusButton.addMouseListener(sma);temp = new JPanel(new FlowLayout(1,0,4));temp.setBackground(Color.LIGHT_GRAY);temp.add(statusButton);statusPanel.add(temp,BorderLayout.CENTER);statusPanel.setSize(10,37);statusPanel.setBorder(BorderFactory.createLoweredBevelBorder());spd = statusPanel.getSize();}private void resetStatusPanel() {//重新开始mineLabel.setIcon(newImageIcon(led.getLedImage(leftCount,3)));timeLabel.setIcon(newImageIcon(led.getLedImage(timepassed,3)));statusButton.setIcon(ImageFactory.getInstance().getImageicon(17)) ;}private void setGridPanel() {//设置格子xBound = levelInfo.getXBound();yBound = levelInfo.getYBound();mineCount = levelInfo.getMineCount();MineGrid.xBound = this.xBound;MineGrid.yBound = this.yBound;grid = new MineGrid[xBound][yBound];mode = new boolean[xBound][yBound];gridPanel = new JPanel();gridPanel.setBackground(Color.GRAY);//initialize grid panelgridPanel.setLayout(null);for(int x = 0; x < xBound; x++) {for(int y =0; y < yBound; y++) {grid[x][y] = new MineGrid(x,y);grid[x][y].setIcon(ImageFactory.getInstance().getImageicon(9));grid[x][y].setBounds(1+y*MineGrid.SIZE,x*MineGrid.SIZE,MineGrid.S IZE,MineGrid.SIZE);grid[x][y].addMouseListener(gma);gridPanel.add(grid[x][y],null);}}gpd = new Dimension(yBound*MineGrid.SIZE+6,xBound*MineGrid.SIZE+6);}//end of set grid panelprivate void resetGridPanel() {leftCount = 0;int x,y,i,j;boolean temp;for(x = 0; x < xBound; x++) {for(y =0; y < yBound; y++) {grid[x][y].setIcon(ImageFactory.getInstance().getImageicon(9));grid[x][y].setStatus(MineGrid.NORMAL);//lay minesif(leftCount < mineCount) {mode[x][y] = true;leftCount++;} else {mode[x][y] = false;}}}//exchangeshowCount = leftCount;for(x = 0; x < xBound; x++) {for(y =0; y < yBound; y++) {if(showCount==0) break;i = (int)(Math.random()*xBound);j = (int)(Math.random()*yBound);temp = mode[x][y];mode[x][y] = mode[i][j];mode[i][j] = temp;showCount--;}}}/**set up menu bar*/private void setMenuBar() {//设置菜单条JMenuBar menuBar = new JMenuBar();menuBar.setBorder(BorderFactory.createLineBorder(Color.WHITE, 2));JMenu gameMenu = new JMenu("游戏(G)");JMenu helpMenu = new JMenu("帮助(H)");gameMenu.setMnemonic('G');helpMenu.setMnemonic('H');声音=new Voice();startItem = new JMenuItem("开局(N)");startItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F2,0) );logItem = new JMenuItem("扫雷英雄榜(T)...");markCheckItem = new JCheckBoxMenuItem("标记(?)(M)");soundItem=new JCheckBoxMenuItem("声音(S)");exitItem = new JMenuItem("退出(X)");aboutItem = new JMenuItem("关于扫雷(A)...");startItem.setMnemonic('N');exitItem.setMnemonic('X');aboutItem.setMnemonic('A');aboutItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1,0) );logItem.setMnemonic('T');soundItem.setMnemonic('S');soundItem.setSelected(sound);markCheckItem.setMnemonic('M');markCheckItem.setSelected(markCheck);gameMenu.add(startItem);gameMenu.addSeparator();//radio grouplevelItem = new JRadioButtonMenuItem[4];ButtonGroup levelGroup = new ButtonGroup();levelItem[0] = new JRadioButtonMenuItem("初级(B)");levelItem[1] = new JRadioButtonMenuItem("中级(I)");levelItem[2] = new JRadioButtonMenuItem("高级(E)");levelItem[3] = new JRadioButtonMenuItem("自定义(C)...");levelItem[0].setMnemonic('B');levelItem[1].setMnemonic('I');levelItem[2].setMnemonic('E');levelItem[3].setMnemonic('C');for(int i=0;i<4;i++) {levelGroup.add(levelItem[i]);levelItem[i].addActionListener(this);gameMenu.add(levelItem[i]);}levelItem[currentLevel].setSelected(true);gameMenu.addSeparator();gameMenu.add(markCheckItem);gameMenu.addSeparator();gameMenu.add(soundItem);gameMenu.addSeparator();gameMenu.add(logItem);gameMenu.addSeparator();gameMenu.add(exitItem);helpMenu.add(aboutItem);startItem.addActionListener(this);markCheckItem.addActionListener(this);soundItem.addActionListener(this);logItem.addActionListener(this);exitItem.addActionListener(this);aboutItem.addActionListener(this);menuBar.add(gameMenu);menuBar.add(helpMenu);setJMenuBar(menuBar);}private void showAboutDialog() {String readme = "";File file = new File("readme.txt");if(file.exists()) {try {BufferedReader input = new BufferedReader(new FileReader(file));StringBuffer buffer = new StringBuffer();String text;while((text = input.readLine())!=null)buffer.append(text+"\n");input.close();readme = buffer.toString();} catch(IOException ioException) {}}AboutDialog dialog = new AboutDialog(this, "扫雷",readme,ImageFactory.getInstance().getImageicon(14),ImageFactory.getInstance().getImageicon(16));dialog = null;public void actionPerformed(ActionEvent ae) {if(ae.getSource()==startItem) {restartGame();}else if(ae.getSource()==markCheckItem) {markCheck = markCheckItem.isSelected();}else if(ae.getSource()==soundItem){if(control==false)control=true;else control=false;}else if(ae.getSource()==logItem) {//show herosLogDialog dialog = new LogDialog(this, log);dialog = null;}else if(ae.getSource()==exitItem) {writeLog();System.exit(0);}else if(ae.getSource()==aboutItem) {showAboutDialog();}else {//radio buttonsint x;for(x = 0; x < 3; x++) {if(ae.getSource()==levelItem[x]) break;}if(x < 3) {if(currentLevel!=x) {currentLevel = x;levelInfo = LevelInfo.DEFAULT_LEVEL[currentLevel];resetPane();}}else {LevelInfo newLevel = CustomDialog.getUserLevel(this, levelInfo);if(newLevel!=null) {currentLevel = x;levelInfo = newLevel;resetPane();}levelItem[currentLevel].setSelected(true);}}//radio buttons}/**1.setup grid panel*2.restart game*/private void resetPane() {Container container = getContentPane();container.setLayout(null);container.removeAll();container.setBackground(Color.LIGHT_GRAY);setGridPanel();JPanel tempPanel = new JPanel(new BorderLayout());tempPanel.setBounds(margin, margin, gpd.width, spd.height);tempPanel.add(statusPanel,BorderLayout.CENTER);container.add(tempPanel,null);tempPanel = new JPanel(new BorderLayout());tempPanel.setBounds(margin,margin*2+spd.height,gpd.width,gpd.heig ht);tempPanel.add(gridPanel,BorderLayout.CENTER);tempPanel.setBorder(BorderFactory.createLoweredBevelBorder());container.add(tempPanel,null);int X = (int)(Toolkit.getDefaultToolkit().getScreenSize().getWidth() -(gpd.width+3*margin-1)) / 2;int Y = (int)(Toolkit.getDefaultToolkit().getScreenSize().getHeight() -(gpd.height+spd.height+4*margin+titleh)) / 2;setLocation(X, Y);setSize(gpd.width+3*margin-1,gpd.height+spd.height+4*margin+titleh);show();restartGame();}private void restartGame() {timepassed = 0;timeThread = null;firstClick = true;resetGridPanel();resetStatusPanel();}//Method labelMineprivate void labelMine(MineGrid g) {if(markCheck) {//being labeled then to markedif(g.isLabeled()) {g.setMarked(true);g.setStatus(MineGrid.NORMAL);g.setIcon(ImageFactory.getInstance().getImageicon(13));leftCount++;} else {//normal but marked then to normalif(g.isMarked()) {g.setMarked(false);g.setIcon(ImageFactory.getInstance().getImageicon(9));} else {//normal and not marked then to labeledg.setIcon(ImageFactory.getInstance().getImageicon(10));g.setStatus(BELED);leftCount--;}}}else {//being labeledif(g.isLabeled()) {g.setIcon(ImageFactory.getInstance().getImageicon(9));g.setStatus(MineGrid.NORMAL);leftCount++;} else {//not being labeledg.setIcon(ImageFactory.getInstance().getImageicon(10));g.setStatus(BELED);leftCount--;}}//upgrade mineLabelmineLabel.setIcon(newImageIcon(led.getLedImage(leftCount,3)));}//when grid[i] been clicked(cl indicate the botton).private void clickGrid(int x, int y, int cl) {int count=0;int lcount=0;//change status to clickedgrid[x][y].setStatus(MineGrid.CLICKED);//mine is clicked:碰雷if(mode[x][y]) {grid[x][y].setIcon(ImageFactory.getInstance().getImageicon(12));if(control==true)声音.exploringVoice();endGame(0);return;}//if(control==true)声音.notifyVoice();//not mine//count mines and labeled grids around grid[x][y]for(int i=grid[x][y].xlow;i<=grid[x][y].xhigh;i++) {for(int j=grid[x][y].ylow;j<=grid[x][y].yhigh;j++) {if(mode[i][j])count++;if(grid[i][j].isLabeled())lcount++;}}//end count//click by left button:单击左键if(cl==1) {grid[x][y].setIcon(ImageFactory.getInstance().getImageicon(count) );showCount++;if( showCount == xBound*yBound - mineCount) {endGame(1);return;}}//no mine aroundif((cl==1&&count==0)||cl==2&&count==lcount) {for(int i=grid[x][y].xlow;i<=grid[x][y].xhigh;i++) {for(int j=grid[x][y].ylow;j<=grid[x][y].yhigh;j++) {if(i==x&&j==y) continue;else if(grid[i][j].isNormal())clickGrid(i,j,1);}}}}//execute on winning or losingprivate void endGame(int status) {//stop counting timetimeThread=null;//winif(status==1) {statusButton.setIcon(ImageFactory.getInstance().getImageicon(19)) ;for(int x = 0; x < xBound; x++) {for(int y = 0; y < yBound; y++) {//show mines not labeledif(mode[x][y]&&grid[x][y].isNormal())grid[x][y].setIcon(ImageFactory.getInstance().getImageicon(10));grid[x][y].setStatus(MineGrid.CLICKED);}}leftCount = 0;mineLabel.setIcon(new ImageIcon(led.getLedImage(0,3)));//show user name inputif(currentLevel<3&&timepassed<log[currentLevel].getRecord()) { log[currentLevel].setRecord(timepassed);log[currentLevel].setUserName(UserDialog.showInputNameDialog(this,currentLevel,log[currentLevel].getUserName()));LogDialog dialog = new LogDialog(this, log);}}//loseelse {statusButton.setIcon(ImageFactory.getInstance().getImageicon(20)) ;for(int x = 0; x < xBound; x++) {for(int y = 0; y < yBound; y++) {//show mines not labeledif(mode[x][y]&&grid[x][y].isNormal())grid[x][y].setIcon(ImageFactory.getInstance().getImageicon(11));//show grid wrong labeledelse if(!mode[x][y]&&grid[x][y].isLabeled())grid[x][y].setIcon(ImageFactory.getInstance().getImageicon(15));//forbid any actionsgrid[x][y].setStatus(MineGrid.CLICKED);}}}}private class StatusMouseAdapter extends MouseAdapter {private boolean mouseIn;private boolean mouseDown;private Icon icon;public StatusMouseAdapter() {super();}public void mouseEntered(MouseEvent me) {mouseIn = true;if(mouseDown) {statusButton.setBorder(BorderFactory.createLoweredBevelBorder());icon = statusButton.getIcon();statusButton.setIcon(ImageFactory.getInstance().getImageicon(18)) ;}}public void mousePressed(MouseEvent me) {//按下鼠标mouseDown = true;statusButton.setBorder(BorderFactory.createLoweredBevelBorder());icon = statusButton.getIcon();statusButton.setIcon(ImageFactory.getInstance().getImageicon(18)) ;}public void mouseReleased(MouseEvent me) {//释放鼠标mouseDown = false;statusButton.setIcon(icon);statusButton.setBorder(BorderFactory.createRaisedBevelBorder());if(mouseIn) restartGame();}public void mouseExited(MouseEvent me) {mouseIn = false;if(mouseDown) {statusButton.setIcon(icon);statusButton.setBorder(BorderFactory.createRaisedBevelBorder());}}}private class GridMouseAdapter extends MouseAdapter {private MineGrid current;private boolean leftDown;private boolean rightDown;private boolean middle;public GridMouseAdapter() {super();}public void mousePressed(MouseEvent me) {current = (MineGrid)me.getSource();//as soon as right button down, label happen//when not released, wait for next eventif(me.getButton()==3) {rightDown = true;if(!current.isClicked()&&!leftDown) labelMine(current);}else if(me.getButton()==2) {rightDown = true;leftDown = true;middle = true;}else {//click and double click not happen until release buttonleftDown = true;if(current.isNormal())statusButton.setIcon(ImageFactory.getInstance().getImageicon(18)) ;pressGrid(current);}if(rightDown&&leftDown) {//doublepressAround(current);}}public void mouseEntered(MouseEvent me) {current = (MineGrid)me.getSource();if(leftDown&&rightDown) {pressAround(current);} else if(leftDown) {pressGrid(current);}}public void mouseReleased(MouseEvent me) {if(current.isNormal())statusButton.setIcon(ImageFactory.getInstance().getImageicon(17)) ;int x = current.getXpos();int y = current.getYpos();if(leftDown) {leftDown = false;if(firstClick) {timeThread = new TimeThread();timeThread.start();firstClick = false;//changeMineif(mode[x][y]) {int i,j;do {i = (int)(Math.random()*xBound);j = (int)(Math.random()*yBound);} while(mode[i][j]);mode[x][y] = false;mode[i][j] = true;}}if(rightDown) {releaseAround(current);rightDown = false;if(middle) {middle = false;}if(current.isClicked()) clickGrid(x,y,2);}else {if(current.isNormal()) clickGrid(x,y,1);}}else {rightDown = false;}}public void mouseExited(MouseEvent me) {current = (MineGrid)me.getSource();if(leftDown&&rightDown) {releaseAround(current);} else if(leftDown) {releaseGrid(current);}}private void pressGrid(MineGrid g) {if(!g.isNormal()) return;g.setIcon(ImageFactory.getInstance().getImageicon(0));}private void releaseGrid(MineGrid g) {if(!g.isNormal()) return;g.setIcon(ImageFactory.getInstance().getImageicon(9));}private void pressAround(MineGrid g) {int x = g.getXpos();int y = g.getYpos();for(int i=grid[x][y].xlow;i<=grid[x][y].xhigh;i++) { for(int j=grid[x][y].ylow;j<=grid[x][y].yhigh;j++) { pressGrid(grid[i][j]);}}}private void releaseAround(MineGrid g) {int x = g.getXpos();int y = g.getYpos();for(int i=grid[x][y].xlow;i<=grid[x][y].xhigh;i++) { for(int j=grid[x][y].ylow;j<=grid[x][y].yhigh;j++) { releaseGrid(grid[i][j]);}}}}//class TimeThread to count timeprivate class TimeThread extends Thread {public TimeThread() {}public void run() {final Thread currentThread = Thread.currentThread();while(timepassed<1000&&currentThread==timeThread) { //change timeLabelSwingUtilities.invokeLater(//inner class Runnablenew Runnable() {public void run() {timeLabel.setIcon(newImageIcon(led.getLedImage(timepassed,3)));}});try{Thread.sleep(1000);if(control==true)声音.notifyVoice();}catch(InterruptedException i) {System.err.println("sleep interrupted");}timepassed++;}}//end of method run}//end of class TimeThread}3.4系统测试在程序代码基本完成后,经过不断的调试与修改,最后测试本次所设计的扫雷游戏能够正常运行,在基本功能与画面上与Windows自带的扫雷游戏没有太大差别,没有出现明显的错误和漏洞,但是在一些细节方面仍然需要完善,比如在游戏中可以加入一些不同语音的提示,在游戏完成和失败的时候可以弹出一些小的Flash动画,还有就是可以扩展一下扫雷英雄榜的功能等。

相关文档
最新文档