毕业设计思路样本Word格式文档下载.docx
- 文档编号:14710252
- 上传时间:2022-10-24
- 格式:DOCX
- 页数:8
- 大小:59.39KB
毕业设计思路样本Word格式文档下载.docx
《毕业设计思路样本Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《毕业设计思路样本Word格式文档下载.docx(8页珍藏版)》请在冰豆网上搜索。
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()给它传递一个画笔Graphicsg,从蛇头到蛇身依次画出每个格子。
最后考虑到以后重新开始游戏,以及多个关卡的问题,这里先定义好一个蛇初始化的功能函数init()。
关于蛇的分析先到这里。
其次是对食物的分析:
食物在游戏中自始至终只会有一个,只需定义一个Square对象即可,命名为food;
由于后面蛇吃到食物后要随机生成一个新的食物,需要用到Random类中的随机函数,这里事先定义好一个Randomran;
确定好参数后确定功能函数,首先应该是判断食物是否被吃掉,定义函数isFoodEaten();
同isEatFood相似。
其次食物被吃掉之后会随机产生一个新的食物,定义函数setFood(),产生新食物的瞬间,旧食物已经消失,没有必要在去创立一个food对象,只需将food中的坐标改变一下即可,x坐标传入一个随机的参数,y坐标传入一个随机的参数,显示面板大小先确定划分为30*30个格子,x坐标和y坐标应该在0~29之间,只需简单的一句话x=(int)(ran.nextFloat()*30),经过Random类获取0~1之间的小数,乘以30得到0~30之间的数,在强制转换为int类型的数传递给x,y;
最后同蛇相似,食物也应该在面板中显示,定义显示的功能函数drawMe()传入参数Graphicsg。
再接着对石头分析:
在对蛇分析的时候依然考虑到石头的存储,定义一个boolean类型的数组记录是否画石头,booleanmap[][]=newboolean[30][30];
考虑到以后地图的改变,在创立石头的时候应该设计不同的地图,根据传入参数的不同,创立不同的地图,定义构造函数Stone();
传入一个int类型的参数,根据参数创立不同的地图;
地图设计较为简单,利用switch()case:
判断需要创立何种地图。
创立地图既是在map[][]数组中不同的位置设置成true。
同蛇与食物相同,石头类应该具有显示功能drawMe(),传入参数Graphicsg。
完善以上功能之后就能够在逻辑处理类Logic中先搭建简单的处理关系,以保证蛇,食物,石头能够显示出来;
Snakesnake=newSanke();
Foodfood=newFood();
Stonestone=newStone
(1);
先显示地图1作为测试。
在显示面板类DisplayPanel中创立构造函数传入Logic的实例对象;
重写paint方法,paint()方法中调用logic.Snake.drawMe()logic.Stone.drawMe()logic.food.drawMe();
运行可显示效果,看到蛇,食物,石头已经显示到面板中。
5.逻辑关系处理
做好的蛇还不会移动,接下来就来实现此功能:
蛇要在每隔一段时间移动一个格子。
蛇要移动,还要在没有死亡之前一直移动,主函数所启动的主线程的任务是启动窗体以及在内存中创立好所需要的资源,这里必须另开一个新的线程。
开启线程的方法有两种,这里选择实现Runnable接口的方法,让LogicimplementsRunnable,实现run()方法,由于蛇要不停的运动在蛇的move方法之外加入while(true),蛇每隔一段时间会自动移动一格,在move方法之后添加Thread.sleep(300),经过多次运行测试得出的时间;
在主函数MainOfGreedySnake中创立线程threadt=newThread(logic);
运行观察效果,会发现蛇依旧不会移动,这是因为显示面板中的paint函数需要重新被调用才会重新绘制图形,在DisplayPanel的paint最后加上repaint();
再次运行,蛇已经能够自己移动。
现在的蛇依然能够移动,但不受控制,会移动出边界,因此需要在蛇移动之后判断蛇是否移出边界,将此功能封装成函数,显然应该定义在蛇类中,命名为isOverBand(),函数所需的功能即判断蛇头是否移出边界,若是则将蛇头的坐标更换为另一边界的坐标,实现了蛇在规定范围内自动移动。
蛇能够自动移动,但依然还不受控制,后面将实现键盘控制蛇移动方向:
键盘控制蛇移动方向,也即是每按下一个键,经过某种响应,让蛇的方向改变,很容易想到JavaGUI开发中提供的事件监听机制,但问题在于事件监听机制是针对GUI组件设计的,这就需要将蛇的方向和主函数创立的JFrame联系到一起,主函数中需要创立Logic实例对象,Logic中有创立蛇对象,能够直接在主函数的JFrame上添加监听器,关于监听器的创立这里为了以后添加更多功能不至于关系复杂化,采用匿名内部类的方法为JFrame添加监听器,JFramejf=newJFrame();
jf.addKeyListener(newKeyListener(){}),监听器里面重写keyPressed()功能函数,利用switch(){case}语句判断方向键调用logic.snake.chageDirection()方法改变方向。
到这里程序调试运行方向以然能够控制,但按照规定,蛇不能向相反方向运行,在改变方向的时候应该做一个判断,新传入的方向值若和snake对象中方向值相同的话,snake方向值不做改变,加以判断之后,蛇的运行轨迹同想象中的运行规则几乎没有差别了,可是还有一个小小的bug存在,就是如果蛇向下移动的话,在下一次移动触发前,先按下向左,在按下向上,蛇还会向
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 毕业设计 思路 样本