J A V A课程设计题目:扫雷游戏院(系)计算机信息工程学院专业网络工程班级 13级网络工程1班学生姓名方琴刘莉虹程子卿薛中意设计时间 2015年8月指导教师万中英提交日期2015年10月8日《扫雷》是一款大众类的益智小游戏。
游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷。
先任意点开少量的方格,没有爆炸时,会出现一个数字,这个数字代表的意思是以它为中心的9个格子内所有雷的个数。
一般围在一堆数字中间的有可能是雷,你在你认为是雷的那里插旗,就可以把它设定为雷,然后在数字区用鼠标左右键双击,可以打开非雷区,等打开所有非雷区,你就赢了。
采用GUI界面设计,窗口定位,绘图机制,鼠标监听等Java技术。
用户可以自己选择地雷的数量,地雷随机分布在17*24的方块矩阵中,地雷数量越多,难度越大。
鼠标放在方格上,单击鼠标左键开始游戏,按空格键插旗。
如果插旗错误,或是点击到了地雷,则游戏失败。
1.1 该设计的目的及意义1.2 该设计的要求1.3 相关技术2 总体设计2.1 功能设计3 详细设计3.1 系统界面设计3.1.1 流程图3.1.2 界面截图3.2 程序描述3.2.1 选择地雷数量3.2.2 游戏界面4 课程设计总结4.1遇到问题解决问题过程4.2 系统存在的问题,进一步要做的工作4.3 课程设计心得体会5 附录(程序代码)1.1 该设计的目的及意义1.利用扫雷游戏巩固和Java语言程序设计这一课程的基本知识的理解和掌握;2.掌握Java语言程序设计中编程和程序调试的基本技能;3.基本掌握完全面向对象程序设计的基本思路和方法;4.利用Java语言程序设计学会基本的软件设计;5.掌握书写程序设计说明文档的能力。
1.2 课程设计要求1. 分析课程设计题目的思路及要求;2. 编写程序代码,调试程序使其能正确运行;3. 设计完成的软件要便于操作和使用,有整齐、美观的使用界面;4. 能实现简单的扫雷游戏;1.3 相关技术1.GUI界面设计;2.窗口定位;3.绘画基础;4.事件监听;5.继承,以及接口技术;2.1 功能设计IndexPanel类成员变量变量意义变量类型名称long serialVersionUID 增加雷按钮值boolean buAdd减少雷按钮值boolean buDec玩游戏按钮值boolean buPlay成员方法方法名称功能备注IndexPanel 初始化参数构造方法paint 绘出游戏界面mousePressed 实现鼠标单击事件接口方法mouseReleased 实现鼠标释放事件接口方法该类实现游戏的开始界面,继承了JPanel 同时实现了监听MouseListener (鼠标监听)事件。
主要用于选定炸弹的数目,即游戏的难易程度,点击 play按钮则开始游戏。
炸弹数量默认为60。
public void paint(Graphics g){}采用画笔的方式设计界面,布局清晰,实现窗口的定位。
例如:// 画设置炸弹数目的小球(40)g.setColor(Color.white); // 画笔的颜色g.fillOval(40, 120, 30, 30); // 画的图形是实心圆g.setColor(Color.gray); // 重新设置画笔的颜色g.drawOval(40, 120, 30, 30); // 画的图形是空心圆 g.drawString("40", 47, 142); //图形上面的字符串// 画PLAY按钮g.setColor(Color.white);g.draw3DRect(30, 320, 120, 30, buPlay);g.drawString("PLAY", 70, 340);public void mousePressed(MouseEvent e) { ;}鼠标点击事件,实现炸弹的选择。
MyPanel类成员变量变量意义变量类型名称返回后重新开始int replay每插一旗变量加一int win判断是否赢int gameWinlong serialVersionUID 判断是否结束int gameOver是否有雷的标志int[] bombFlag方块周围雷数int[] count雷坐标Int[] bomb_x,bomb_y判断是否插旗Int[] hadFlag判断插旗是否正确int check插旗错误点的坐标int check_x,check_y判断是否点击过Int[] clicked判断是否已经清除过Int[] clearFlag成员方法方法名称功能备注MyPanel 初始bombCount变量构造方法paint 绘出雷区,初始化雷区,及定义雷系统核心部分,使用了窗mousePressed 实现鼠标点击事件,挖开方块接口方法clear 清除点击处周围安全非提示方块keyPressed 实现键盘事件,插旗接口方法该类是游戏界面,也是最核心的类。
不仅继承了JPanel类,也通过鼠标和键盘的监听事件,实现扫雷游戏。
之前选择的炸弹随机分布在24*17个小方格内。
插旗提示:鼠标放在方格上,按空格键插旗。
public void paint(Graphics g) { //采用画布的方式添加方格super.paint(g);if(replay == 1){for (int i = 0; i < bombCount; i++) {bomb_x[i] = (int) (Math.random() * 24 - 0.1);bomb_y[i] = (int) (Math.random() * 16 - 0.1);hadFlag[i] = 0;}for (int i = 0; i < 24*17; i++) {bombFlag[i] = 0;count[i] = 0;clicked[i] = 0;clearFlag[i] = 0;}}public void keyPressed( KeyEvent e ) { ; } //鼠标点击后游戏进程public void clear(int i, int j) { ; }// 清除点击处周围的安全非提示方块3. public class Index {static IndexPanel panel1;static MyPanel panel2;. . .}该类是游戏的主类,引用了静态的IndexPanel 类以及 MyPanel 类。
主要决定页面设计,窗口大小,以及添加事件。
3.1.1 流程图 3.1.2 界面截图运行程序选择炸弹数量点击 play按钮开始游戏点到雷,则游戏失败否则成功3.2.1 选择地雷数量炸弹数量越多,难度越大。
public void mouseReleased(MouseEvent e) {if (e.getX() >= 30 && e.getX() <= 80 && e.getY() >= 70 && e.getY() <= 100) {buAdd = true; MyPanel.bombCount++;}if (e.getX() >= 100 && e.getX() <= 150 && e.getY() >= 70 && e.getY() <= 100) {buDec = true; MyPanel.bombCount--;}if (e.getX() >= 30 && e.getX() <= 150 && e.getY() >= 320 && e.getY() <= 350) {buPlay = true; this.setVisible(false);Index.panel2.setVisible(true);}repaint();}public void mousePressed (MouseEvent e) {if (e.getX() >= 30 && e.getX() <= 80 && e.getY() >= 70 && e.getY() <= 100) {buAdd = false;}if (e.getX() >= 100 && e.getX() <= 150 && e.getY() >= 70 && e.getY() <= 100) {buDec = false;}if (e.getX() >= 40 && e.getX() <= 70 && e.getY() >= 120 && e.getY() <= 150) {MyPanel.bombCount = 40;}if (e.getX() >= 30 && e.getX() <= 150 && e.getY() >= 320 && e.getY() <= 350) {buPlay = false;}repaint();}3.2.2 游戏界面点击游戏主面板的任一方格public void mousePressed(MouseEvent e) {replay = 0;if((e.getX() > 420 && e.getX() < 480 && e.getY() > 380 && e.getY() < 405)){System.out.println("fahui");check = 1;replay = 1;win = 0;gameOver = 0;gameWin = 0;bombCount = 60;repaint();this.setVisible(false);Index.panel1.setVisible(true);}else{if ((e.getY()<375)&&gameOver == 0 && gameWin == 0) {int mouse_i = e.getX() / 22;int mouse_j = e.getY() / 22;clicked[mouse_i * 17 + mouse_j] = 1;for (int i = 0; i < bombCount; i++) {if ((mouse_i == bomb_x[i]) && (mouse_j == bomb_y[i])) {gameOver = 1;break;}}if ((count[mouse_i * 17 + mouse_j] == 0) && (gameOver == 0)) {clear(mouse_i, mouse_j);}repaint();}else{if((gameOver == 1 || gameWin == 1)&&(e.getX() > 68 && e.getX() < 128 && e.getY() > 390 && e.getY() < 420)){System.out.println("fahui");check = 1;replay = 1;win = 0;gameOver = 0;gameWin = 0;bombCount = 60;repaint();this.setVisible(false);Index.panel1.setVisible(true);}}}}4.1遇到问题解决问题过程A. 没有返回键相互讨论,添加replay按钮,点击后所有数据初始化,重新开始回到选择界面。