




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
*实践教学*软件学院2016年春季学期软件技术综合训练课程设计 说明书题 目: 贪吃蛇游戏设计 专业班级: 2015级软件技术2班 姓 名: 学 号: 指导教师: 成 绩: i目录摘 要21 序言31 .1 课题的目标和意义32 需求分析42.1需求前提42.2开发环境42.3用例图53 总体设计63.1程序概述63.2 总设计模块的划分64 详细设计84.1设计思路84.2程序流程图84.3类、方法、属性说明105 程序调试与测试115.1程序异常处理136 数据结构算法设计:146.1图型结构基本算法实现147 设计体会与总结178 参考文献189 程序代码19摘 要Java最初被命名为Oak,目标设定在家用电器等小型系统的编程语言,来解决诸如电视机、电话、闹钟、烤面包机等家用电器的控制和通讯问题。由于这些智能化家电的市场需求没有预期的高,Sun放弃了该项计划。就在Oak几近失败之时,随着互联网的发展,Sun看到了Oak在计算机网络上的广阔应用前景。于是改造了Oak,以“Java”的名称正式发布。 Sun 公司对 Java 编程语言的解释是:Java 编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。贪吃蛇游戏设计与实现,主要分为以下二个模块:游戏主界面模块和游戏控制模块。在此只实现游戏的游戏主界面模块、游戏控制模块。并且只是实现移动速度、暂停、重新开始等功能。关键词:java、多线程、贪吃蛇。1 序言1 .1 课题的目标和意义在市场JAVA程序设计是计算机相关专业的必修专业基础课程,其实践性、应用性很强。实践教学环节是必不可少的一个重要环节。本课程的程序设计专题实际是计算机相关专业学生学习完JAVA程序设计课程后,进行的一次全面的综合训练,JAVA程序设计的设计目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。2 需求分析2.1需求前提 经过两天在图书馆以及网络上查阅的资料,然后提出这次课程设计的目标贪吃蛇游戏的设计。然后接下来就是查阅更多的资料,制定接下来的详细计划,最终计划用两周的时间完成此次课程设计提出的案例。2.2开发环境硬件环境:CPU:Intel Pentium(R)4主频:2.40GHz软件环境:操作系统:Windows XP编程环境: JDK 1.6开发工具:Eclipse jdk2.3用例图单击“F2”按钮, 游戏开始,蛇开始随机。键盘操作: 向上左移右移向下没有吃到食物且蛇碰到边界单击确定游戏结束游戏中途欲中断,稍后继续游单F3暂停游戏 游戏开始再次单击开始F3按钮,游戏恢复3 总体设计3.1程序概述本程序是一个利用Java应用软件制作的贪食蛇小游戏。在游戏过程中,用户通过点击小键盘区的方向键来控制蛇的运行方向;游戏运行过程中,如果想暂停,只需要按F3键即可。重新开始游戏的按键为F2。当蛇没有吃到食物且碰到墙壁或自己的身体时游戏结束。本程序的另一个功能是在程序运行窗口的左上角显示,用户在游戏过程中的移动和长度。3.2 总设计模块的划分根据游戏需求中游戏所要实现的功能,整个游戏分为二个模块进行具体的设计,如图2所示。贪吃蛇游戏游戏主界面模块游戏控制模块图2.设计总模块 游戏控制模块的主要框架如图3所示。游戏控制模块游戏的暂停功能游戏的重新开始游戏的退出图3.控制模块框架游戏暂停控制:点击“F3”按钮,游戏暂停;再单击,游戏继续。游戏重新开始控制:点击“F2”键后,点击确定,即游戏重新开始。游戏退出控制:点击“F4”键好,点击确定,退出游戏界面。4 详细设计4.1设计思路贪吃蛇游戏设计与实现,主要分为以下二个模块:游戏主界面模块和游戏控制模块。在此只实现游戏的游戏主界面模块、游戏控制模块。并且只是实现移动速度、暂停、重新开始等功能。游戏主界面模块:游戏的主界面是进入游戏后,能够给玩家第一感官的部分,主要包括游戏图形区域界面、游戏的速度选择更新界面、新生方块的预览、暂停游戏按钮、重新开始游戏按钮。从很大程度上决定了玩家对游戏的兴趣问题,因此,游戏的主界面应该力求美观,爽心悦目。游戏控制模块:这个模块是游戏的中心环节,主要完成控制游戏的开始、暂停、重新开始等功能。为了能够给玩家一个很好的游戏环境,这部分应该做到易懂、易操作。本设计所开发的是基于Java的一个贪吃蛇游戏软件,主要实现游戏的速度控制、游戏的暂停、游戏的退出等功能,分为: 游戏主界面模块、游戏控制模块以二个模块。4.2程序流程图本次游戏设计的处理流程如图1所示。单击“F2”按钮, 游戏开始,蛇开始随机。键盘操作: 向上左移右移向下没有吃到食物且蛇碰到边界单击确定游戏结束游戏中途欲中断,稍后继续游单F3暂停游戏进入游戏画面再次单击开始F3按钮,游戏恢复图1.程序流程图4.3类、方法、属性说明(1)成员变量表1 主要成员变量(属性)成员变量描述变量类型名称文件菜单中子菜单“新建”JMenuItemmFile_New编辑菜单中子菜单“撤消”JMenuItemmEdit_Undo格式菜单中子菜单“颜色”JMenuformatMenu_Color帮助菜单中子菜单“帮助主题”MenuItemmHelp_HelpTopics(2)方法表2 主要方法方法名功能备注Notepad4()描述记事本无Text.setBackground(Color.black)设置编辑区默认背景色无Text.setForeground(Color.black)设置编辑区默认前景色无图8 进销存管理系统E-R图5 程序调试与测试本程序在运行后,能够正常的相应按键事件。由于程序的主要部分已经集成为一个对象SnakeModel,所以利用键盘就可以实现操作。蛇前行的过程中,可以任意向其左或右方向改变方向。点击F3键后游戏就暂停了。点击F2键游戏重新开始。点击F4游戏退出。运行结果如下图4所示: 图4 程序运行图 当蛇没有吃到食物且碰到边界或碰撞到自己的身体时,游戏结束。如果想重新开始即点击“确定”后按F2键,运行结果如下图5所示:图5 重新开始图5.1程序异常处理在蛇的运行线程过程中,当蛇撞到墙或自己的身体时,将抛出一个Exception类的异常对象,然后使用try-catch去捕捉这个异常,异常的处理如下:try Thread.sleep(timeInterval); catch(Exception e) break; 6 数据结构算法设计:6.1图型结构基本算法实现import java.util.LinkedList;/链式栈import java.util.Queue;/队列/图的遍历(邻接矩阵)public class Graph /曲线图,图表-邻接矩阵存储图private int number=9;/顶点数private boolean flag;/(布尔值,一种数据类型)-顶点private int edges1=0,1,0,0,0,1,1,0,0,1,0,1,0,0,0,1,0,1,0,1,0,1,0,0,0,0,1,0,0,1,0,1,0,1,1,1,0,0,0,1,0,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,1,0,1,0,0,0,0,1,1,0,1,0,0,0,1,1,1,0,0,0,0,0/记录顶点数是否被访问;private String vertexs=A,B,C,D,E,F,G,H,I;/顶点 private int edges= 0,1,0,0,0,1,1,0,0, 1,0,1,0,0,0,1,0,1, 0,1,0,1,0,0,0,0,1, 0,0,1,0,1,0,1,1,1, 0,0,0,1,0,1,0,1,0, 1,0,0,0,1,0,1,0,0, 0,1,0,1,0,1,0,1,0, 0,0,0,1,1,0,1,0,0, 0,1,1,1,0,0,0,0,0 ; void DFSTraverse()/图的深度遍历操作(递归) flag=new booleannumber; for(int i=0;inumber;i+) if(flagi=false)/当前顶点没有被访问 DFS(i); private void DFS(int i) /图的深度优先递归算法 flagi=true;/第i个顶点被访问 System.out.print(vertexsi+ ); for(int j=0;jnumber;j+) if(flagj=false & edges1ij=1) DFS(j); void BFSTraverse()/图的遍历操作flag=new booleannumber;Queue queue=new LinkedList();for(int i=0;inumber;i+)if (flagi=false) flagi=true;System.out.print(vertexsi+ );queue.add(i);while (!queue.isEmpty() int j=queue.poll();for (int k=0;knumber;k+)if (edges1jk=1 & flagk=false)flagk=true;System.out.print(vertexsk+ );queue.add(k); public static void main(Stringargs)/测试Graph graph=new Graph();System.out.println(图的深度遍历(递归):);graph.DFSTraverse();System.out.println(n-);System.out.println(图的广度遍历操作:);graph.BFSTraverse();算法分析: 广度优先搜索A,B,F,G,C,I,E,D,H. 深度优先搜索A,B,C,D,E,F,G,H,I.从上述算法可以看出,首先用哈夫曼编码构造一颗哈夫曼树,对哈夫曼树表示的图进行的深度优先搜索遍历时,需要扫描树中的每个元素,每一个顶点最多调用一次,一个顶点一旦被访问,就不在从该定点发出搜索,图遍历的过中实际就是查找每一个顶点的邻接点的过程,所以其时间复杂度为O(n2);空间复杂度为O(n).进行广度优先搜索,每一个顶点最多入队,出队一次,广度优先搜索遍历的过程就是寻找队列中顶点的邻接点过程,所以其时间复杂度为O(n2);空间复杂度为O(n).7 设计体会与总结通过一个学期的学习已经结束,我从一个连软件都不会用的愣头青到现在已能完成课程设计。这次课程设计,我深深地认识到自己知识的单薄,多谢老师和同学的帮助,让我能顺利完成课程设计。虽然还有很多不足,但也学到了很多。尤其对软件开发过程有了更清晰地了解,首先是问题的定义,需求分析,然后是概要设计,详细设计等,并对软件测试的方法,手段有了较深的理解,同时对企业的流程有了一个系统的认识。我也认真学习了与系统相关的的知识,极大地拓宽了我的知识面,真心感到收获不小。在短短的时间里,我还学到了更多的理论知识,扩展了知识面,提高了自己的实际操作能力;而且学会了如何去学习新的知识,学会了面对困难和挑战,学会了团结合作,互助互利。为了使游戏能够实现自己预先的构想,我通过上网和去图书馆找程序,比较好的流程图及功能模块,不断阅读修改代码使程序达到预期所要实现的目标,完成课程设计后,可以感觉到自己对Java程序的又有了新的认识。总之,通过本次的课程设计,使我平时学到的理论知识得到了很好地升华,理论与实际得到一次很好的结合,为我今后参加工作打下了坚实的基础,使我受益匪浅。8 参考文献1 孙卫琴精通Struts:基于MVC的JavaWeb的设计与开发M北京:电子工业出版社,20042杨章伟. 精通SQL语言与数据库管理M. 人民邮电出版社, 20083范晓平UML建模实例详解M北京:清华大学出版社,20054林智扬,范明翔. 深入浅出Java Swing程序设计M.中国铁道出版社社,2005年3月5王珊, 萨师煊. 数据库系统概论(第四版) M. 高等教育出版社, 20076杨章伟. 精通SQL语言与数据库管理M. 人民邮电出版社, 20087李海凤,李宏力,孙华峰电子商务网站实训教程M.中国铁道出版社,20068周警伟.MVC在Web系统中的模式与应用J/OL.http:/ 9阎宏Java与模式M 北京:机械出版社,200510Bruce Eckel,Think in Java 2nd EditionMPrentice Hall11黄平主编.数据库技术. 北京:机械工业出版社,200212袁枚等编著.网络数据库应用教程.北京:人民邮电出版社,2001.113张孝祥.javascript网页开发.北京:清华大学出版社,2004.1114薛华成.管理信息系统.北京:清华大学出版社,2004.99 程序代码import java.awt.*;import javax.swing.*;import java.util.*;import java.awt.event.*;public class She extends JFrame implements ActionListener, WindowListener /* * */private static final long serialVersionUID = 1L;JLabel bt1; JLabel bt2; MyPaint mp; JMenuItem kaishi; JMenuItem zanting; JMenuItem tuichu; JRadioButton chu; JRadioButton zhong; JRadioButton gao; JRadioButton chao; JMenuItem guanyu; Font f; public She() f = new Font(宋体, Font.PLAIN, 12); mp = new MyPaint(); mp.setShe(this); JMenuBar caidan = new JMenuBar(); JMenu shezhi = new JMenu(设置); shezhi.setFont(f); JMenu nandu = new JMenu(难度); nandu.setFont(f); JMenu bangzhu = new JMenu(帮助); bangzhu.setFont(f); caidan.add(shezhi); caidan.add(nandu); caidan.add(bangzhu); kaishi = new JMenuItem(开始游戏 F2); kaishi.setFont(f); kaishi.addActionListener(this); zanting = new JMenuItem(暂停/继续 F3); zanting.setFont(f); zanting.addActionListener(this); tuichu = new JMenuItem(退出 F4); tuichu.setFont(f); tuichu.addActionListener(this); chu = new JRadioButton(初级,最快速度195, true); chu.setFont(f); chu.addActionListener(this); zhong = new JRadioButton(中级,最快速度225); zhong.setFont(f); zhong.addActionListener(this); gao = new JRadioButton(高级,最快速度255); gao.setFont(f); gao.addActionListener(this); chao = new JRadioButton(超级,最快速度275); chao.setFont(f); chao.addActionListener(this); ButtonGroup bg = new ButtonGroup(); bg.add(chu); bg.add(zhong); bg.add(gao); bg.add(chao); nandu.add(chu); nandu.add(zhong); nandu.add(gao); nandu.add(chao); guanyu = new JMenuItem(关于); guanyu.setFont(f); guanyu.addActionListener(this); shezhi.add(kaishi); shezhi.add(zanting); shezhi.add(tuichu); bangzhu.add(guanyu); bt1 = new JLabel(长度:0); bt1.setFont(f); bt2 = new JLabel(移动:5); bt2.setFont(f); JPanel p = new JPanel(); p.setLayout(new GridLayout(1, 2); p.add(bt1); p.add(bt2); this.addWindowListener(this);/添加窗体监听器 this.setJMenuBar(caidan); this.add(p, BorderLayout.NORTH); this.add(mp); this.add(new JLabel(), BorderLayout.WEST); this.setSize(335, 385); this.setResizable(false); this.setLocation(300, 150); this.setTitle(MyPaint); this.setVisible(true); public void setDS(int a, int b) bt1.setText(长度: + a); bt2.setText(移动: + b); public void setChu() chu.setSelected(true); mp.setSD(300, 110); this.setDS(0, 305 - 300); chu.setEnabled(true); zhong.setEnabled(true); gao.setEnabled(true); chao.setEnabled(true); public void setNanDu() chu.setEnabled(false); zhong.setEnabled(false); gao.setEnabled(false); chao.setEnabled(false); public void actionPerformed(ActionEvent e) if (e.getSource() = zanting) mp.setZanTing(); else if (e.getSource() = kaishi) mp.setKaiShi(); else if (e.getSource() = tuichu) mp.setTuiChu(); else if (e.getSource() = guanyu) JLabel gy = new JLabel(小游戏 贪吃蛇 V1.0); gy.setFont(f); JOptionPane.showMessageDialog(this, gy); else if (e.getSource() = chu) mp.setSD(300, 110); this.setDS(0, 305 - 300); else if (e.getSource() = zhong) mp.setSD(250, 80); this.setDS(0, 305 - 250); else if (e.getSource() = gao) mp.setSD(200, 50); this.setDS(0, 305 - 200); else if (e.getSource() = chao) mp.setSD(150, 30); this.setDS(0, 305 - 150); public static void main(String args) new She(); /* * Method windowOpened * * * param e * */ public void windowOpened(WindowEvent e) / TODO: Add your code here public void windowClosing(WindowEvent e) System.exit(0); public void windowClosed(WindowEvent e) / TODO: Add your code here public void windowIconified(WindowEvent e) / TODO: Add your code here public void windowDeiconified(WindowEvent e) / TODO: Add your code here public void windowActivated(WindowEvent e) / TODO: Add your code here public void windowDeactivated(WindowEvent e) / TODO: Add your code here class MyPaint extends JPanel implements Runnable, KeyListener, FocusListener /* * */private static final long serialVersionUID = 1L;She s; Font f = new Font(宋体, Font.PLAIN, 12); int x = 150; int y = 0; Random r = new Random(); int sjx = r.nextInt(300)/10*10; int sjy = r.nextInt(300)/10*10; int fx = 2; int sw = 0; int sd = 300; int cs = 0; int d = 150; String zx = new String1000; boolean zanting = false; boolean zanting1 = false; boolean siwang = false; boolean shenti = false; public MyPaint() Thread t = new Thread(this); t.start(); this.addKeyListener(this); this.setFocusable(true); this.addFocusListener(this); public void setShe(She ss) s = ss; public void setZanTing() if (zanting) zanting = false; else zanting = true; public void setKaiShi() JLabel ks = new JLabel(是否重新开始?); ks.setFont(f); int a = JOptionPane.showConfirmDialog(s, ks); if (a = 0) x = 150; y = 0; sjx = r.nextInt(300)/10*10; sjy = r.nextInt(300)/10*10; fx = 2; sw = 0; sd = 300; cs = 0; zanting = false; siwang = false; shenti = false; s.setChu(); s.setDS(sw, 305 - sd); public void setTuiChu() JLabel tc = new JLabel(确定退出吗?); tc.setFont(f); int a = JOptionPane.showConfirmDialog(s, tc); if (a = 0) s.dispose(); System.exit(0); public void setSD(int a, int b) sd = a; d = b; public void paint(Graphics g) zxcs = x + / + y; super.paint(g); g.setColor(Color.BLACK); g.drawRect(0, 0, 300, 300); g.setColor(Color.BLACK); g.fillRect(sjx, sjy, 10, 10); g.setColor(Color.BLUE); g.fillRect(x, y, 10, 10); g.setColor(Color.RED); for (int i = 1; i = sw; i+) int j = cs - i; if (j 0) j = cs-i+999+1; String s = zxj.split(/); if (x = Integer.parseInt(s0) & y = Integer.parseInt(s1) /蛇撞到自己身上了 siwang = true; shenti = true; if (sjx = Integer.parseInt(s0) & sjy = Integer.parseInt(s1) /食物在蛇身体上 g.setColor(Color.BLACK); g.fillRect(sjx, sjy,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年人力资源专员招聘笔试备考要点与试题集
- 2025年站台安全门系统项目建议书
- 2025年金属波纹管膨胀节(钢)项目发展计划
- 2025年经济与商务咨询服务项目合作计划书
- 2025年年化妆品原料合作协议书
- 2025年抗滴虫病药项目建议书
- 2025年虚拟轴坐标测量机合作协议书
- 2025年行李自动分检系统项目发展计划
- 2025年手工制纸及纸板项目发展计划
- 2025年植物施药保护机械项目发展计划
- 主题思政课铸牢中华民族共同体意识
- 邮政行业痛点与解决措施
- 二年级《劳动最光荣》课件
- 帕夫雷什中学
- 2023年人教版美术六年级上册全册教案
- 道路交通安全法知识试题库完整
- 《铁路交通事故调查处理规则》解读
- 研究生学术行为规范讲座
- 水资源论证水土保持防洪评价收费标准
- 年处理12万吨煤焦油加工工艺初步设计
- 烟化炉车间技术操作规程-附一:烟化炉开炉、停炉、故障处理及正常操作原则
评论
0/150
提交评论