收藏 分销(赏)

java课程设计之贪吃蛇.doc

上传人:天**** 文档编号:2394096 上传时间:2024-05-29 格式:DOC 页数:26 大小:409.01KB
下载 相关 举报
java课程设计之贪吃蛇.doc_第1页
第1页 / 共26页
java课程设计之贪吃蛇.doc_第2页
第2页 / 共26页
java课程设计之贪吃蛇.doc_第3页
第3页 / 共26页
java课程设计之贪吃蛇.doc_第4页
第4页 / 共26页
java课程设计之贪吃蛇.doc_第5页
第5页 / 共26页
点击查看更多>>
资源描述

1、 目 录一 系统描述11.1 本设计的目的和意义11.2 设计的主要内容11.3 设计要达到的目标21.4设计需要实现的功能和目标21.5 游戏设计环境2二 分析与设计32.1游戏处理流程32.2需求分析42.3 功能模块设计42.4 详细设计8三 系统测试19四 心得体会21 五 参考文献22六 附录 24 第 25 页基于Java的游戏“贪吃蛇”的设计和实现内容提要: “贪吃蛇”游戏是一个经典的游戏,它因操作简单、娱乐性强而广受欢迎。本文基于Java技术和JBuilder开发环境,开发了一个操作简单、界面美观、功能较齐全的“贪吃蛇”游戏。整个游戏程序分为二个功能模块,六个类模块,实现了游戏

2、的开始、暂停、结束。通过本游戏的开发,达到学习Java技术和熟悉软件开发流程的目的。 一 系统描述1.1 本设计的目的和意义 贪吃蛇游戏一款非常经典的手机游戏,因为它比较简单有趣,无论老少都比较适合。贪吃蛇的设计对每一个Java语言设计者进行语言提高和进阶都是一个很好的锻炼机会。 贪吃蛇游戏的设计比较复杂,它涉及面广、牵涉方面多,如果不好好考虑和设计,将难以成功开发出这个游戏。在这个游戏的设计中,牵涉到图形界面的显示与更新、数据的收集与更新,并且在这个游戏的开发中,还要应用类的继承机制以及一些设计模式。因此,如何设计和开发好这个贪吃蛇游戏,对于提高Java开发水平和系统的设计能力有极大的帮助。

3、在设计开发过程中,需要处理好各个类之间的继承关系,还要处理各个类相应的封装,并且还要协调好各个模块之间的逻辑依赖关系和数据通信关系。正是因为如此,本次毕业设计的目的在于学习Java程序设计基本技术,学习用JBuilder开发Java程序的相关技术,熟悉游戏“贪吃蛇”的需求,熟悉项目开发的完整过程。学会怎样进行一个项目的需求分析、概要设计、详细设计等软件开发过程,熟练地掌握Java程序设计的基本技术和方法,熟练地掌握JBuilder环境的使用方法,培养起初步的项目分析能力和程序设计能力。 1.2 设计的主要内容贪吃蛇游戏设计与实现,主要分为以下二个模块:游戏主界面模块游戏控制模块。在此只实现游戏

4、的游戏主界面模块、游戏控制模块。并且只是实现开始、暂停、退出等功能。1.3设计要达到的目标 本次设计要达到的目标分别从以下模块进行阐述:l 游戏主界面模块:游戏的主界面是进入游戏后,能够给玩家第一感官的部分,主要包括游戏图形区域界面、游戏的速度选择更新界面、游戏分数的显示更新界面、新生方块的预览、游戏开始按钮、暂停游戏按钮、退出游戏按钮以及游戏排行榜按钮。从很大程度上决定了玩家对游戏的兴趣问题,因此,游戏的主界面应该力求美观,爽心悦目。l 游戏控制模块: 这个模块是游戏的中心环节,主要完成控制游戏的开始、暂停、退出等功能。为了能够给玩家一个很好的游戏环境,这部分应该做到易懂、易操作。1.4 设

5、计实现功能和目标本设计所开发的是基于Java的一个贪吃蛇游戏软件,主要实现游戏的开始、暂停、退出、等功能,分为: 游戏主界面模块、游戏控制模块以二个模块。l 性能:本软件在设计方面本着方便、实用及娱乐性高的宗旨,在对界面进行设计的过程中,始终坚持清晰明了,在性能方面能够实现效率高,不易出错等优点。l 游戏主界面模块:主要包括游戏图形区域界面、游戏开始按钮、暂停游戏按钮、关闭按钮。游戏的主界面应该力求美观,爽心悦目。l 游戏控制模块:主要完成控制游戏的开始、暂停、退出等功能,这部分应该做到易懂、易操作而且准确率高,不易出错。1.5游戏设计环境 本次课程设计所涉及和实现的是用Java编程语言和JB

6、uilder开发工具开发的贪吃蛇游戏。本次设计的系统环境及工具如下: 运行环境:windows xp 编程语言:Java 使用工具:JBuilder 2005 二 分析与设计2.1 游戏处理流程 本次游戏设计的处理流程如图1所示。单击“开始游戏”按钮, 游戏开始,蛇开始随机。键盘操作: 向上左移右移向下没有吃到食物且蛇碰到边界单击“退出游戏”退出游戏游戏中途欲中断,稍后继续游戏单击“暂停游戏”游戏暂停进入游戏画面再次单击开始游戏,游戏恢复图1 游戏处理流程图2.2需求分析2.2.1 用户的特点 游戏开发成功后,最终用户为各个年龄段的人群,用户范围相当广泛。本游戏友好的用户界面,简单易学的按钮操

7、作以及简单通俗的游戏规则,使广大的用户不需要专门进行培训,就可以立即学会如何使用。2.2.2 功能需求2.2.2.1 游戏主界面模块需求游戏界面主框架主要包括游戏图形区域界面、游戏开始按钮、游戏暂停按钮、关闭按钮。2.2.2.2 游戏图形区域界面的需求游戏画布区主要应该包括游戏画布中贪吃蛇随机出现的位置,贪吃蛇重新出现的位置,事物随机出现的位置。2.2.3 属性需求在可使用性方面,要求各个功能实现简单,操作方便,系统处理正确;整个系统恢复性能好,连接速度快,以确保系统可使用性好。另外,还要求系统的可扩展性、可维护性、可移植性良好。2.3 功能模块设计软件开发过程中的功能模块设计,主要解决实现该

8、游戏需求的程序模块设计问题。包括如何把该游戏划分成若干个模块、决定各个模块之间的接口、模块之间传递的信息,以及模块结构的设计等。2.3.1 游戏功能 本系统主要完成以下几方面的功能:1. 游戏控制功能包括游戏的开始、暂停、退出2. 界面布局3. 其他辅助功能2.3.2 总设计模块的划分根据游戏需求中游戏所要实现的功能,整个游戏分为二个模块进行具体的设计,如图2所示。贪吃蛇游戏游戏主界面模块游戏控制模块图2 游戏总设计模块2.3.3 游戏主界面模块游戏界面主框架主要包括游戏图形区域界面、游戏的开始按钮、暂停按钮、游戏的退出按钮。游戏界面主框架的主要结构图如图3所示。游戏的主界面框架游戏图形区域界

9、面(即游戏画布)游戏控制按钮界面图3 游戏主界面框架2.3.4 游戏控制模块 游戏控制模块主要通过主界面上的按钮来控制游戏的开始、游戏的暂停、游戏的退出这三个功能以及控制游戏分数变化。在这个模块中,需要给各个按钮或文本框加入代码,来对上述的功能加以进一步的实现。 游戏控制模块的主要框架如图4所示。游戏控制模块游戏的开始功能游戏的暂停功能游戏的退出功能图4 游戏控制模块框架l 游戏开始控制:单击“游戏开始”按钮,游戏画布即有移动的贪吃蛇出现,游戏正式开始。l 游戏暂停控制:单击“暂停游戏”按钮,游戏暂停;再单击,游戏继续。l 游戏退出控制:单击“退出游戏”按钮,退出该游戏。2.3.5 类模块设计

10、2.3.5.1类模块之间关系通过对功能要求的分析,将贪吃蛇游戏功能划分为6个类模块,他们的关系如图5所示。SnakeApp(主类)(主类)SnakeFrame(用户界面类)SnakePanel(游戏界面 及内容)ArrayIndex(游戏方向)图5 贪吃蛇类之间的关系SnakeModel(游戏内容)ArrayIndexReadOnly(方向)(游戏方向)Listener类(控制速度)2.3.6 各类模块设计概要l SnakeApp类该类包含main方法,为应用程序的主类。该类用来创建游戏的用户界面,整个程序从该类的main方法开始执行。l SnakeFrame类用来设计游戏的用户界面。l Sn

11、akePanel类设置游戏运行状态,设置蛇头颜色,背景颜色,随机块颜色,移动以及分数更新,实现上下左右移动的方法接口。l SnakeModel类设置初始化蛇的形状和运行方向,设置随机块的位置,判断游戏是否出界,以及出界后的处理,设置方向的更新。l ArrayIndex类 用来得到坐标,设置坐标以及判断运行方向相同或相反。l ArrayIndexReadOnly类用来得到坐标,以及判断运行方向相同或相反。l Listener类用来控制游戏的速度2.3.7 游戏图形界面的图形显示更新功能游戏的图形区域界面主要是一个图形显示更新区域,主要包括随机食物的显示更新、进行中和游戏结束时的分数更新和游戏图形

12、区域界面的清除。游戏图形区域又很多小方格组成,主要是一个表格,根据相应格子的设置标志来显示相应的图形图片,这样就实现了贪吃蛇的实时显示。2.3.8 贪吃蛇蛇身的设计在贪吃蛇游戏中,具体的蛇身图形的设计是比较重要的一个方面。因为贪吃蛇游戏中主要的游戏动作就是控制蛇身的移动和转向,以便于覆盖随机块。由于主要的游戏动作都集中在蛇身上,因此蛇身设计就显得格外重要。2.3.9 内部接口 内部模块之间的接口是通过内部函数完成,在程序设计中用设计软件本身所带的调用函数实现。2.4 详细设计2.4.1程序主结构 本次所设计贪吃蛇游戏的程序主结构如图6所示。初始化进入事件等待状态初始化失败不正常退出开始请求相关

13、事件返回暂停请求退出正常退出图6 贪吃蛇程序主结构2.4.2 类模块程序流程图SnakeApp类创建SnakeFrame窗口类的一个实例设置关闭窗口按键和窗口的高度宽度图7 SnakeApp类程序流程图SnakeFrame类定义菜单及菜单项变量创建菜单及菜单项将组件注册给事件监听者处理各子菜单动作时间图8 SnakeFrame类程序流程图SnakePanel类设置蛇头身体,随机块和初始运行方向变量重新开始游戏时初始化处理游戏动作图9 SnakePanel类程序流程图设置蛇头、背景、随机块颜色实现移动接口定义数据成员实现按键接口SnakeModel类设置函数坐标和方向设置初始化状态图10 Sna

14、keModel类程序流程图设置贪吃蛇界面并初始化游戏是否与运行方向相反Y 保持原来 的方向按指示方向运动蛇是否吃了随机块Y 重设置蛇头和蛇身,重新生成随机块N 是否出界NNNY 游戏结束是否相交Y 游戏结束N移动,把蛇头加到蛇身体里面并且把尾巴移出是否与运行方向相同或相反方向更新,返回tureNArrayIndexReadOnly类构造函数得到坐标设置与运行方向相同和相反的表示方法图11 ArrayIndexReadOnly类程序流程图ArrayIndex类设置X,Y坐标设置与运行方向相同或相反的表示方法图12 ArrayIndex类程序流程图listener类创建一个Listener方法实现

15、监听接口 暂停时间是否大于10NY暂停时间设置为100按当前速度运行图13 listener类程序流程图2.4.3 类模块具体设计SnakeApp.java程序 SnakeApp类中包含main方法,为主类。在主类中创建了Snake Frame窗口类的一个实例。设计如下:l 成员变量表表1 SnakeApp.java程序成员变量表变量名称变量属性说明WIDTHprivate static final int窗体宽度HEIGHTprivate static final int窗体高度l 成员方法表 2 SnakeApp.java程序成员方法方法名称方法功能备注main创建了SnakeFrame窗

16、口类的一个实例,应用程序从main方法开始执行应用程序的入口方法SnakeFrame.java程序这个程序中包含二个类,下面分小节分别叙述。SnakekFrame类程序SnakeFrame类用来设计游戏的用户界面。在该界面上有用户玩游戏的功能菜单、游戏界面及游戏的状态栏。设计如下:l 成员变量表表3 SnakeFrame类程序成员变量表变量名称变量属性说明jMenu1JMenu主菜单项“游戏”startJMenuItem子菜单项“开始游戏”pauseJMenuItem子菜单项“暂停游戏”endJMenuItem子菜单项“结束游戏”quitJMenuItem子菜单项“关闭”l 成员方法表4 Sn

17、akeFrame类程序成员方法表方法名称方法功能备注SnakeFrame加载整个用户界面,注册子菜单的ActionEvent事件构造函数actionPerformedActionEvent事件处理方法。该方法处理各按钮的动作事件接口方法 listener类程序 具体设计如下:l 成员变量表表5 listener类程序成员变量表变量名称变量属性说明pauseprivate long游戏速度停顿时间l 成员方法表6 listener类程序成员方法方法名称方法功能备注listener用来控制游戏的速度构造函数actionPerformed把pause的值赋给speedtime,处理速度事件Array

18、Index.java程序l 成员变量表7 ArrayIndex类程序成员变量表变量名称变量属性说明xprivate int 定义x坐标 yprivate int定义y坐标l 成员方法表8 ArrayIndex类程序成员方法方法名称方法功能备注ArrayIndex对坐标赋初值构造函数getX得到x坐标自定义方法getY得到y坐标自定义方法setX设置x坐标自定义方法setY设置y坐标自定义方法equalOrRev运行方向是否同向或反向自定义方法equals运行方向是否同向自定义方法reverse运行方向是否反向自定义方法ArrayIndexReadOnly.java程序l 成员变量表表9 Arr

19、ayIndexReadOnly类程序成员变量表变量名称变量属性说明xprivate int 定义x坐标 yprivate int定义y坐标l 成员方法表10 ArrayIndexReadOnly类程序成员方法方法名称方法功能备注ArrayIndexReadOnly对坐标赋初值构造函数getX得到x坐标自定义方法getY得到y坐标自定义方法equalOrRev运行方向是否同向或反向自定义方法equals运行方向是否同向自定义方法reverse运行方向是否反向自定义方法SnakePanel.java程序l 成员变量表 表11 SnakePanel类程序成员变量表变量名称变量属性说明parentJF

20、rameJFrame的对象设置界面rowprivate int贪吃蛇的行数colprivate int贪吃蛇的列数gridsprivate JPanel格子directionprivate ArrayIndex游戏运行方向snakeprivate SnakeModel蛇的形状snakeBodyprivate LinkedList蛇的身体othersprivate LinkedList除了蛇以外的地方snakeHeadprivate ArrayIndexReadOnly蛇的头tempBlockprivate ArrayIndexReadOnly随机块speedTimeprivate long蛇的

21、运行速度bodyColorprivate Color身体颜色headColorprivate Color头的颜色tempColorprivate Color随机块颜色othersColorprivate Color背景颜色tprivate Thread一个线程isEndprivate boolean判断对错gameHaveExitprivate static boolean游戏结束l 成员方法表12 SnakePanel类程序成员方法方法名称方法功能备注SnakePanel设置游戏界面的属性及注册组件的键盘事件构造函数newGame对重新游戏的设置以及初始化stopGame结束当前游戏的线程r

22、esumeGame暂停游戏updateBg当前状态下蛇头,身体和随机块的颜色更新isFocusTraversable是否可以穿过run该方法中,用线程控制控制游戏,让蛇不停地移动,吃了随机块分数加1。更新显示分数。Runnable接口方法keyPressed键盘事件处理方法。keyReleased空方法keyTyped空方法SnakeModel.java程序l 成员变量表 表13 SnakeModel类程序成员变量表变量名称变量属性说明theThreadThread创建线程来控制游戏bSnakeFramerowprivate int游戏的行数colprivate int游戏的列数snakeHe

23、adprivate ArrayIndex蛇头坐标jpsprivate ArrayIndexReadOnly方格坐标snakeprivate LinkedList蛇的形状othersprivate LinkedList除了蛇以外的地方tempBlockprivate ArrayIndexReadOnly随机块runingDirictionprivate ArrayIndex运行方向的判断l 成员方法表14 SnakeModel类程序成员方法方法名称方法功能备注getSnakeHead设置蛇头坐标getSnakeTail设置身体坐标getRuningDiriction得到运行方向getSnake得

24、到蛇的形态getOthers得到除了蛇以外的其它部分setSnakeHead设置蛇头坐标getTempBlock得到随机块坐标setTempBlock设置随机块坐标moveTo移动initializeV初始化游戏SnakeModel蛇模型的初始化move判断运行方向,判断是否吃了随机块,判断游戏是否出界 ,出界后是否参加排名,以及运行方向的更新。三 系统测试打开贪吃蛇游戏后,出现如下图14所示界面 图14 点击主菜单的【文件】出现如图15所示界面。选择【退出】则可以退出游戏。 图15 再点击【帮助】就会出现如图16所示界面。 图16 点击主菜单的【设置】会出如图17所示界面,点击等级的类别修改

25、难度系数。 图17点击【风格】如图18所示可去掉网格。 图18点击【新游戏】按钮开始游戏,如图19所示并有暂停和继续功能。 图19 四 心得体会通过这次课程设计,我对上学期所学的JAVA语言程序设计有一个更深刻的了解,将所学的知识应用于实践,由于所学知识有限,为了使游戏能够能够实现自己预先的构想,我们这组通过上网找代码和去图书馆借书找程序,比较画好的流程图及功能模块,不断阅读修改代码使程序达到预期所要实现的目标,完成课程设计后,可以感觉到自己对Java程序的又有了新的认识。在这次课程设计中,我主要负责窗体和判断蛇的运动的设计和开发,在SnakeApp类中先定义了窗体的长度和宽度,然后通过fra

26、me.show()显示窗体,用注册监听器到Window的接口,利用System.exit(0)语句来完成关闭窗口的设计,在窗体大小的设计中,宽度和高度是采用宏定义的形式。在ArrayIndex和ArrayIndexReadOnly类的设计中,两个类的设计基本相似,但是在本组成员其他类的调用中用法不一样,先定义了X和y的坐标,定义构造函数,用getx()和gety()方法得到X和Y的坐标,用setX(int x) 和setY(int y)方法设置X和Y的坐标,用布尔型判断equalOrReV,equals,reverse方法,判断蛇的各种运行方向,以便在其他设计中能够更好的判断蛇是否出界,是否与

27、随机块即食物出现时正在运行的方向一致。在做Java设计之前也有做过其他的课程设计,大多规模很小。在数据库、各种应用软件和游戏中,我仍觉得对游戏的设计有极大的热情。因为其各个模块间的联系十分紧密,代码重复执行率高,当经过无数次的调试、修改后,能最终看到成品,有无比自豪的心情。大学期间做过图书馆管理程序等简单的数据库管理系统的课程设计,思想大致相似,变化范围有限,没有太多自己可发挥的余地。大家作品的最终结果都离不开同一个模式。相比一些数据库软件,游戏的设计有很多人情色彩和艺术思想的发挥,正式商业的软件的人性化界面和各个游戏间迥异的结构每每会让人有去开发的冲动。综合运用以前所学习的知识,设计一个JA

28、VA手机游戏,并能实现以下的功能:游戏声音的控制、游戏等级的控制、最高分的记录、游戏暂停、游戏重新开始、游戏的结束。总之,通过本次的课程设计,使我平时学到的理论知识得到了很好地升华,理论与实际得到一次很好的结合,为我今后参加工作打下了坚实的基础,使我受益匪浅。参考文献 1 魏伟译JBuilder开发人员指南M北京:机械工业出版社,2001.1. 2 胡雷, 叶曙光, 徐饪JBuilder 9.0 入门与提高M北京:机械工业出版社,2004.3 田勇,孙新Jbuilder开发人员指南M北京: 机械工业出版社,2001.4 李尊朝,苏军.Java语言程序设计(第二版)M.北京:中国铁道出版社,20

29、09.5 黄晓东.Java课程设计案例精编(第二版)M.北京:中国水利水电出版社,2008.6 陆光义,宋现锋.Java游戏编程导学M. 北京:清华大学出版社.2004.附录 “贪吃蛇游戏”程序部分源代码一、SnakeApp.javapackage cccc;import javax.swing.*;import java.util.*;import java.awt.*;import java.awt.event.*;class SnakeApp public static void main(String args) /主函数SnakeFrame frame=new SnakeFrame(

30、);frame.addWindowListener(new WindowAdapter() /注册事件监听器public void windowClosing(WindowEvent e)/关闭窗体 System.exit(0););frame.setSize(WIDTH,HEIGHT);/设置窗体大小frame.setResizable(false);frame.setLocation(300,200);frame.setTitle(贪吃蛇 v1.0);/设置窗体标题为贪吃蛇 v1.0/显示窗口frame.show();private static final int WIDTH=300;

31、/宽度值为300private static final int HEIGHT=270;/高度值为270二、ArrayIndex.javapackage cccc;public class ArrayIndex private int x; /定义x坐标private int y; /定义y坐标ArrayIndex(int x,int y)/构造函数this.x=x;this.y=y;int getX()/得到x坐标return x; int getY()/得到y坐标return y;void setX(int x)/设置x坐标this.x=x;void setY(int y) /设置y坐标t

32、his.y=y;public boolean equalOrRev(ArrayIndex e)/运动的方向相同或相反return (e.getX()=getX()&(e.getY()=getY()|(e.getX()=getX()&(e.getY()=-1*getY()|(e.getX()=-1*getX()&(e.getY()=getY();public boolean equals(ArrayIndex e)/运动方向相同return(e.getX()=getX()&(e.getY()=getY();public boolean reverse(ArrayIndex e) /运动方向相反r

33、eturn (e.getX()=getX()&(e.getY()=-1*getY()|(e.getX()=-1*getX()&(e.getY()=getY();三. ArrayIndexReadOnly.javapackage cccc;public class ArrayIndexReadOnlyprivate int x; /定义x坐标private int y; /定义y坐标ArrayIndexReadOnly(int x,int y) /构造函数this.x=x;this.y=y;int getX()/得到x坐标return x; int getY()/得到y坐标return y;pu

34、blic boolean equalOrRev(ArrayIndexReadOnly e)/运动的方向相同或相反return (e.getX()=getX()&(e.getY()=getY()|(e.getX()=getX()&(e.getY()=-1*getY()|(e.getX()=-1*getX()&(e.getY()=getY();public boolean equals(ArrayIndexReadOnly e) /运动的方向相同return(e.getX()=getX()&(e.getY()=getY();public boolean reverse(ArrayIndexReadOnly e) /运动的方向相反return (e.getX()=getX()&(e.getY()=-1*getY()|(e.getX()=-1*getX()&(e.getY()=getY();

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服