扫雷教案资料.docx
《扫雷教案资料.docx》由会员分享,可在线阅读,更多相关《扫雷教案资料.docx(28页珍藏版)》请在冰豆网上搜索。
扫雷教案资料
扫雷
郑州工业应用技术学院
课程设计说明书
题目扫雷游戏实验设计专业班级学号1姓名
主要目的:
实训主要是锻炼我们的操作能力,将学习的理论知识运用于实践当中,反过来还能检验书本上理论的正确性,有利于融会贯通。
让我们对本专业知识形成一一个客观,理性的认识,从而不与社会现实相脱节。
基本要求:
1.深入学习和理解Java原理,掌握Java编程方法。
2.深入分析扫雷游戏运行流程,绘制程序流程图。
主要参考资料:
[1]Eric.Java编程思想[M].第4版.机械工业出版社,机械工业出版社.
[2]杜波依斯.MySQL技术内幕[M].第4版.人民邮电出版社,2011年
[3]林信良.JSP&Servlet学习笔记[M].清华大学出版社,2012年
[4]张峋,杨三成.JSP与JDBC应用详解[M].中国铁道出版社,2010年
完成期限10月7日-12月10日
指导教师签名
课程负责人签名
摘要
SunMicrosystems公司在推出Java语言的同时,推出了一套开发工具JDK。
Sun提供的基于字符模式的Java开发工具包JDK:
Java开发工具(JDK)是许多Java专家最初使用的开发环境。
Java是平台无关的语言是指用Java写的应用程序不用修改就可在不同的软硬件平台上运行。
Java源程序编写借助于记事本,Editpuls,UltraEdit等第三方编辑工具。
所有的Java文件编辑、编译、调试、解释运行都是通过使用字符命令来执行操作。
JDK由一个标准类库和一组建立,测试及建立文档的Java实用程序组成。
其核心JavaAPI是一些预定义的类库,开发人员需要用这些类来访问Java语言的功能。
JDK是整个Java的核心,包括了Java运行环境(JavaRuntimeEnvirnment),一堆Java工具和Java基础的类库(rt.jar)。
不论什么Java应用服务器实质都是内置了某个版本的JDK。
因此掌握JDK是学好Java的第一步。
JDK里面是java类库和java的语言规范,它提供的是无论你用何种开发软件写java程序都必须用到的类库和java语言规范.没有jdk,你的java程序根本就不能用。
最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK等等。
其中IBM的JDK包含的JVM(JavaVirtualMachine)运行效率要比SunJDK包含的JVM高出许多。
而专门运行在x86平台的Jrocket在服务端运行效率也要比SunJDK好很多。
关键词:
扫雷游戏;算法设计;事件;AVA
第一章概述
本课程设计的目标是设计一个名为《扫雷》的游戏软件,扫雷游戏分为初级、中级和高级三个级别。
单击游戏菜单可以选择“初级”、“中级”和“高级”。
1、选择级别后将出现相应级别的扫雷区域,这时用户使用鼠标左键单击‘“开始”便启动计时器。
2、用户要揭开某个方块,可左键单击它。
若所揭方块下有雷,用户便输了这一局,若所揭方块下无雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。
3、如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。
用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。
1.1课程设计目的
通过选择扫雷游戏软件设计,这个综合性的题目作为本次的课程设计。
可以让我们更加熟悉Java程序设计这门课程,学会熟练使用Java这个软件,加深对Java语言的掌握,提高编程水平。
同时培养独立思考和同学间团结合作的能力,为毕业设计以及将来的工作打下坚实的基础。
1.2预备知识
JAVA是一种功能强大和多用途的编程语言,具有面向对象、与平台无关的、安全、稳定和多线程等优良特性,可用于开发大型的应用程序,而且特别适合Internet应用的开发。
java是由JamesGosling在Sun公司的领导的小组开发的,最初成为Oak(橡树),1995年更名为java。
JAVA语言规范、API(应用程序接口)、JDK(java开发工具包)、IDE(集成开发环境):
Java语言规范定义了Java的语法,Java库则在JavaAPI中定义;JDK是用于开发和运行java程序的软件;IDE是快速开发程序的集成开发环境。
java是一门编程性的语言,编程时区分大小写,我们需要多加练习才能快速有效的提高。
要知道java是分两部分的:
一个是编译,一个是运行。
javac:
负责的是编译的部分,当执行javac时,会启动java的编译器程序。
对指定扩展名的.java文件进行编译。
生成了jvm可以识别的字节码文件。
也就是class文件,也就是java的运行程序。
JAVA:
负责运行的部分.会启动jvm加载运行时所需的类库,并对class文件进行执行. 每个java程序至少有一个类,类名是按照惯例都以大写字母开头,一个文件要被执行,必须要有一个执行的起始点,这个起始点就是main函数。
编程中一个良好的习惯就是写注释,分为行注释//(注释的内容)和块注释/ (注释的内容) 。
1.3课程设计内容和要求
Windows2000/XP系统提供的扫雷游戏是一个很有趣的游戏。
本章的课程设计使用Java语言编写一个与其类似的扫雷游戏。
具体要求如下:
(1) 扫雷游戏分为初级、中级和高级三个级别,扫雷英雄榜存储每个级别的最好成绩,即挖出全部的地雷且用时最少者。
单击游戏菜单可以选择“初级”、“中级”和“高级”。
(2) 选择级别后将出现相应级别的扫雷区域,这是用户使用鼠标左键单击雷区中任何一个方块便启动计时器。
(3) 用户要揭开某个方块,可单击它。
若所揭方块下有泪,用户便输了这一局,若所揭方块下五雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。
(4) 如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。
用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。
(5) 扫雷胜利后(用时最少者),程序弹出保存成绩的对话框。
(6)如果用户需要即使提示声,并可选中声音选项,此时将听到计时的卡塔声。
当用户点中雷时,将有爆炸声产生,胜利时,将有凯旋的旋律播放。
第二章需求分析
2.1系统目标
本系统主要是完成俄罗斯方块游戏的基本操作,在玩游戏的过程中玩家可以放松心情得到娱乐。
2.2主题功能
(1)用户可以自定义级别并且可以任意输入雷数;
(2)具有计时功能,即显示用户完成移动盘子所花费的时间;
(3)用户可以选择是否有音效;
2.3开发环境
操作系统可以有以下几种:
Win XP/Win Vista/Win 7。
硬件要求:
奔腾四处理器,主频2.0GHz,512M以上内存。
2.4概念设计
随着社会的不断进步,人们的压力也不断的提高,在游戏层出不穷的时刻,扫雷游戏任然受到不少人的青睐,,其本身的性质,决定了人们对它的喜爱的程度,不需要特殊的技巧,不需要不断的升级,还不需要太多的时间进行熟悉,简简单单却趣味无穷。
扫雷最原始的版本可以追溯到1973年一款名为“方块”的游戏。
不久之后,
“方块”被改写成了游戏“Rlogic”。
在“Rlogic”里,玩家的任务是作为美国海军陆战队队员,为指挥中心探出一条没有地雷的安全路线,如果路全被地雷堵死就算输。
两年后,汤姆·安德森在“Rlogic”的基础上又编写出了游戏“地雷”,由此奠定了现代扫雷游戏的雏形。
1981年, 微软公司的罗伯特·杜尔和卡特·约翰逊两位工程师在Windows3.1系统上加载了该游戏,扫雷游戏才正式在全世界推广开来。
Java语言是面向对象编程,并涉及到网络、多线程等重要的基础知识,因此Java语言也是学习面向对象编程和网络编程的首选语言。
该课题的主要目的是使Java游戏开发者深入理解所学的Java语言,并实践于该俄罗斯方块游戏设计中,深刻体会以前所学的有关Java程序设计方面的语言基础、异常处理、事件处理、应用程序以及图形用户界面设计等方面的知识,加深对结构化设计思想的理解,能对系统功能进行分析,并设计合理的模块化结构等。
学会使用Java系统,其中包括对程序的调试、运行、保存等知识的运用,还包括提高程序开发功能,能运用合理的方法简化Java程序的操作,开发过程中应培养分析问题、解决问题的能力。
本次课程设计的主要目的是为了通过具体的程序来加深对Java语言的掌握,提高自己的编程水平。
选择的题目来自《Java课程设计(第二版)》中的扫雷游戏,这是一个综合性的题目,可以对Java中的各项功能有更好的理解和使用,同时也为以后的工作打下一定的基础。
第三章设计步骤
3.1程序流程图
下图为扫雷流程图,点击开始进入初始化,进入循环。
如图3.1所示:
图3.1扫雷程序流程图
3.2雷区设计流程图
扫雷逻辑分析也很重要,敲一个好的游戏,首先就要分析游戏逻辑,下图为扫雷雷区图,如图3.2所示:
图3.2扫雷雷区流程图
3.4游戏背景图
扫雷游戏背景也很重要,拥有一个好的背景图会让玩家拥有更好的体验感,下图为1扫雷游戏背景图图,如图3.3所示:
图3.3扫雷背景图图
第四章设计正文
4.1AllButtonPanel()类:
AllButtonPanel代码如下:
packagecleanMine;
importjavax.swing.*;
importjava.awt.*;
importjava.awt.event.*;
/**
*显示所有按钮的面板
*@authorAdministrator
*
*/
publicclassAllButtonPanelextendsJPanelimplementsActionListener{
privateintrow;//行数
privateintcol;//列数
privateintmineCount;//地雷数
privateMineButton[][]allButtons;//所有按钮
publicAllButtonPanel(introw,intcol,intmineCount){
this.row=row;
this.col=col;
this.mineCount=mineCount;
allButtons=newMineButton[row][col];
createButtons();
createMine();
init();
}
privatevoidinit(){
this.setLayout(newGridLayout(row,col));
for(inti=0;ifor(intj=0;jthis.add(allButtons[i][j]);
}
}
}
/**
*随机布雷的方法
*
*/
privatevoidcreateMine(){
intn=0;
while(ninti=(int)(Math.random()*row);
intj=(int)(Math.random()*col);
if(allButtons[i][j].getCountOfSurroundMines()!
=-1){
allButtons[i][j].setCountOfSurroundMines(-1);
n++;
}
}
for(inti=0;ifor(intj=0;jif(allButtons[i][j].getCountOfSurroundMines()!
=-1){
allButtons[i][j].setCountOfSurroundMines(getSurroundMineCount(i,j));
}
}
}
}
/**
*统计(i,j)坐标周围8个位置的地雷数
*@paramdata
*@parami
*@paramj
*@return
*/
privateintgetSurroundMineCount(inti,intj){
intnum=0;//统计周围的雷数
if(i-1>=0&&j-1>=0){
num+=(allButtons[i-1][j-1].getCountOfSurroundMines()==-1?
1:
0);
}
if(i-1>=0){
num+=(allButtons[i-1][j].getCountOfSurroundMines()==-1?
1:
0);
}
if(i-1>=0&&j+1num+=(allButtons[i-1][j+1].getCountOfSurroundMines()==-1?
1:
0);
}
if(j-1>=0){
num+=(allButtons[i][j-1].getCountOfSurroundMines()==-1?
1:
0);
}
if(j+1num+=(allButtons[i][j+1].getCountOfSurroundMines()==-1?
1:
0);
}
if(i+1=0){
num+=(allButtons[i+1][j-1].getCountOfSurroundMines()==-1?
1:
0);
}
if(i+1num+=(allButtons[i+1][j].getCountOfSurroundMines()==-1?
1:
0);
}
if(i+1num+=(allButtons[i+1][j+1].getCountOfSurroundMines()==-1?
1:
0);
}
returnnum;
}
/**
*生成按钮
*
*/
privatevoidcreateButtons(){
for(inti=0;ifor(intj=0;jallButtons[i][j]=newMineButton(i,j);
allButtons[i][j].setSize(6,6);
allButtons[i][j].addActionListener(this);//添加点击事件监听
allButtons[i][j].addMouseListener(newMouseAdapter(){//添加鼠标右键事件监听
publicvoidmouseClicked(MouseEvente){
if(e.getButton()==MouseEvent.BUTTON3){
intremain=Integer.parseInt(CleanMine.remainMine.getText());
JButtonb=(JButton)e.getSource();
if(b.getText().equals("")){
remain--;
CleanMine.remainMine.setText(remain+"");
b.setText("&");
}elseif(b.getText().equals("&")){
remain++;
CleanMine.remainMine.setText(remain+"");
b.setText("");
}
}
}
});
}
}
}
publicvoidactionPerformed(ActionEvente){//点击事件监听的方法
MineButtonb=(MineButton)e.getSource();
intr=b.getRow();
intc=b.getCol();
if(allButtons[r][c].getCountOfSurroundMines()==-1){//如果是地雷
for(inti=0;ifor(intj=0;jif(allButtons[i][j].getCountOfSurroundMines()==-1){//如果该位置是地雷
allButtons[i][j].setText("$");
}elseif(allButtons[i][j].getCountOfSurroundMines()==0){//如果该位置为空(该位置不是地雷,周围8个位置也没有地雷)
allButtons[i][j].setText("");
allButtons[i][j].setBackground(Color.CYAN);
}else{//如果该位置不是地雷,但周围8个位置中有地雷
allButtons[i][j].setText(allButtons[i][j].getCountOfSurroundMines()+"");
allButtons[i][j].setBackground(Color.CYAN);
}
}
}
}else{//如果不是地雷
showEmpty(r,c);//执行排空操作
}
}
/**
*排空方法,若(i,j)位置为空,则显示空白。
然后依次递归找它周围的8个位置。
*@paramdata
*@parami
*@paramj
*/
privatevoidshowEmpty(inti,intj){
MineButtonb=allButtons[i][j];
if(b.isCleared()){
return;
}
if(allButtons[i][j].getCountOfSurroundMines()==0){
b.setBackground(Color.CYAN);
b.setCleared(true);
if(i-1>=0&&j-1>=0){
showEmpty(i-1,j-1);
}
if(i-1>=0){
showEmpty(i-1,j);
}
if(i-1>=0&&j+1showEmpty(i-1,j+1);
}
if(j-1>=0){
showEmpty(i,j-1);
}
if(j+1showEmpty(i,j+1);
}
if(i+1=0){
showEmpty(i+1,j-1);
}
if(i+1showEmpty(i+1,j);
}
if(i+1showEmpty(i+1,j+1);
}
}elseif(allButtons[i][j].getCountOfSurroundMines()>0){
b.setText(allButtons[i][j].getCountOfSurroundMines()+"");
b.setBackground(Color.CYAN);
b.setCleared(true);
}
}
}
4.2cleanMine类
cleanMine代码如下:
packagecleanMine;
importjavax.swing.*;
importjava.awt.*;
importjava.awt.event.*;
/**
*扫雷游戏主界面
*@authortony.tang
*
*/
publicclassCleanMineextendsJFrameimplementsActionListener{
privateJLabeltext1,text2;
publicstaticJLabelremainMine;//剩余地雷数
privateJLabeltime;//消耗时间
privateJButtonreset;//重新开始
privateJPanelcenter;
privateintrow,col,mine;
publicCleanMine(){
text1=newJLabel("剩余地雷:
");
text2=newJLabel("消耗时间:
");
remainMine=newJLabel("10");
time=newJLabel("0");
reset=newJButton("重新开始");
reset.addActionListener(this);
JMenuBarbar=newJMenuBar();
JMenugame=newJMenu("游戏");
JMenuhelp=newJMenu("帮助");
JMenuItemitem;
game.add(item=newJMenuItem("开局"));item.addActionListener(this);
game.addSeparator();
ButtonGroupbg=newButtonGroup();
game.add(item=newJCheckBoxMenuItem("初级",true));bg.add(item);item.addActionListener(this);