软工JAVA课程设计

上传人:桔**** 文档编号:568588276 上传时间:2024-07-25 格式:PDF 页数:24 大小:648.89KB
返回 下载 相关 举报
软工JAVA课程设计_第1页
第1页 / 共24页
软工JAVA课程设计_第2页
第2页 / 共24页
软工JAVA课程设计_第3页
第3页 / 共24页
软工JAVA课程设计_第4页
第4页 / 共24页
软工JAVA课程设计_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《软工JAVA课程设计》由会员分享,可在线阅读,更多相关《软工JAVA课程设计(24页珍藏版)》请在金锄头文库上搜索。

1、-JAVAJAVA 程序设计程序设计课程设计报告课程设计报告院院 系:系:计算机与信息工程学院计算机与信息工程学院题题 目目: :吞食蛇吞食蛇学生姓名学生姓名 : : 张聚营张聚营卢毛毛卢毛毛学生学号学生学号 : 20144499 20144645: 20144499 20144645专业班级专业班级 : :软一软一软二软二指导教师指导教师 : :吴光伟吴光伟完成时间完成时间 : 2016: 2016 年年 6 6 月月 2323 号号-目录1 需求分析 .31.1 基本功能如下:.31.2 扩展功能: .32 设计 .32.1设计思路 .32.3 系统功能模块 .42.4 程序流程图 .4图

2、 2.2 .62.5 总设计模块的划分.63 功能的具体实现.73.1 重新开始 .73.2 暂停 .73.3 保存分数 .83.4 加速减速 .94 运行结果 .94.1 游戏开始界面 .94.2 蛇撞到自身结束游戏.104.3 蛇撞到墙面结束游戏.104.4 游戏暂停 .114.5 游戏在暂停或者运行时重新开始 .114.6 游戏分数的保存.12总 结.13参 考 文 献.14附录 A 源代码 .15评分 表: .24-1 1 需求分析需求分析1.11.1 基本功能如下:基本功能如下:1.能够使用键盘控制吞食蛇的行动。2.能够随机生成食物,供吞食蛇吞噬。3.提供游戏的暂停和保存的功能。1.

3、21.2 扩展功能:扩展功能:4.提供难度的选择,如速度、地形。5.提供服务器,让玩家可以比较战绩。其他功能可以按照自己的兴趣进行创新添加。2 2 设计设计2.12.1 设计思路设计思路贪吃蛇游戏设计与实现,主要分为以下二个模块:游戏主界面模块和游戏控制模块。在此只实现游戏的游戏主界面模块、游戏控制模块。并且只是实现移动速度、暂停、重新开始等功能。游戏主界面模块:游戏的主界面是进入游戏后,能够给玩家第一感官的部分,主要包括游戏图形区域界面、游戏的速度选择更新界面、新生方块的预览、暂停游戏按钮、重新开始游戏按钮。从很大程度上决定了玩家对游戏的兴趣问题,因此,游戏的主界面应该力求美观,爽心悦目。游

4、戏控制模块:这个模块是游戏的中心环节,主要完成控制游戏的开始、暂停、-重新开始等功能。为了能够给玩家一个很好的游戏环境,这部分应该做到易懂、易操作。本设计所开发的是基于 Java 的一个贪吃蛇游戏软件,主要实现游戏的速度控制、游戏的暂停、游戏的退出等功能,分为: 游戏主界面模块,游戏主界面模块等两个模块。1234GreedSnakeSnakeControlSnakeModelSnakeView该文件为程序入口,含有 main 方法控制器,控制蛇,食物,石头该文件实现蛇类实 现 菜 单 控 制 运 行 等 总 体 要 求 , 实现 方 向 键 控 制 蛇 方 向 , 空 格 键 或 P键控制游戏

5、暂停或继续,PageUp和PageDown控制速度,R 键控制游戏开始,还有分数等。图 2.12.22.2 设计目标设计目标本软件是针对贪食蛇小游戏的 JAVA 程序,利用方向键来改变蛇的方向;按 PageUp加速,PageDown减速;按空格键或 P 键暂停或继续游戏;按 R 键重新开始。并在随机的地方产生食物,吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常运行2.32.3 系统功能模块系统功能模块Java 源文件及其功能如表所示:2.42.4 程序流程图程序流程图本次游戏设计的处理流程如图。-游戏开始键盘操作:向上向下向左向右加速减速没有吃到食物且蛇碰到边界或自身分数保存游 戏途

6、 欲断 ,后 继游戏中中稍续点击SpeedUp加SpeedDow点击确认结束游戏点击 S 保存点击空格或暂停再 次 点 击 , 游 戏 继续-图图 2.22.22.52.5 总设计模块的划分总设计模块的划分根据游戏需求中游戏所要实现的功能,整个游戏分为二个模块进行具体的设计,如图 2 所示。贪吃蛇游戏游戏主界面模游戏控制模块游戏控制模块的主要框架如图 3 所示。游戏控制模块块游戏的暂停功能图图 2.32.3图图 2.42.4 控控制制模模块块框框架架-游戏的重新开始 游戏的保存-游戏暂停控制:点击“空格”按钮或 P,游戏暂停;再单击,游戏继续。游戏重新开始控制:点击“R” 键后,点击确定,即游

7、戏重新开始。游戏保存控制:点击“S” 键好,点击确定,退出游戏界面。游戏加速减速控制:点击“SpeedUp” 加速,点击“SpeedDown”减速。3 3 功能的具体实现功能的具体实现3.13.1 重新开始重新开始按 R 键使进行中的游戏或者暂停中的游戏重新开始,调用 reset方法,相关代码如下:casecase KeyEvent. VK_RVK_R :/- 按 R 键重新启动游戏model .reset();breakbreak ;publicpublicvoidvoid reset()direction = SnakeModel.UPUP;/ 蛇运行的方向timeInterval = 2

8、00;/ 时间间隔,毫秒paused = falsefalse ;/ 暂停标志score = 0;/ 得分countMove = 0;/ 吃到食物前移动的次数3.23.2 暂停暂停定义一个布尔类型,pause ,初始化为 false ,再在无限循环运动running 类运用 if 语句,具体代码如下:-booleanbooleanpaused = falsefalse ;booleanbooleanpaused = falsefalse ;ifif (! paused ) ifif (moveOn() setChanged();/ Model通知 View 数据已经更新 notifyObser

9、vers(); elseelse JOptionPane.showMessageDialog(nullnull ,you failed,Game Over ,JOptionPane.INFORMATION_MESSAGEINFORMATION_MESSAGE);breakbreak ; 3.33.3 保存分数保存分数按 S 键保存,在 keyPressed类中,调用 keyEvent类,如果是 S,则执行如下代码,将分数保存在 score.java中。casecase KeyEvent. VK_SVK_S : /-按 S 键保存FileWriterfileWritter =nullnull ;

10、trytry fileWritter = newnewFileWriter( score ,truetrue ); /将分数保存到 score 文件fileWritter .write( model .score +n );catchcatch (FileNotFoundExceptione1) e1.printStackTrace();catchcatch (IOExceptione1) e1.printStackTrace(); finallyfinally trytry ifif (fileWritter !=nullnull )fileWritter .close(); catchca

11、tch (IOExceptione1) e1.printStackTrace(); -breakbreak ;3.43.4 加速减速加速减速同样的,调用 speedUp ,speedDown方法:casecase KeyEvent. VK_PAGE_UPVK_PAGE_UP :/-按 PageUp加速model .speedUp();breakbreak ;casecase KeyEvent. VK_PAGE_DOWNVK_PAGE_DOWN:/- 按 PageDown减速model .speedDown();4 4 运行结果运行结果4.14.1 游戏开始界面游戏开始界面图 4.1-4.24.

12、2 蛇撞到自身结束游戏蛇撞到自身结束游戏图 4.24.34.3 蛇撞到墙面结束游戏蛇撞到墙面结束游戏图 4.3-4.44.4 游戏暂停游戏暂停图 4.44.54.5 游戏在暂停或者运行时重新开始游戏在暂停或者运行时重新开始图 4.5-4.64.6 游戏分数的保存游戏分数的保存图 4.6-总总 结结课程设计是对学习成果的考核和总结,这两个礼拜通过小组努力和吴光伟老师的耐心指导,本着严谨诚实,开拓创新的精神,完成了这次设计。这次设计是我们第一次从理论构思到实际工程论证的设计,它使我们深刻理解了在所学到的知识,让我们把所学的知识从头梳理和使用了一遍,巩固了我们的知识,也接触到了一些未曾接触过的东西,

13、受益匪浅。-参参 考考 文文 献献1 叶核亚,陈道蓄. JAVA程序设计实用教程.(第四版).北京:子工业出版社,2013.112 汤阳光. 智播客贪食蛇游戏项目开发3 耿祥义.JAVA大学实用教程.北京:清华大学出版社,2009-电-附录附录 A A 源代码源代码/GreedSnake.javapackage mvcTest;publicclass GreedSnake publicstaticvoid main(Stringargs ) SnakeModelmodel = new SnakeModel(20,30); SnakeControlcontrol = new SnakeContr

14、ol(model ); SnakeViewview = new SnakeView( model ,control );/添加一个观察者,让 view 成为 model 的观察者model .addObserver(view ); ( new Thread( model ).start(); /SnakeControl.javapackage mvcTest;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.io.FileNotFoundException;import java.io.Fi

15、leWriter;import java.io.IOException;public class SnakeControl implements KeyListener-SnakeModel model; public SnakeControl(SnakeModel model) this.model = model; public void keyPressed(KeyEvent e) int keyCode = e.getKeyCode(); switch (keyCode) /-按上下左右键控制蛇的方向 case KeyEvent.VK_UP:model.changeDirection(

16、SnakeModel.UP); break; case KeyEvent.VK_DOWN:model.changeDirection(SnakeModel.DOWN); break; case KeyEvent.VK_LEFT:model.changeDirection(SnakeModel.LEFT); break; case KeyEvent.VK_RIGHT:model.changeDirection(SnakeModel.RIGHT); break; case KeyEvent.VK_PAGE_UP:/- 按 pageup 加速 model.speedUp(); break; case

17、 KeyEvent.VK_PAGE_DOWN:/- 按 pagedown减速 model.speedDown(); break; case KeyEvent.VK_SPACE:/- 按空格键或 P 键暂停游戏 case KeyEvent.VK_P: model.changePauseState(); break; case KeyEvent.VK_R:/- 按 R 键重新启动游戏model.reset(); break; case KeyEvent.VK_S: /- 按 S 键保存分数FileWriter fileWritter =null;try -fileWritter = newFile

18、Writer(score,true);/将分数保存到 score 文件fileWritter.write(model.score+n);catch (FileNotFoundException e1) e1.printStackTrace();catch (IOException e1) e1.printStackTrace(); finally try if (fileWritter != null)fileWritter.close(); catch (IOException e1) e1.printStackTrace(); break; default: public void key

19、Released(KeyEvent e) public void keyTyped(KeyEvent e) /SnakeModel.javapackage mvcTest;import javax.swing.*;import java.util.Arrays;import java.util.LinkedList;import java.util.Observable;import java.util.Random;public class SnakeModel extends Observable implementsRunnable boolean matrix; /指示位置上有没蛇体或

20、食物 LinkedList nodeArray = new LinkedList();/ 蛇体 Node food; int maxX; int maxY; int direction = 2; /蛇运行的方向- boolean running = false; /运行状态 int timeInterval = 200; /时间间隔,毫秒 double speedChangeRate = 0.75; /每次得速度变化率 boolean paused = false; /暂停标志 int score = 0; /得分 int countMove = 0; /吃到食物前移动的次数 public s

21、tatic final int UP = 2; public static final int DOWN = 4; public static final int LEFT = 1; public static final int RIGHT = 3; public SnakeModel( int maxX, int maxY) this.maxX = maxX; this.maxY = maxY; reset(); public void reset() direction = SnakeModel.UP; /蛇运行的方向 timeInterval = 200; /时间间隔,毫秒 pause

22、d = false; /暂停标志 score = 0; /得分 countMove = 0; /吃到食物前移动的次数 /初始化 matirx matrix = new booleanmaxX; for (int i = 0; i 20 ? 10 : maxX / 2;- nodeArray.clear(); for (int i = 0; i initArrayLength; +i) int x = maxX / 2 + i;/maxX被初始化为 20 int y = maxY / 2; /maxY被初始化为 30 /nodeArrayx,y: 10,15-11,15-12,1520,15 /

23、默认的运行方向向上,所以游戏一开始 nodeArray就变为: / 10,14-10 ,15-11 ,15-12 ,1519 ,15 nodeArray.addLast(new Node(x, y); matrixxy = true; /创建食物 food = createFood(); matrixfood.xfood.y = true; public void changeDirection(int newDirection) /改变的方向不能与原来方向同向或反向 if (direction % 2 != newDirection % 2) direction = newDirection

24、; public boolean moveOn() Node n = (Node) nodeArray.getFirst(); int x = n.x; int y = n.y; /根据方向增减坐标值 switch (direction) case UP: y-; break; case DOWN: y+; break; case LEFT: x-; break; case RIGHT: x+; break; /如果新坐标落在有效范围内,则进行处理 if (0 = x & x maxX) & (0 = y & y 0 ? scoreGet :10; countMove = 0; food =

25、createFood();/ 创建新的食物 matrixfood.xfood.y = true;/ 设置食物所在位置 return true; else/ 吃到蛇体自身,失败 return false; else /如果新坐标的点上没有东西(蛇体),移动蛇体 nodeArray.addFirst(new Node(x, y); matrixxy = true; n = (Node) nodeArray.removeLast(); matrixn.xn.y = false; countMove+; return true; return false;/ 触到边线,失败 public void r

26、un() running = true; while (running) try Thread.sleep(timeInterval); catch (Exception e) break; if (!paused) if (moveOn() setChanged(); / Model通-知 View 数据已经更新 notifyObservers(); else JOptionPane.showMessageDialog(null, you failed, Game Over,JOptionPane.INFORMATION_MESSAGE); break; running = false; p

27、rivate Node createFood() int x = 0; int y = 0; /随机获取一个有效区域内的与蛇体和食物不重叠的位置 do Random r = new Random(); x = r.nextInt(maxX); y = r.nextInt(maxY); while (matrixxy); return new Node(x, y); public void speedUp() timeInterval *= speedChangeRate; public void speedDown() timeInterval /= speedChangeRate; publ

28、ic void changePauseState() paused = !paused; public String toString() String result = ; for (int i = 0; i nodeArray.size(); +i) Node n = (Node) nodeArray.get(i); result += + n.x + , + n.y + ; return result; class Node - int x; int y; Node(int x, int y) this.x = x; this.y = y; /SnakeView.javapackage

29、mvcTest;import javax.swing.*;import java.awt.*;import java.util.Iterator;import java.util.LinkedList;import java.util.Observable;import java.util.Observer;public class SnakeView implements ObserverSnakeControl control = null; SnakeModel model = null; JFrame mainFrame; Canvas paintCanvas; JLabel labe

30、lScore; public static final int canvasWidth = 200; public static final int canvasHeight = 300; public static final int nodeWidth = 10; public static final int nodeHeight = 10; public SnakeView(SnakeModel model, SnakeControlcontrol) this.model = model; this.control = control; mainFrame = new JFrame(G

31、reedSnake); Container cp = mainFrame.getContentPane(); /创建顶部的分数显示 labelScore = new JLabel(Score:); cp.add(labelScore, BorderLayout.NORTH); /创建中间的游戏显示区域 paintCanvas = new Canvas(); paintCanvas.setSize(canvasWidth + 1,canvasHeight + 1); paintCanvas.addKeyListener(control); cp.add(paintCanvas, BorderLa

32、yout.CENTER); /创建底下的帮助栏 JPanel panelButtom = new JPanel(); panelButtom.setLayout(new BorderLayout(); JLabel labelHelp; labelHelp = new JLabel(按 PageUp 加速, 按PageDown减速;, JLabel.CENTER);- panelButtom.add(labelHelp, BorderLayout.NORTH); labelHelp = new JLabel(按 R 重新开始;,JLabel.CENTER); panelButtom.add(l

33、abelHelp,BorderLayout.CENTER); labelHelp = new JLabel(按 SPACE 键 或 P 键暂停游戏, JLabel.CENTER); panelButtom.add(labelHelp, BorderLayout.SOUTH); cp.add(panelButtom, BorderLayout.SOUTH); mainFrame.addKeyListener(control); mainFrame.pack(); mainFrame.setResizable(false);mainFrame.setDefaultCloseOperation(JF

34、rame.EXIT_ON_CLOSE); mainFrame.setVisible(true); void repaint() Graphics g = paintCanvas.getGraphics(); /draw background g.setColor(Color.WHITE); g.fillRect(0, 0, canvasWidth, canvasHeight); / draw the snake g.setColor(Color.BLACK); LinkedList na = model.nodeArray; Iterator it = na.iterator(); while

35、 (it.hasNext() Node n = (Node) it.next(); drawNode(g, n); / draw the food g.setColor(Color.RED); Node n = model.food; drawNode(g, n); updateScore(); private void drawNode(Graphics g, Node n) g.fillRect(n.x * nodeWidth, n.y * nodeHeight, nodeWidth - 1, nodeHeight - 1); public void updateScore() String s = Score: + model.score; labelScore.setText(s); public void update(Observable o, Object arg) repaint(); -评分表:评分表:课题名称指导教师JAVA 程序设计 课程设计吞食蛇吴光伟评语姓 名学号2014449920144645成绩年月日成绩评定张聚营卢毛毛日期-

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号