数据结构课程设计报告扫雷游戏学院:班级:姓名:学号:日期:目录一系统开发平台................................................................................................................3二设计要求........................................................................................................................32.1问题描述.................................................................................................................................32.2输入要求.................................................................................................................................32.3输出要求.................................................................................................................................4三数据结构与算法描述....................................................................................................43.1整体思路.................................................................................................................................43.2所需数据结构及算法.............................................................................................................5四测试结果........................................................................................................................64.1测试输入及输出.....................................................................................................................64.2测试中的问题及解决...........................................................................................................12五分析与讨论..................................................................................................................125.1测试结果分析.......................................................................................................................125.2算法复杂性分析...................................................................................................................135.3探讨及改进...........................................................................................................................13六附录(源代码)..............................................................................................................146.1classStart...........................................................................................................................146.2classWindow....................................................................................................................146.3classPlay............................................................................................................................206.4classLattice.......................................................................................................................406.5classJCounter...................................................................................................................426.6classTimeCounterThread.............................................................................................466.7classMyDialog.................................................................................................................47一系统开发平台题目:扫雷游戏开发语言:JAVA开发工具:Eclipse操作系统:MicrosoftWindows7二设计要求2.1问题描述实现一个M*N的扫雷游戏。2.2输入要求2.1.1左键单击:在判断出不是雷的方块上按下左键,可以打开该方块。如果方块上出现数字,则该数字表示其周围3×3区域中的地雷数(一般为8个格子,对于边块为5个格子,对于角块为3个格子。所以扫雷中最大的数字为8);如果方块上为空(相当于0),则可以递归地打开与空相邻的方块;如果不幸触雷,则游戏结束。2.1.2右键单击:在判断为地雷的方块上按下右键,可以标记地雷(显示为小红旗)。重复两次操作可取消标记。2.1.3双击:同时按下左键和右键完成双击。当双击位置周围已标记雷数等于该位置数字时操作有效,相当于对该数字周围未打开的方块均进行一次左键单击操作。地雷未标记完全时使用双击无效。若数字周围有标错的地雷,则游戏结束。2.3输出要求以图形界面的形式输出游戏数据,如下图:三数据结构与算法描述3.1整体思路3.2所需数据结构及算法3.2.1数据结构记录类区的各个属性用到了二维数组3.2.2算法点击到空白格子时递归的打开周围的八个格子用到了递归算法:四测试结果4.1测试输入及输出4.1.1初级游戏4.1.2中级游戏4.1.3高级游戏4.1.4自定义游戏对话框4.1.5自定义游戏及游戏结束4.1.6游戏胜利4.1.7帮助4.1.8关于4.2测试中的问题及解决问题1:测试过程中,发现地雷实际显示的位置和它应该显示的位置不同,正好沿着左上右下斜对角线对称;解决:由于坐标(i,j)表示i行j列,i对应到屏幕上坐标为Y轴,j对应到屏幕上坐标为X轴,所以造成了地雷实际显示的位置和它应该显示的位置不同,发现这个问题后,将paint中的i,j对调一下便得到了正确结果。问题2:由于线程中的stop()方法已不建议使用,为了终止计时器线程,我设定了一个标记booleanflag,用来控制线程的结束,flag=true时,计时器线程不断+1,flag=false时,计时器线程终止。测试过程中,发现游戏开始后点击开始按钮,计时器总会显示为1而不是0;解决:由于对线程理解不足,产生生这个问题的原因目前还不清楚,不过经过上网查询后得到了解决办法。由于计时器线程运行时使用了sleep方法,线程处于阻塞状态,因此利用interrupt方法来中断线程,解决了这个问题。五分析与讨论5.1测试结果分析由于题目的特殊性,没有测试数据,具体的测试结果参见4.1测试输入及输出。分析:多次测试结果显示程序运行正常,无异常。5.2算法复杂性分析由于点击到空白格子时递归的打开周围的八个格子用到了递归算法;算法复杂性:检查1层格子最多检查9个格子;检查2层格子最多检查25个格子;检查3层格子最多检查49个格子;检查4层格子最多检查81个格子;检查5层格子最多检查121个格子;……;检查N层格子最多检查(2N+1)²个格子;实际算法复杂性:O(N²)5.3探讨及改进5.3.1主要算法采用了递归的方法,虽清晰易懂,但效率不高,可以改为非递归的采用队列实现的算法,这样算法的效率有明显的提高。5.3.2扫雷区域内显示的数字是即时画上去的,可以采用图片填充的方法,这样子界面更加美观,且容易更改界面外观。六附录(源代码)6.1classStartpackagesaolei;/***@authorJSM开始游戏*/publicclassStart{publicstaticvoidmain(String[]args){newWindow();}}6.2classWindowpackagesaolei;importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;/***@authorJSM游戏窗口,继承自JFrame*/publicclassWindowextendsJFrame{/****/privatestaticfinallongserialVersionUID=819044217250493847L;//获取屏幕尺寸DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();//设定屏幕大小位置的参数intwidth;intheight;intx;inty;//菜单栏JMenuBarmenu=newJMenuBar();//菜单条目JMenugame=newJMenu(游戏);JMenuItemstart=newJMenuItem(开局);JMenuItemprimary=newJMenuItem(初级);JMenuItemintermediate=newJMenuItem(中级);JMenuItemsenior=n