




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1JAVA程序设计课程设计报告院 系: 计算机与信息工程学院 题 目: 吞食蛇 学生姓名: 张聚营 卢毛毛学生学号: 20144499 20144645专业班级: 软一 软二 指导教师: 吴光伟 完成时间: 2016年6月23号 1目录1 需求分析31.1基本功能如下:31.2扩展功能:32 设计32.1 设计思路32.3系统功能模块42.4程序流程图4图2.262.5总设计模块的划分63功能的具体实现73.1重新开始73.2暂停73.3保存分数83.4加速减速94运行结果94.1游戏开始界面94.2蛇撞到自身结束游戏94.3蛇撞到墙面结束游戏104.4游戏暂停104.5游戏在暂停或者运行时重新开始114.6游戏分数的保存11总 结13参 考 文 献14附录A源代码15评分表:231 需求分析1.1基本功能如下:1. 能够使用键盘控制吞食蛇的行动。 2. 能够随机生成食物,供吞食蛇吞噬。3. 提供游戏的暂停和保存的功能。1.2扩展功能:4. 提供难度的选择,如速度、地形。5. 提供服务器,让玩家可以比较战绩。其他功能可以按照自己的兴趣进行创新添加。2 设计2.1 设计思路贪吃蛇游戏设计与实现,主要分为以下二个模块:游戏主界面模块和游戏控制模块。在此只实现游戏的游戏主界面模块、游戏控制模块。并且只是实现移动速度、暂停、重新开始等功能。游戏主界面模块:游戏的主界面是进入游戏后,能够给玩家第一感官的部分,主要包括游戏图形区域界面、游戏的速度选择更新界面、新生方块的预览、暂停游戏按钮、重新开始游戏按钮。从很大程度上决定了玩家对游戏的兴趣问题,因此,游戏的主界面应该力求美观,爽心悦目。游戏控制模块:这个模块是游戏的中心环节,主要完成控制游戏的开始、暂停、重新开始等功能。为了能够给玩家一个很好的游戏环境,这部分应该做到易懂、易操作。本设计所开发的是基于Java的一个贪吃蛇游戏软件,主要实现游戏的速度控制、游戏的暂停、游戏的退出等功能,分为: 游戏主界面模块,游戏主界面模块等两个模块。图2.12.2设计目标本软件是针对贪食蛇小游戏的JAVA程序,利用方向键来改变蛇的方向;按PageUp加速,PageDown减速;按空格键或P键暂停或继续游戏;按R键重新开始。并在随机的地方产生食物,吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常运行2.3系统功能模块Java源文件及其功能如表所示:1GreedSnake该文件为程序入口,含有main方法2SnakeControl控制器,控制蛇,食物,石头3SnakeModel该文件实现蛇类4SnakeView实现菜单控制运行等总体要求,实现方向键控制蛇方向,空格键或P键控制游戏暂停或继续,PageUp和PageDown控制速度,R键控制游戏开始,还有分数等。2.4程序流程图本次游戏设计的处理流程如图。游戏开始键盘操作: 向上 向下向左 向右加速减速没有吃到食物且蛇碰到边界或自身分数保存游戏中途欲中断,稍后继续游戏再次点击,游戏继续点击SpeedUp加SpeedDow点击确认结束游戏点击S保存点击空格或暂停图2.22.5总设计模块的划分根据游戏需求中游戏所要实现的功能,整个游戏分为二个模块进行具体的设计,如图2所示。贪吃蛇游戏游戏主界面模块游戏控制模块图2.3 游戏控制模块的主要框架如图3所示。游戏控制模块游戏的暂停功能游戏的重新开始游戏的保存图2.4控制模块框架游戏暂停控制:点击“空格”按钮或P,游戏暂停;再单击,游戏继续。 游戏重新开始控制:点击“R”键后,点击确定,即游戏重新开始。 游戏保存控制:点击“S”键好,点击确定,退出游戏界面。 游戏加速减速控制:点击“SpeedUp”加速,点击“SpeedDown”减速。3功能的具体实现3.1重新开始按R键使进行中的游戏或者暂停中的游戏重新开始,调用reset方法,相关代码如下: case KeyEvent.VK_R:/-按R键重新启动游戏 model.reset();break;public void reset() direction = SnakeModel.UP; / 蛇运行的方向 timeInterval = 200; / 时间间隔,毫秒 paused = false; / 暂停标志 score = 0; / 得分 countMove = 0; / 吃到食物前移动的次数 3.2暂停定义一个布尔类型,pause,初始化为false,再在无限循环运动running类运用if语句,具体代码如下: boolean paused = false; boolean paused = false; if (!paused) if (moveOn() setChanged(); / Model通知View数据已经更新 notifyObservers(); else JOptionPane.showMessageDialog(null, you failed, Game Over, JOptionPane.INFORMATION_MESSAGE); break; 3.3保存分数按S键保存,在keyPressed类中,调用keyEvent类,如果是S,则执行如下代码,将分数保存在score.java中。 case KeyEvent.VK_S: /-按S键保存 FileWriter fileWritter =null; try fileWritter = new FileWriter(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;3.4加速减速同样的,调用speedUp,speedDown方法:case KeyEvent.VK_PAGE_UP:/-按PageUp加速 model.speedUp(); break; case KeyEvent.VK_PAGE_DOWN:/-按PageDown减速 model.speedDown();4运行结果4.1游戏开始界面图4.14.2蛇撞到自身结束游戏图4.24.3蛇撞到墙面结束游戏图4.34.4游戏暂停图4.44.5游戏在暂停或者运行时重新开始图4.54.6游戏分数的保存 图4.6总 结课程设计是对学习成果的考核和总结,这两个礼拜通过小组努力和吴光伟老师的耐心指导,本着严谨诚实,开拓创新的精神,完成了这次设计。这次设计是我们第一次从理论构思到实际工程论证的设计,它使我们深刻理解了在所学到的知识,让我们把所学的知识从头梳理和使用了一遍,巩固了我们的知识,也接触到了一些未曾接触过的东西,受益匪浅。参 考 文 献1 叶核亚,陈道蓄. JAVA程序设计实用教程.(第四版).北京:电子工业出版社,2013.112 汤阳光. 智播客贪食蛇游戏项目开发3 耿祥义.JAVA 大学实用教程.北京:清华大学出版社,2009附录A源代码/GreedSnake.javapackage mvcTest;public class GreedSnake public static void main(String args) SnakeModel model = new SnakeModel(20,30); SnakeControl control = new SnakeControl(model); SnakeView view = 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.FileWriter;import java.io.IOException;public class SnakeControl implements KeyListenerSnakeModel 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(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 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 = new FileWriter(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 keyReleased(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 implements Runnable boolean matrix; / 指示位置上有没蛇体或食物 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 static 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; / 时间间隔,毫秒 paused = 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 /默认的运行方向向上,所以游戏一开始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; 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 = 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 run() 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; private 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; public 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 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 labelScore; 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, SnakeControl control) this.model = model; this.control = control; mainFrame = new JFrame(GreedSnake); 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, BorderLayout.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(labelHelp, BorderLayout.CENTER); labelHelp = new JLabel(按SPACE键 或P键暂停游戏, JLabel.C
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年教师招聘之《幼儿教师招聘》试题一及参考答案详解ab卷
- 2025就业援疆浙江省事业单位招聘阿克苏籍少数民族高校毕业生(7人)考试模拟试题及答案解析
- 基于2025年的跨境电商进口风险预防与品牌形象维护报告
- 基于2025年的货运代理行业服务质量提升与创新研究报告
- 教师招聘之《小学教师招聘》高分题库及参考答案详解【b卷】
- 2025年教师招聘之《小学教师招聘》考前冲刺练习题库带答案详解(突破训练)
- 教师招聘之《小学教师招聘》能力提升试题打印及答案详解(全优)
- 教师招聘之《幼儿教师招聘》练习题库附参考答案详解【研优卷】
- 2025年发展对象考试试题库及参考答案
- 教师招聘之《小学教师招聘》综合检测题型汇编及答案详解参考
- 绘本社团课件
- 《新能源汽车概论》课件-项目一 新能源汽车的认知与发展趋势
- 煤矿作业规程编制课件
- DB11∕T 1135-2024 供热系统有限空间作业安全技术规程
- 2025-2026学年人教鄂教版(2024)小学科学三年级上册(全册)教学设计(附目录P137)
- 2025年药典考试题大库及答案
- (高清版)T∕CES 243-2023 《构网型储能系统并网技术规范》
- 2025年人教版(2024)小学信息科技四年级(全一册)教学设计(附教材目录 P208)
- 青少年无人机课程:第一课-马上起飞
- 普通冲床设备日常点检标准作业指导书
- 少儿英语字母操
评论
0/150
提交评论