




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、徐州工程学院课程设计报告 Java程序设计课程设计设计题目 JAVA设置贪吃蛇游戏 设计时间 2014.6.23 至 2013.6.29 小组成员 * 学生学号 * 所在班级 11网络转本 指导教师 王 逢 州 指导教师 王 逢 州 目 录一 设计背景11.1分析与设计11.1.1需求分析11.1.2游戏开发的方便性21.1.3游戏开发的可行性21.2功能需求2二 设计方案论证32.1程序概述32.2程序流程图32.3总设计模块的划分42.4类及方法的说明6三 系统编译结果分析7四 总结与心得体会11五 参考文献12六 附录 实验代码13 22摘 要Java程序设计是我们第一次接触面向对象程序
2、设计,它和我们以前学的C语言程序设计大同小异,整体上差不多却又各有各的特点。而在学习了理论课程之后,而此次课程设计也是我们的第一次全面的综合训练。Java程序设计的设计目的是加深理论教学内容的理解和掌握,使学生较系统的掌握程序设计及其在网络开发中的应用。随着Java技术越来越广泛的应用,作为一种新的编程语言,以其简单性、可移植性和平台无关性等优点,得到了广泛地应用。无论采用Java SE、Java EE还是Java ME都需要用到GUI(图形用户界面)。“贪吃蛇”游戏是一个经典的游戏,它因操作简单、娱乐性强而广受欢迎。本文基于Java开发环境,开发了一个操作简单、界面美观、功能较齐全的“贪吃蛇
3、”游戏。整个游戏程序分为二个功能模块,六个类模块,实现了游戏的开始、暂停、结束。通过本游戏的开发,达到学习Java技术和熟悉软件开发流程的目的。关键词 Java程序设计“贪吃蛇 游戏规则 图形界面 Windows XP一 设计背景Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和java平台的总称。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和
4、移动互联网的产业环境下,Java更具备了显著优势和广阔前景。 运行环境:意指一种把半编译的执行码在目标机器上运行的环境。 贪吃蛇游戏一款非常经典的手机游戏,因为它比较简单有趣,无论老少都比较适合。贪吃蛇的设计对每一个Java语言设计者进行语言提高和进阶都是一个很好的锻炼机会。贪吃蛇游戏的设计比较复杂,它涉及面广、牵涉方面多,如果不好好考虑和设计,将难以成功开发出这个游戏。在这个游戏的设计中,牵涉到图形界面的显示与更新、数据的收集与更新,并且在这个游戏的开发中,还要应用类的继承机制以及一些设计模式。因此,如何设计和开发好这个贪吃蛇游戏,对于提高Java开发水平和系统的设计能力
5、有极大的帮助。在设计开发过程中,需要处理好各个类之间的继承关系,还要处理各个类相应的封装,并且还要协调好各个模块之间的逻辑依赖关系和数据通信关系。1.1分析与设计1.1.1需求分析本系统主要是完成贪吃蛇游戏的基本操作。用户可以自己练习和娱乐。本系统需要满足以下几点要求: (1) 利用方向键来改变蛇的运行方向。 (2) 空格键暂停或继续游戏,并在随机的地方产生食物。 (3) 吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常运行。 1.1.2游戏开发的方便性游戏开发成功后,最终用户为各个年龄段的人群,用户范
6、围相当广泛。本游戏友好的用户界面,简单易学的按钮操作以及简单通俗的游戏规则,使广大的用户不需要专门进行培训,就可以立即学会如何使用。1.1.3游戏开发的可行性贪吃蛇游戏是一种简单的大众的游戏,自从计算机实现以来,深受广大电脑玩家的喜爱,做一个简单的贪吃蛇小游戏。 贪吃蛇的核心算法时如何实现移动和吃掉食物,没有碰到食物的时候,把当前运动方向上的下个节点入队,并以蛇节点的颜色绘制这个节点,然后把头指针所指的节点出队,并以游戏框架内部背景色重绘出队的节点,这样就可以达到移动的效果。而在吃到食物的时候,则只需把食物入队即可。实现贪吃蛇的基本的蛇身移动、吃到食物身体增长、和碰到墙壁
7、或自身死亡,能够暂停和开始。 本次设计主要运用java语言来完成。Java语言是一种跨平台,适合于分布式计算环境的面向对象编程语言,用Java写的应用程序不用修改就可在不同的软硬件平台上运行。 由于Java主要用于网络应用程序开发,因此对安全性有较高的要求。如果没有安全保证,用户从网络下载程序执行就非常危险。Java通过自己的安全机制防止了病毒程序的产生和下载程序对本地系统的威胁破坏。1.2功能需求本设计所开发的是基于Java的一个贪吃蛇游戏软件,主要实现游戏的开始、暂停、退出、等功能,分为: 游戏主界面模块、游戏控
8、制模块以二个模块。 游戏性能: 本软件在设计方面本着方便、实用及娱乐性高的宗旨,在对界面进行设计的过程中,始终坚持清晰明了,在性能方面能够实现效率高,不易出错等优点。 游戏主界面模块: 主要包括游戏图形区域界面、游戏开始按钮、暂停游戏按钮。游戏的主界面应该力求美观,爽心悦目。 游戏控制模块: 主要完成控制游戏的开始、暂停、退出等功能,这部分应该做到易懂、易操作而且准确率高,不易出错。二 设计方案论证2.1程序概述本程序是一个利用Java应用软件制作的贪食蛇小游戏。在游戏过程中,用户通过点击小键盘
9、区的方向键来控制蛇的运行方向;通过F和S键来控制蛇的移动速度,每单击一次,蛇的移动速度改变一次,改变频率为0.5。游戏运行过程中,如果想暂停,只需要按P键即可。重新开始游戏的按键为R。当蛇吃到食物且没有碰到墙壁或自己的身体时,按照积分规则得到相应的分数;当蛇没有吃到食物且碰到墙壁或自己的身体时游戏结束。本程序的另一个功能是在程序运行窗口的左上角显示,用户在游戏过程中所得的分数,不过缺点是无法保存分数。2.2程序流程图本次游戏设计的处理流程如图2-1所示:单击“开始游戏”按钮, 游戏开始。键盘操作: 向上左移右移向下没有吃到食物且蛇碰到边界单击“退出游戏”退出游戏游戏中途欲中断,稍后继续游戏单击
10、“暂停游戏”游戏暂停进入游戏画面再次单击开始游戏,游戏恢复图2-1 游戏处理流程图2.3总设计模块的划分根据游戏需求中游戏所要实现的功能,整个游戏分为二个模块进行具体的设计,如图2-2所示:图2-2 游戏总设计模块 游戏控制模块的主要框架如图2-3所示:图2-3游戏控制模块框架游戏重新开始控制:点击“R”键后,系统图重新载入,即游戏重新开始。游戏暂停控制:点击“P暂停游戏”按钮,游戏暂停;再单击,游戏继续。游戏移动速度功能控制:点击“F/ S”按钮,蛇的移动速度就会改变,每点击一次,速度的改变频率为0.5。游戏的得分:本游戏不是按照贪吃蛇吃到一个食物就加一分进行得分,而是赋予具体的得分规则,当
11、蛇吃到食物且没有碰到边界或没有碰撞到自己的身体时,按照具体的规则进行得分。2.4类及方法的说明 贪吃蛇游戏各模块及程序流程有若干类实现,下面阐述各个类的设计与实现。GreedSnake类 该类包含六个主要的功能方法,分别是: (1)构造函数public GreedSnake(),主要用来设置初始化用户界面。 (2)public void keyPressed()方法,主要用来对游戏的按键操作进行处理。(3)void repaint()主要用来绘制游戏界面(包括蛇和食物)。 (4)
12、private void drawNode()主要用来绘制某一结点(蛇身或食物)。 (5)public void updateScore()方法主要用来改变计分器。 (6)void begin()方法用来控制游戏的开始界面。SnakeModel类该类包括以下几个成员方法:(1) public SnakeModel(GreedSnake gs,int maxX,int maxY):用来初始化界面。(2) public void changeDirection(int
13、newDirection):用来改变贪吃蛇运动方向。(3) public boolean moveOn():主要用来定义贪吃蛇运动函数。(4) public void run():主要用来描述贪吃蛇运动线程。(5) private Node createFood():主要用来生成食物及放置地点。(6) public void speedUp():主要用来定义加快蛇运动速度。(7) public void speedDown():主要用来放慢蛇运动速度。(8) public void changePauseState():主要用来改变游戏状态(暂停或继续)。三 系统编译结果分析本程序在运行后,能
14、够正常的相应按键事件。由于程序的主要部分已经集成为一个对象SnakeModel,所以利用键盘就可以实现操作。贪吃蛇前行的过程中,可以任意向其左或右方向改变方向,但按其前进方向和前进的反方向都没有反应。点击F, S键后,蛇的移动速度会根据点击的次数而改变。每点击一次,速度的改变频率为0.5。点击P键后游戏就暂停了。点击R键后系统则重新载入,即游戏重新开始。(1) 在Java编译环境下编译程序如下:图1 编译命令输入(2) 运行结果如下图所示:图2 游戏开始界面图3 游戏运行图(3) 当蛇没有吃到食物且碰到边界或碰撞到自己的身体时,游戏结束,此时得分为0。如果想重新开始即按R键,运行结果如下图4所
15、示:图4 程序结束图(4) 当蛇吃到食物且没有碰到边界或没有碰撞到自己的身体时,此时按照积分规则得到相应的分数。运行结果如下图5所示:图5 游戏运行图(5) 程序异常处理:在蛇的运行线程过程中,当蛇撞到墙或自己的身体时,将抛出一Exception类的异常对象,然后使用try-catch去捕捉这个异常。异常的处理如下:try Thread.sleep(timeInterval); catch(Exception e) break; 四 总结与心得体会本次课程设计算是完美结束,我们也按时完成了老师交给我们的课程任务。通过这次课程设计,我和同组的组员从中学到了很多,因为这是我们三个共同完成的。经过这
16、次课程设计,我对这学期所学的JAVA语言程序设计有一个更深刻的了解,将所学的知识应用于实践,由于所学知识有限,为了使游戏能够实现自己预先的构想,我通过上网和去图书馆找程序,比较好的流程图及功能模块,不断阅读修改代码使程序达到预期所要实现的目标,完成课程设计后,可以感觉到自己对Java程序的又有了新的认识。因为我们在开始做过数据结构的课程设计,只记得在第一次做课程设计的时候无从下手。而对于数据库及各种应用软件和游戏中,我仍觉得对游戏的设计有极大的热情。因为其各个模块间的联系十分紧密,代码重复执行率高,当经过无数次的调试、修改后,能最终看到成品,有无比自豪的心情。在同一学期我们做过图书馆管理系统及
17、学生管理系统等简单的数据库管理系统的课程设计,思想大致相似,变化范围有限,没有太多自己可发挥的余地。综合运用以前所学习的知识,设计一个JAVA游戏,并能实现以下的功能:游戏暂停、游戏重新开始、游戏的结束。总之,通过本次的课程设计,使我平时学到的理论知识得到了很好地升华,理论与实际得到一次很好的结合,为我今后参加工作打下了坚实的基础,使我受益匪浅。除此之外,我通过这次课程设计的完成也体会到了团队合作的重要性,同学间的互相帮助很好的帮助我们在过程中解决困难。不仅如此,团队合作对我们在日后工作及生活的旅途中也会成为学习的一项重要能力。五 参考文献1 郭学会,何留杰.Java程序设计项目化教程北京:国
18、防工业出版社. 2013.82 耿祥义,张跃平.Java 2实用教程(第三版)北京:清华大学出版社,2006.3 朱福喜面向对象与Java程序设计北京: 清华大学出版社2009.34 李尊朝.苏军.Java语言程序设计(第二版).北京:中国铁道出版社,2009.5 黄晓东.Java课程设计案例精编(第二版).北京:中国水利水电出版社,2008.6 陆光义,宋现锋.Java游戏编程导学. 北京:清华大学出版社,2004.7 刘万军.Java 6程序设计实践教程.北京:清华大学出版社,2009.5六 附录 实验代码程序代码:import java.awt.*; import java.awt.ev
19、ent.*; import javax.swing.*; import java.util.*; /主类 public class GreedSnake extends KeyAdapter/继承适配器用于接收键盘事件 JFrame mainFrame; Canvas paintCanvas; /定义一个空白绘图区域 JLabel labelScore;/计分牌 SnakeModel snakeModel=null;/ 蛇 public static final int DEFAULT_WIDTH=500; public static final int DEFAULT_HEIGHT=300;
20、 public static final int nodeWidth=10; public static final int nodeHeight=10; /GreedSnake():初始化游戏界面 public GreedSnake() /设置界面元素 mainFrame=new JFrame("贪吃蛇游戏"); Container cp=mainFrame.getContentPane(); labelScore=new JLabel("您的所得分数为:",JLabel.CENTER); cp.add(labelScore,BorderLayout.
21、NORTH); paintCanvas=new Canvas(); paintCanvas.setSize(DEFAULT_WIDTH+1,DEFAULT_HEIGHT+1); paintCanvas.addKeyListener(this); /游戏区注册键盘响应事件 cp.add(paintCanvas,BorderLayout.CENTER); JPanel panelButtom=new JPanel(); panelButtom.setLayout(new GridLayout(4,1); JLabel labelHelp;/ 帮助信息 标签 labelHelp=new JLabel
22、("按 P 键暂停游戏",JLabel.CENTER); panelButtom.add(labelHelp); labelHelp=new JLabel("按 C 键继续游戏",JLabel.CENTER); panelButtom.add(labelHelp); labelHelp=new JLabel("按 F 或 S键改变速度",JLabel.CENTER); panelButtom.add(labelHelp); labelHelp=new JLabel("按R键重新开始游戏",JLabel.CENTER
23、); panelButtom.add(labelHelp); cp.add(panelButtom,BorderLayout.SOUTH); mainFrame.addKeyListener(this); mainFrame.pack(); mainFrame.setResizable(false); mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainFrame.setVisible(true); begin(); /keyPressed():按键检测 public void keyPressed(KeyEvent e)
24、 int keyCode=e.getKeyCode(); if(snakeModel.running) switch(keyCode) case KeyEvent.VK_UP: snakeModel.changeDirection(SnakeModel.UP); break; case KeyEvent.VK_DOWN: snakeModel.changeDirection(SnakeModel.DOWN); break; case KeyEvent.VK_LEFT: snakeModel.changeDirection(SnakeModel.LEFT); break; case KeyEve
25、nt.VK_RIGHT: snakeModel.changeDirection(SnakeModel.RIGHT); break; /按键F/S响应加速事件: case KeyEvent.VK_F: snakeModel.speedUp();/ 加速 break; case KeyEvent.VK_S: snakeModel.speedDown();/ 减速 break; /按P/C响应暂停继续事件 case KeyEvent.VK_P: case KeyEvent.VK_C: snakeModel.changePauseState();/ 暂停或继续 break; default: /重新开
26、始 if(keyCode=KeyEvent.VK_R | keyCode=KeyEvent.VK_ENTER) snakeModel.running=false; begin(); /repaint():绘制游戏界面(包括蛇和食物) void repaint() Graphics g=paintCanvas.getGraphics(); /画背景颜色 g.setColor(Color.LIGHT_GRAY); g.fillRect(0,0,DEFAULT_WIDTH,DEFAULT_HEIGHT); /画贪吃蛇 g.setColor(Color.BLUE); LinkedList<Nod
27、e> na=snakeModel.nodeArray; Iterator it=na.iterator(); /遍历整个集合中的元素 while(it.hasNext() /检查集合序列中是否还有元素 Node n=(Node)it.next(); /用next()方法获得序列中的下一个元素 drawNode(g,n); / 画食物颜色 g.setColor(Color.RED); /画食物颜色 Node n=snakeModel.food; drawNode(g,n); updateScore(); /drawNode():绘画某一结点(蛇身或食物) private void draw
28、Node(Graphics g,Node n) g.fillRect(n.x*nodeWidth,n.y*nodeHeight,nodeWidth-1,nodeHeight-1); /updateScore():改变计分牌 public void updateScore() String s="您的所得分数为: "+snakeModel.score; labelScore.setText(s); /begin():游戏开始,放置贪吃蛇 void begin() if(snakeModel=null|!snakeModel.running) snakeModel=new Sn
29、akeModel(this,DEFAULT_WIDTH/nodeWidth, DEFAULT_HEIGHT/nodeHeight); (new Thread(snakeModel).start(); /开始启动贪吃蛇线程 /main():主函数 public static void main(String args) GreedSnake gs=new GreedSnake(); /Node:结点类 class Node int x; int y; Node(int x,int y) this.x=x; this.y=y; /SnakeModel:贪吃蛇模型 class SnakeModel
30、implements Runnable /贪吃蛇模型继承runnable()接口 GreedSnake gs; boolean matrix;/ 界面数据保存在数组里 LinkedList<Node> nodeArray=new LinkedList<Node>(); Node food; int maxX;/最大长度 int maxY;/最大宽度 int direction=2;/定义蛇的运动方向 boolean running=false; int timeInterval=200;/ 间隔时间(速度) double speedChangeRate=0.5;/ 速度
31、的改变程度 boolean paused=false;/ 游戏状态 int score=0; int countMove=0; / UP和DOWN是偶数,RIGHT和LEFT是奇数 public static final int UP=2; public static final int DOWN=4; public static final int LEFT=1; public static final int RIGHT=3; /GreedModel():初始化界面 public SnakeModel(GreedSnake gs,int maxX,int maxY) this.gs=gs;
32、 this.maxX=maxX; this.maxY=maxY; matrix=new booleanmaxX; for(int i=0;i<maxX;+i) matrixi=new booleanmaxY; Arrays.fill(matrixi,false);/ 没有蛇和食物的地区置false /初始化贪吃蛇 int initArrayLength=maxX>20?10:maxX/2; for(int i=0;i<initArrayLength;+i) int x=maxX/2+i; int y=maxY/2; nodeArray.addLast(new Node(x,y
33、); matrixxy=true;/ 蛇身处依次置true food=createFood(); matrixfood.xfood.y=true;/ 食物处置true /changeDirection():改变运动方向 public void changeDirection(int newDirection) if(direction%2!=newDirection%2) / 避免左右/上下冲突 direction=newDirection; /moveOn():贪吃蛇运动函数 public boolean moveOn() Node n=(Node)nodeArray.getFirst();
34、 int x=n.x; /贪吃蛇的运动位置(x,y) 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<maxY) if(matrixxy) / 吃到食物或者撞到身体 if(x=food.x&&y=food.y)/ 吃到食物 nodeArray.addFirst(food);/ 在头
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 承包合同终止协议
- 木材公司销售合同
- 平面模特拍摄合同
- 电力施工劳务合同
- 漫画助理外包合同
- 油漆劳务分包合同协议书
- 无人机物流配送运营合作项目合同
- 商丘幼儿师范高等专科学校《旅行社经营管理》2023-2024学年第二学期期末试卷
- 山东管理学院《高阶地质资源勘查与评价》2023-2024学年第二学期期末试卷
- 文华学院《地理科学类专业导论》2023-2024学年第二学期期末试卷
- DeepSeek科普课件深度解析
- 供电工程施工方案(技术标)
- 2023届江西省九江市高三第一次高考模拟统一考试(一模)文综试题 附答案
- 2024年共青团入团积极分子、发展对象考试题库及答案
- 2024广西公务员考试及答案(笔试、申论A、B类、行测)4套 真题
- 箱式变电站迁移施工方案
- 二零二五版服装厂服装产品质量追溯劳动合同范本3篇
- 2025年中电建新能源集团有限公司招聘笔试参考题库含答案解析
- 2024年湖南环境生物职业技术学院高职单招职业技能测验历年参考题库(频考版)含答案解析
- 《化工流程教案》课件
- 2024年山东省济南市中考英语试题卷(含答案解析)
评论
0/150
提交评论