毕业设计思路

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java编写贪吃蛇游戏思路

一、需求分析:

1.游戏以经典贪吃蛇默认规则设计需要蛇能够按照给定的方向每隔一段时

间自动移动;方向键“↑”、“↓”、“←”、“→”可以控制蛇移动的方向,蛇每吃到一个食物后身体长度增加一格,原有食物消失,再随机生成一

个不再石头上的新食物;石头即为地图,蛇吃到石头后游戏结束。

2.为了使游戏更加具备娱乐性和挑战性,增设关卡,随着关卡级别的升高,

蛇移动速度加快,蛇吃到食物的难度加大,吃到一定数量的食物即可过

关进入下一个关卡;为蛇吃到食物后添加声音效果,增设背景音乐,可

以控制背景音乐的开关;

3.为了区别与经典模式的不同,游戏增加新的规则模式,新的模式规则中,

初始化的蛇长度一定,蛇吃到食物后,食物随机产生一个新的食物,原

来的食物经过蛇的消化后变为石头固定在原处不能移动。

二、设计思路:

1.首先考虑所需要的总体框架

贪吃蛇游戏主题应为蛇,需要创建蛇这个类命名为Snake,还要有食物

类命名为Food,石头类命名为Stone,显示面板类命名为DisplayPanel,

逻辑处理类命名为Logic以及主函数类命名为MainOfGreedySnake。

2.搭建类与类之间的关系

蛇吃食物,食物在被蛇吃到后随机产生新的食物,食物不能在石头上生

成,关系复杂,我们可以将这些关系在逻辑处理类Logic中搭建,这样即

降低了上面三个类之间的耦合性,又方便以后对辅助功能的添加。

蛇,食物,石头需要在显示面板中显示出来,而三者又在逻辑处理这个

类Logic中做逻辑关系运算,我们可创建自己的显示面板类DisplayPanel,用逻辑处理类Logic创建对象作为参数传递给显示面板,使得蛇,食物,

石头以及显示面板直接的关系更加简单。

3.添加简单的测试功能

首先需要创建主函数,主函数中创建逻辑处理类Logic的实例对象,创建

自定义的显示面板对象DisplayPanel,将逻辑处理类Logic的实例对象作为参数传递给显示面板DisplayPanel的实例对象中,显示面板需要寄托在Frame框架上,这就需要在主函数中创建一个JFrame对象,然后将自定义的显示面板添加到JFrame对象上。

接着是在每个类中添加一个测试用的功能函数,简单的打印一条输出语句,在蛇类Snake中,创建一个功能函数打印“蛇类被加载”,食物类,石头类,逻辑处理类,显示面板类中添加同样的功能,在逻辑处理类中定义蛇,食物,石头对象,创建构造函数参数传入蛇,食物,石头类型的对象;自定义的显示面板继承JPanel类,定义逻辑处理类的对象,创建构造函数传入逻辑处理类的对象。

通过调用类中的功能函数来测试,确保他们之间已经建立联系。

4.类中填充功能及参数

首先分析蛇:

图2-4.1

我们把显示面板划分为格子,每个单位的蛇身占一个格子,食物,石头同样,通过抽取定义一个格子类命名为Square;蛇的身体由多个格

子组成,需要一个链表集合存储,定义一个LinkedList类型的集合命名为snakeBody,存储类型为格子类型Square的对象;蛇有一个长度,定义一个int型的变量Length存储长度,定义一个int型的direction变量控制蛇移动的方向;定义一个boolean类型的变量iseatfood,来标识蛇是否吃到食物;定义一个boolean类型的变量iseatstone来标识蛇是否吃到石头;

蛇的功能有移动功能,创建功能函数move(),关于蛇移动,我们可以让存储蛇身体的集合snakeBody添加一个蛇头,去掉一个尾巴来实现,蛇头添加的位置又应该由蛇移动的方向控制,因此在添加蛇头之前应该判断蛇头的方向,如果蛇向上移动,direction应为1,我们让改变之前的snakeBody调用addFirst()功能添加蛇头,里面的参数应为改变之前的蛇头的纵坐标减一个格子,向下,向左,向右原理相同。

蛇已更改具有改变方向的功能,以便于后面控制蛇移动的时候改变方向,定义函数changeDirection(),传入int型的方向值。

蛇还应该有判断是否吃到食物的功能,定义功能函数isEatFood(),判断蛇是否吃到食物只需判断蛇头的坐标是否和食物的坐标相同,这里有一个小问题,蛇类中没有定义食物Food类型的引用,判断时还要有食物类型的对象,为了降低蛇与食物之间的联系,不得不传入一个Food 类型的参数。

图:2-4.2

蛇应该有判断是否吃到石头的功能,由于石头是一个比较大的集合,若沿用判断是否吃到食物的方法必将浪费大量的资源,在后面设计石头的时候我们可以用一个boolean类型的二维数组来存储一组石头命名为map[][],是石头设置这个坐标为true,不是则设为false,这样判断蛇是否吃到食物就较为简单,只需判断蛇头的坐标作为石头数组时是否为treu即可。如图2-4.2所示,也即是直接反回map[snakeBody.getfirst().getx()][snakeBody.getfirst().getx()]即可。

蛇的另一个功能是判断蛇是否吃到自己的身体,需要定义一个功能函数isEatBoody()判断蛇是否吃到身体同判断是否吃到食物相同,只需判断蛇头的坐标与蛇身的坐标是否相同,为了减少CPU的工作量,可以稍微优化一点,判断蛇头与蛇身的坐标是否相同时从第4截身体开始判断即可,因为不管蛇怎么移动都不会与第二截、第三截身体相撞。

蛇要在显示面板中显示,按照面向对象的思想,蛇要在面板中显示身体,设计到的两个对象,蛇、面板,显然显示这个动作蛇自身应该最具权威性,蛇对自己的属性最了解,就应该把显示蛇这个功能定义在蛇这个类中,创建功能函数drawMe()给它传递一个画笔Graphics g,从蛇头到蛇身依次画出每个格子。

最后考虑到以后重新开始游戏,以及多个关卡的问题,这里先定义好一个蛇初始化的功能函数init()。

关于蛇的分析先到这里。

其次是对食物的分析:

食物在游戏中自始至终只会有一个,只需定义一个Square对象即可,命名为food;由于后面蛇吃到食物后要随机生成一个新的食物,需要用到Random类中的随机函数,这里事先定义好一个Random ran;

确定好参数后确定功能函数,首先应该是判断食物是否被吃掉,定义函数isFoodEaten();同isEatFood相似。

其次食物被吃掉之后会随机产生一个新的食物,定义函数setFood

相关文档
最新文档