贪吃蛇设计文档Word格式文档下载.docx
《贪吃蛇设计文档Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《贪吃蛇设计文档Word格式文档下载.docx(11页珍藏版)》请在冰豆网上搜索。
3.6蛇身的移动方向8
3.7吃到食物判定8
4类的设计8
4.1设计9
5详细设计9
5.1controller包9
5.1.1Controller类9
5.2mouse包10
5.2.1Mouse类10
5.3entities包10
5.3.1Food类10
5.3.2Ground类10
5.3.3Snake类11
5.4game包11
5.4.1Game类11
5.5listener包12
5.5.1Snakelistener类12
5.6util包12
5.6.1Global类12
5.7view包12
5.7.1GamePanel类12
5.8sound包12
5.8.1Sound类12
6UI设计13
贪吃蛇演示图13
1引言
1.1编写目的
本文档为“编程实习——贪吃蛇游戏”的全程设计说明书。
包括需求分析、概要设计、详细设计等方面。
本文档的预期读者为:
1、评审小组老师
2、项目开发小组人员
3、与本项目相关的其他人员等
1.2项目背景
贪吃蛇是世界知名的益智类小游戏,选择这个题目一方面的原因是为了将我们自己的所学知识加以运用;
另一方面,虽然很小就接触这个游戏,但是它的制作方法对我们而言还是很神秘的。
我们希望通过自己的所学知识把它剖析开来,通过自己的动手实践,真正的了解它的本质和精髓。
希望通过这次实践,我们能从中提高自己的编程能力。
并从中学会从零开始分析设计程序。
1.3开发工具和语言
本游戏的开发语言为Java。
开发工具选用Eclipse。
Java是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构中立的,可移植的,性能优异、多线程的动态语言。
这里采用Java作为开发语言主要是基于Java的面向对象和可移植性。
Eclipse是一个开放源代码的、基于Java的可扩展开发平台。
就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。
1.4术语说明
1.4.1数据结构
数据结构是计算机存储、组织数据的方式。
数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。
数据结构往往同高效的检索算法和索引技术有关。
1.4.2类
类是面向对象程序设计语言中的一个概念。
类(Class)实际上是对某种类型的对象定义变量和方法的原型。
它表示对现实生活中一类具有共同特征的事物的抽象,是面向对象编程的基础。
类是对某个对象的定义。
它包含有关对象动作方式的信息,包括它的名称、方法、属性和事件。
实际上它本身并不是对象,因为它不存在于内存中。
当引用类的代码运行时,类的一个新的实例,即对象,就在内存中创建了。
虽然只有一个类,但能从这个类在内存中创建多个相同类型的对象。
2概要设计
2.1目标
利用Java的图形化技术和多线程技术开发制作一个贪吃蛇的小游戏。
游戏中玩家可以通过键盘控制游戏中的贪吃蛇的运动,当蛇头碰到系统产生的食物时加长蛇身。
当蛇碰到石头或者自己的身体时,游戏结束。
游戏玩家还可以通过鼠标来控制蛇的移动。
游戏规则:
1、玩家通过键盘控制蛇在游戏区中运动;
2、当蛇头碰到食物时,得分增加,蛇身增长一个单位;
3、当蛇头碰到蛇身或者石头,游戏结束;
要求实现以下功能:
玩家可以通过键盘或鼠标来控制贪吃蛇吃食物,游戏过程中还配有音效渲染气氛。
2.2运行环境
正确安装配置了JRE1.5以上的Windows和Linux的PC机都可正常运行此游戏。
2.3总体设计
整个游戏设计工作包括:
游戏设计思路、算法中的基本概念、游戏结构以及游戏整体流程。
2.3.1游戏设计思路
贪吃蛇游戏是一款非常经典的游戏,已经有很多版本的贪吃蛇游戏,游戏的玩法各版本大体相同。
以下是本课题的贪吃蛇游戏设计的一些简单的说明:
1、先设置一个主控面板;
2、依次向面板中添加蛇,食物,石头;
3、设法引导贪吃蛇吞掉食物以使它变得更长;
4、添加监听程序,通过方向键来改变蛇的运动方向;
5、添加监听程序,通过鼠标来改变蛇的运动方向;
6、蛇不能吃到石头或是自己的身体,如果吃到石头或者自己的身体,游戏结束;
7、蛇吃食物或者死掉的时候都有特定的音效产生。
2.3.2算法中的基本概念
节:
一条蛇可以看成由许多圆拼凑成,把它称作节。
节是贪吃蛇身上最小的单位。
坐标系:
坐标以左上角那点为(0,0),向右则x递增,向下则y递增。
链表:
用来保存每一节的状态,链表的第一个元素表示蛇的头部结点。
2.3.3游戏结构
该游戏采用面向对象的设计模式,赋予游戏中的所有物体对象的概念和属性。
运行程序后允许用户使用鼠标对贪吃蛇进行控制。
在主程序运行的线程中,画面刷新将以一定的频率对屏幕重绘,实时反映整个游戏的进行状态。
2.3.3.1类的设计
为了实现贪吃蛇游戏的上述各种功能,就要对游戏程序进行结构设计,游戏主要包括六个类,分别是:
Controller类,Food类,Ground类,Snake类,GamePanel类以及Mouse类。
这六个类完全依照面向对象的设计原则,这都是游戏中的对象。
游戏开始后先绘制屏幕,并将各个对象实例化。
在主程序运行的线程中,游戏中所有的对象都应该运行在同一个线程下。
在屏幕重绘的主程序中,将在每次的循环中判断若干事件,以便程序进入相关的分支执行相关的反应代码。
如:
贪吃蛇的更新,食物的更新,屏幕上相关信息的绘制等。
程序为需要完成独立功能的模块设置了单独的类。
2.3.4游戏整体流程
这个游戏流程图描述了整个游戏的总体运行过程。
在开始游戏后对蛇与食物重绘,以及屏幕上的相关信息绘制。
当蛇碰到石头或是咬到自己,就捕捉异常,游戏就结束。
3数据结构设计
3.1蛇、石头、食物的表示
我们可以把显示区域想象成一个大大的表格,里面的格子就是组成蛇的基本单位,一个格子可以代表一个食物,也可以代表一个石头,几块连在一起的石头就可以代表一条蛇。
使用坐标来区分这些格子。
这里我们用一个集合来存储这些坐标,并且要求能够区分出蛇头和蛇尾。
3.2蛇的移动
蛇向前移动一步,可以看作是蛇头前面增加了一个节点,蛇的尾巴上少了一个节点(即去尾,加头)
3.3存储蛇身的数据结构
由于要区分蛇头和蛇尾,因此这个数据结构必须是有序的。
另一方面,我们需要经常的访问第一个和最后一个节点,所以LinkedList最合适。
因为它有getFirst(),getLast(),和removeLast()方法。
3.4蛇的移动方向
这里讨论蛇的移动方向控制。
蛇下一步移动到哪里,是由方向来控制的。
这里我们用int型常量来表示蛇的移动方向。
因为我们是根据原蛇头的坐标和方向来确定新蛇头的坐标。
在原坐标的基础上,根据蛇头的运动方向来确定新蛇头的坐标,比如向上移动就是y-1.
3.5如何显示蛇身
显示蛇身,其实就是填充用颜色填充格子。
需要4个参数,像素坐标x,像素坐标y,格子宽度,格子高度。
像素坐标就是矩形左上角的坐标
3.6蛇身的移动方向
3.6.1相反方向
和上一次移动的方向相反的方向称为相反方向,这种输入应该忽略。
这样可以防止蛇从自己的身体中穿过。
3.6.2无效方向
在蛇的这一次移动之后和下一次移动之前这个时间间隔内输入了多个非相反方向,只有最后一个是有效方向,其他的都是无效方向。
蛇的最终运动方向以有效方向为准。
3.7吃到食物判定
这里通过判定坐标是否重合来判断,只需要判断蛇头是否和食物重合就可以了,因为蛇的身体都是走蛇头走过的地方。
4类的设计
4.1设计
4.1.1GamePanel类
游戏的显示面板,主要有显示的方法。
4.1.2Snake类
贪吃蛇的身体,包含移动,改变方向,吃掉食物,判定是否吃到身体,显示等方法。
4.1.3Food类
食物类,包含蛇是否吃到食物,显示等方法
4.1.4Ground类
这里可以称作石头,主要有蛇是否吃到石头,显示等方法。
4.1.5Controller类
Controller主要用来处理按键事件和处理逻辑。
4.1.6Mouse类
Mouse主要用来处理鼠标事件。
4.2通过事件监听建立联系
这些类自己主要通过事件监听来互相联系
5详细设计
游戏主要有以下几个包及包中的类组成。
5.1controller包
5.1.1Controller类
该类包含控制器和处理按键逻辑
控制器,控制Ground,Snake,Food.负责游戏的逻辑.处理按键事件
实现了SnakeListener接口的snakeMoved()方法,可以处理Snake触发的事件
该类继承KeyAdapter类并且覆盖keyPressed()方法:
处理按键事件,根据按键不同,发出不同的指令:
UP:
改变蛇的移动方向为向上
DOWN:
改变蛇的移动方向为向下
LEFT:
改变蛇的移动方向为向左
RIGHT:
改变蛇的移动方向为向右
newGame()开始新游戏的方法
5.2mouse包
5.2.1Mouse类
实现了SnakeListener接口以及Runnable接口,可以处理Snake触发的事件。
继承了MouseAdapter类,并覆盖了该类的mousePressed方法。
对特定像素点坐标采用网格索引的方法进行处理,使其转换为坐标
xIndex=arg0.getX()/Global.CELL_SIZE;
yIndex=arg0.getY()/Global.CELL_SIZE;
-1:
1:
2:
-2:
5.3entities包
5.3.1Food类
食物,有x,y坐标和颜色等属性
可以用setColor()设置食物的颜色
方法isSnakeEatFood判断食物是否被吃
运用newFood来创建新食物
drawMe方法显示食物
5.3.2Ground类
可以叫做地形,或地面
和食物一样,Ground也有x,y坐标和颜色等属性
构造方法Ground()初始化地图,设置格局
可以通过setColor()方法设置石头的颜色
方法isSnakeEatRock判断蛇是否吃到食物
最后运用drawMe方法显示石头
5.3.3Snake类
本类共包含18个方法,下面一一讲述他们的功能:
构造方法Snake()调用init()方法初始化蛇,并确定蛇的起始点及起始方向是向右的
move()方法决定蛇怎样移动,默认支持走到边以后从另一边出现
可以用setHeadColor()和setBodyColor()方法设置蛇头或蛇身体的颜色
getHeadColor()和getBodyColor()方法获得蛇头和蛇身体的颜色
drawHead(Graphics,int,int,int,int)和drawBody(Graphics,int,int,int,int)方法显示蛇头和蛇身体的颜色
drawMe()调用drawHead(Graphics,int,int,int,int)和drawBody(Graphics,int,int,int,int)方法来显示蛇
getOldDirection()得到蛇头结点的老方向
getHead()得到蛇头结点,以便与食物坐标相比较
isEatBody()返回蛇是否吃到自己的身体
eatFood()吃食物的方法,吃到食物身体变长并伴有音效产生
changeDirection()蛇改变方向的方法,通过传进来的参数来改变蛇的方向
addSnakeListener()添加监听程序
die()蛇死,并伴有特定音效产生,最后结束该进程
start()方法内部开启一个新的线程驱动蛇定时移动,调用这个方法的时候要注意蛇的身体的初始长度必须大于等于2
用内部类SnakeDriver驱动蛇定时移动
5.4game包
5.4.1Game类
主控类,游戏的整体框架。
5.5listener包
5.5.1Snakelistener类
蛇的监听器snakeMoved(Snakesnake)。
5.6util包
5.6.1Global类
工具类。
此类中存放了其他类中用到的一些常量:
一个格子的所占像素CELL_SIZE*CELL_SIZE,面板的宽和高:
WIDTH和HEIGHT。
5.7view包
5.7.1GamePanel类
游戏的显示界面。
该类覆盖了JPanel中的paintComponent()方法,实现页面重绘功能
display()显示面板。
5.8sound包
5.8.1Sound类
控制游戏音效的产生。
构造方法Sound()初始化,得到音频文件。
getSamples()返回音频文件。
play()播放音频文件。
6UI设计
本游戏的设计抛弃了传统的下拉菜单模式,最终运行结果如下图所示:
贪吃蛇演示图