资源预览内容
第1页 / 共54页
第2页 / 共54页
第3页 / 共54页
第4页 / 共54页
第5页 / 共54页
第6页 / 共54页
第7页 / 共54页
第8页 / 共54页
第9页 / 共54页
第10页 / 共54页
亲,该文档总共54页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
数据结构课程设计数据结构课程设计报数据结构课程设计报 告告扫雷游戏学院: 班级:姓名: 数据结构课程设计学号:日期:目录一系统开发平台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.1class Start.146.2class Window146.3class Play206.4class Lattice .406.5class JCounter.426.6class TimeCounterThread.466.7class MyDialog.47数据结构课程设计一 系统开发平台题目:扫雷游戏开发语言:JAVA开发工具:Eclipse操作系统:Microsoft Windows 7二 设计要求2.1 问题描述实现一个 M*N 的扫雷游戏。2.2 输入要求2.1.1左键单击:在判断出不是雷的方块上按下左键,可以打开该方块。如果方块上出现数字,则该数字表示其周 围 33 区域中的地雷数(一般为 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()方法已不建议使用,为了终止计时器线程,我设定了一个标记 boolean flag,用来控制线程的结束,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.1 class Startpackage saolei;/* author JSM 开始游戏*/public class Startpublic static void main(String args)new Window();class Windowpackage saolei;import javax.swing.*;import java.awt.*;import java.awt.event.*;/* author JSM 游戏窗口,继承自 JFrame*/数据结构课程设计public class Window extends JFrame/* */private static final long serialVersionUID = 819044217250493847L;/ 获取屏幕尺寸Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();/ 设定屏幕大小位置的参数int width;int height;int x;int y;/ 菜单栏JMenuBar menu = new JMenuBar();/ 菜单条目JMenu game = new JMenu(“游戏“);JMenuItem start = new JMenuItem(“开局“);JMenuItem primary = new JMenuItem(“初级“);JMenuItem intermediate = new JMenuItem(“中级“);JMenuItem senior = new JMenuItem(“高级“);JMenuItem custom = new JMenuItem(“自定义“);/ JMenuItem mark = new JMenuItem(“标记(?)“);/ JMenuItem JMenuItem(“风格“);/ JMenuItem rank = new JMenuItem(“扫雷英雄榜“);JMenuItem quit = new JMenuItem(“退出“);JMenu help = new JMenu(“帮助“);JMenuItem about = new JMenuItem(“关于“);数据结构课程设计/ 游戏界面Play p;/* 空构造器*/public Window()this(9, 9, 10);/* 构造器,传入扫雷界面的行数 M,列数 N,雷数 SUM*/public Window(final int M, final int N, final int SUM)/ 调用父类构造器,设定窗口标题super(“扫雷“);/ 窗口的宽度和高度,经过精密测量得到的结果width = (N + 4) * Play.SPACE + 17;height = (M + 6) * Play.SPACE + 14;/ 窗口的位置,放在屏幕中央x = (screenSize.width - width) / 2;y = (screenSize.height - height) / 2;/ 设置大小,位置setBounds(x, y, width, height);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/ 开局按钮添加监听器start.addActionListener(new ActionListener()数据结构课程设计public void actionPerformed(ActionEvent e)setVisible(false);new Window(M, N, SUM););game.add(start);game.addSeparator();/ 初级按钮添加监听器primary.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)setVisible(false);new Window(9, 9, 10););game.add(primary);/ 中级按钮添加监听器intermediate.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)setVisible(false);new Window(16, 16, 40););game.add(intermediate);/ 高级按钮添加监听器数据结构课程设计senior.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)setVisible(false);new Window(16, 30, 99););game.add(senior);/ 自定义按钮添加监听器custom.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)newWin(););game.add(custom);/ game.addSeparator();/ game.add(mark);/ game.add(style);/ game.addSeparator();/ game.add(rank);game.addSeparator();/ 退出按钮添加监听器,结束程序quit.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)System.exit(0);数据结构课程设计);game.add(quit);menu.add(game);/ 添加菜单栏的帮助about.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)/ for (int i = 0; i 0; k-)/ 先判断随机产生的位置是否已经是地雷,如果已经是地雷则此次操作回退i = r.nextInt(m);j = r.nextInt(n);/ System.out.print(ii + “ “);数据结构课程设计/ System.out.println(jj+“ “+a);if (mineij.getLat() = 0 elsek+;/ 下面进行判断,思路:遍历“地雷”位置,找到后对其附近的数组进行加 1 操作for (i = 0; i 8)if (j 0)/ 保证列不越界mineij - 1.addLat();if (j 0)/ 上一行minei - 1j.addLat();if (j 0)minei - 1j - 1.addLat();数据结构课程设计if (j 0)
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号