1、扫雷游戏程序课程设计报告书Java扫雷游戏课程设计一、课程设计目的通过选择Java课程设计中扫雷游戏,这个综合性的题目作为本次的课程设计。可以让我们更加熟悉Java程序设计这门课程,学会熟练使用Eclipse这个编程软件,加深对Java语言中相关知识的掌握,提高编程水平。同时培养独立思考和同学间团结合作的能力,为毕业设计以及将来的工作和学习打下坚实的基础。并且通过这次课程设计,我们也可以得到一下能力的锻炼:(1)进一步巩固、加深学生所学专业课程JAVA语言教程的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。 (2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而
2、达到提高学生素质的最终目的。 (3)利用所学知识,开发小型应用系统,掌握运用JAVA语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。(4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。 (5)熟练掌握JAVA语言的GUI设计,灵活运用各种类库。二、设计内容及要求 Windows 游戏提供的扫雷游戏是一个很有趣的游戏。我所做的的课程设计使用Java语言编写一个与其类似的扫雷游戏。内容:设计一个类似windows的扫雷游戏,达到中级水平,即:196个方块,40个雷。具体内容如下:(1) 我的程序刚进入界面时便会有一张漂亮的画面,以此来吸引用户的兴趣。(2
3、)我的扫雷游戏只有一个级别中级,扫雷英雄榜存储最好成绩,即挖出全部的地雷且用时最少者。单击游戏菜单可以选择“开始游戏”或“查看英雄版”。 (3)选择级别后将出现相应级别的扫雷区域,这是用户使用鼠标左键单击雷区中任何一个方块便启动计时器。(4) 用户要揭开某个方块,可单击它。若所揭方块下有雷,用户便输了这一局,若所揭方块下无雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。(5) 如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。(6) 扫雷胜利后(用
4、时最少者),程序弹出保存成绩的对话框。(7)用户可以选择标记疑问的方块,用可以勾选游戏菜单下的标记即可,此时双击右键并可出现“?”标记。(8)当用户用鼠标点击时程序上的笑脸时游戏便开始了新的一局。用户成功是便会有一张很酷的表情,担当用户失败是,便会有一张哭丧的表情。具体要求如下(1)右键标示为雷,左键直接翻开。(2)无雷的方块翻开后用数字表示周围8个方块中的地雷数,周围每雷的方块翻开后,同时翻开周围方块(和windows游戏一样)。(3)由数字动态表示已进行的时间(单位是秒)和已挖出的雷。(4)选作内容:支持左、右键同时按下后的功能。三、程序设计步骤 该程序共创建了八个包,每个包都有各自的作用
5、,每个包中又有不同的类。其中他们的作用包括,设计雷区,设计界面,布置雷,还有显示时间和雷数。以及显示不同的图片。程序中主要包含的包方法和类:定义的包包中的类类中的主要方法和变量beanMineLabelMineLabelOwnsetNamesetTimesdialogShowWininitWinInit、JTextFieldframeSartFrameRestart、setStartlistenerMineMenuListeneractionPerformedMouseListenerMouseListener、mousePressed、mouseReleasedMouseMotionList
6、enermouseMoved、mouseDraggedmenuMineMenuSartFrame、heroMenu、fileMenu 、getSartFramepanelMineFieldbuildMinesartFrameMineStateusedtimeG、usedtimeS、usedtimeBnewGametimerTimersmineStateact、ionPerformed、timestoolsToolsMotifmetal、Image、windows1、扫雷棋盘的布局设计系统的整体布局采用了复杂的网格布局, 采用了菜单、按钮、面板等组件,菜单主要包括开始,中级,扫雷英雄榜,退出,布
7、局中的笑脸按钮的功能是重新开始新的游戏。2、雷区设计 首先定义雷快所在的行和列,private int rowIndex; / 雷块所在的行private int colIndex;/ 雷块所在的列showwin类是package com.sf.minesweeper.dialog包中Jpanel容器的子类,实现了ActionListener和MouseListener接口,所创建的对象:mineArea是MineGame类中最重要的成员之一,作为一个容器添加到窗口的中心。1、成员变量(1定义二维数组数组,用来确定雷区有多少需进行扫雷的方块。(2)tools是package com.sf.mi
8、nesweeper.tools包中的类,用来显示图片,包括显示时间表情笑脸的等多种图片。 (3)private MineState mineState; / 记雷数 privateMineField mineField; / 布置labble和雷数,负责设置数组中的哪些方块是雷或不是雷。(4)settitle负责提供保存成绩的界面,是一个对话框,默认不可见。用户只有扫雷成功后(用时最少),才可以看见对话框。(5)reStart是一个按钮对象,用户单击它选择游戏是否开始以及重新开始游戏。(6)time是计时器对象,负责计算用户的用时。2、方法(1)own方法可根据参数提供的数据设置雷区的宽度、高
9、度、雷的数目以及雷区的级别。(2)actionPerformed(ActionEvent)是minemenulistener类实现的ActionListener接口中的方法。当用户单击blockView中的某个方块时,actionPerformed(ActionEvent)方法负责执行有关算法,例如,当用鼠标左键单击方块上的按钮后,若该方块下有雷,actionPerformed(ActionEvent)方法将使用户输掉本局,若该方块下无雷,actionPerformed(ActionEvent)方法将显示对象中的标签,该标签上是一个数字,该数字代表当前方块的周围的8个方块中共有多少颗雷。(3)
10、show()方法是一个递归方法。actionPerformed(ActionEvent)方法执行时将调用show方法进行扫雷。(4)mousePressed(MouseEvent)方法是MineArea类实现的MouseListener接口中的方法,当用户按下鼠标有件事mousePressed(MouseEvent)方法负责让方块上显示一个探雷标记。(5)Win()方法用来判断用户是否扫雷成功,如果成功该方法负责让对话框可见。3、图片显示Imageicom是package com.sf.minesweeper.tools包中的类,用来显示图片,其中图片被放在文件夹image中,程序通过调用其中
11、的图片来显示。不同的图片。ImageIcon timeCount,用来显示d0-d10时间标签图片,ImageIcon iiface分别对应face0-face9表情标签图片。ImageIcon iimine分别对应mine-mine3雷表情标签图片。ImageIcon iiask分别对应 ask-ask2问号表情标签图片。iiflag 对应旗子表情标签图片iihole 对应点表情标签图片。4、扫雷游戏的功能图如下:四、调试及测试扫雷游戏的主要界面主要界面如下:界面中有游戏和帮助按钮,其中游戏按钮中包括开局、中级、扫雷英雄榜、退出等按钮。帮助按钮中有关于扫雷的按钮。扫雷游戏的界面是14*14的
12、界面,戏中界面中有40个雷。 运行游戏,当玩家踩到地雷时,会出现如下的界面: 如果你认为是雷,就可以标上一个旗帜,如果不确定就可以标上一个问号,但是如果你踩到了地雷,将会出现上面的界面。 如果你扫雷成功了,就会有如下界面:如果你成功的标记处所有的雷区,那么,最后就会弹出“留下你大名”的界面。你就可以把你的名字保存在扫雷英雄榜中。五、本设计改进建议和总结我的程序界面的美观性做的不太好,比如说布局,颜色搭配有待改进,没有初始化界面,界面大小难以控制。当我做完之后,确实有一点成就感,这种感觉激励着自已更加努力的学习这门课程编程的进程肯定会遇到困难,要充分利用现有的资源比如说互联网,书籍,这次实验多亏
13、在在网上找的JavaAPI,帮助我解决了不小困难。要有团队合作精神,很感谢我的认友在这次实验给予我的帮助。 通过这次实训,增加了我学习软件技术的兴趣,虽然还不明确软件技术包含的具体内容,但从Java语言这门课程开始,已发现程序设计的乐趣,在学习Java语言的过程中也学到了许多计算机应用基础知识,对计算机的机体也有了一个大体的了解.特别是在做这些比较大型的编程软件中学到了很多知识。这次实训是老师给了题目,经过自己的努力,实现要求。先做简单的小程序游戏界面和布置,一步步的再做其它要求,在实际操作过程中犯的一些错误还会有意外的收获,感觉实训很有意思。在具体操作中对这学期所学的Java的理论知识得到巩
14、固,达到实训的基本目的,也发现自己的不足之出,在以后的上机中应更加注意,同时体会到Java语言具有的语句简洁,使用灵活,执行效率高等特点。发现上机实训的重要作用,特别是对数组和循环有了深刻的理解。 通过实际操作,学会Java语言程序编程的基本步骤、基本方法,开发了自己的逻辑思维能力,培养了分析问题、解决问题的能力。深刻体会到“没有做不到的,只有想不到的”,“团结就是力量”,“实践是检验真理的标准”的寓意。 在此希望以后应多进行这样的实训,加长设间,培养我们独立思考问题的能力,提高实际操作水平,感谢老师的指导。六、主要参考文献1 张永常 ,JAVA程序设计实用教程,电子工业出版社2施霞萍,JAV
15、A程序设计教程,机械工业出版社3 JavaApplet 实例编程,赤金、聂松编著,中国水利水电出版社4 Java 开发利器 Eclipse 从入门到精通张峰科技 编,清华大学出版社5Apache社区http:/www.apache.org六、程序源代码package com.sf.minesweeper.frame;import java.applet.Applet;import java.applet.AudioClip;import java.awt.BorderLayout;import java.io.FileInputStream;import java.io.FileNotFoun
16、dException;import java.io.InputStream;import javax.swing.ImageIcon;import javax.swing.JApplet;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.Timer;import .*;import java.applet.AudioClip;import com.sf.minesweeper.listener.MouseListener;import com.sf.m
17、inesweeper.menu.MineMenu;import com.sf.minesweeper.panel.MineField;import com.sf.minesweeper.panel.MineState;import com.sf.minesweeper.timer.Timers;import com.sf.minesweeper.bean.MineLabel;import com.sf.minesweeper.tools.Tools;public class SartFrame extends JFrame private static final long serialVer
18、sionUID = -1585043387266273492L; /* * param args */ private MineState mineState; / 记雷数 private MineField mineField; / 布置labble和雷数 private MineMenu mineMenu; private Timer timer; private Timers timers; /* * 游戏是否开始 */ private boolean isStart; /JLabel jLabel_start = new JLabel(); / 开始图片 public SartFram
19、e() this.setTitle(扫雷); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLocationRelativeTo(null); setIconImage(Tools.iicon); / 利用tools来做的作 this.setResizable(false); / 这样让窗口不会可放大 / .状态栏. mineState = new MineState(this); this.add(mineState, BorderLayout.NORTH); / .雷区. mineField = new MineF
20、ield(this); this.add(mineField, BorderLayout.CENTER); / .菜单栏. mineMenu = new MineMenu(this); this.setJMenuBar(mineMenu); / .时间. Tools.time = 0; timers = new Timers(mineState); timer = new Timer(1000, timers); pack(); this.setVisible(true); / 重新布局 public void restart() this.remove(mineState); this.re
21、move(mineField); / .状态栏. mineState = new MineState(this); this.add(mineState, BorderLayout.NORTH); / .雷区. mineField = new MineField(this); this.add(mineField, BorderLayout.CENTER); / .时间. Tools.time = 0; Timers timers = new Timers(mineState); timer = new Timer(1000, timers); pack(); validate();/刷新窗体
22、 public static long getSerialversionuid() return serialVersionUID; public MineState getMineState() return mineState; public MineField getMineField() return mineField; public MineMenu getMineMenu() return mineMenu; public Timer getTimer() return timer; public Timers getTimers() return timers; public
23、boolean isStart() return isStart; public void setStart(boolean isStart) this.isStart = isStart; public static void main(String args) new SartFrame(); package com.sf.minesweeper.bean;/Download by import javax.swing.JLabel; /* * 自定义标签(雷块) */public class MineLabel extends JLabel private static final lo
24、ng serialVersionUID = -7271927020145498558L; /* * 判断是否是雷 * */ private boolean isMine; /* * 判断雷块是否展开 * */ private boolean isExpanded; /* * 判断雷块是否是旗子 * */ private boolean isFlag; /* * 判断是否是雷且未标上旗子 * */ private boolean isMineAndNotflag; /* * count 计算雷块周围的雷数 * */ private int mineCount; /* * 雷块所在的行 * */
25、private int rowIndex; /* * 雷块所在的列 * */ private int colIndex; private int expend=0;/雷区上的行列坐标 public MineLabel(int rowIndex, int colIndex) this.rowIndex = rowIndex; this.colIndex = colIndex; /一向是对应的一些get和set方法 public boolean isMine() return isMine; public void setMine(boolean isMine) this.isMine = isM
26、ine; public boolean isExpanded() return isExpanded; public void setExpanded(boolean isExpanded) this.isExpanded = isExpanded; public boolean isFlag() return isFlag; public void setFlag(boolean isFlag) this.isFlag = isFlag; public int getMineCount() return mineCount; public void setMineCount(int mine
27、Count) this.mineCount = mineCount; public int getRowIndex() return rowIndex; public void setRowIndex(int rowIndex) this.rowIndex = rowIndex; public int getColIndex() return colIndex; public void setColIndex(int colIndex) this.colIndex = colIndex; /* * rightClickCount 右键点击次数 * */ private int rightCli
28、ckCount; public int getRightClickCount() return rightClickCount; public void setRightClickCount(int rightClickCount) this.rightClickCount = rightClickCount; package com.sf.minesweeper.bean;public class Own implements Comparable private int times; private String name; private String level; public Own
29、(int times, String name, String level) super(); this.times = times; this.name = name; this.level = level; public String getLevel() return level; public void setLevel(String level) this.level = level; public int getTimes() return times; public void setTimes(int times) this.times = times; public String getName() return name; public void setNa
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1