毕业设计思路Word下载.docx
- 文档编号:16028242
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:9
- 大小:72.66KB
毕业设计思路Word下载.docx
《毕业设计思路Word下载.docx》由会员分享,可在线阅读,更多相关《毕业设计思路Word下载.docx(9页珍藏版)》请在冰豆网上搜索。
为蛇吃到食物后添加声音效果,增设背景音乐,可以控制背景音乐的开关;
3.为了区别与经典模式的不同,游戏增加新的规则模式,新的模式规则中,初始化的蛇长度一定,蛇吃到食物后,食物随机产生一个新的食物,原来的食物经过蛇的消化后变为石头固定在原处不能移动。
二、设计思路:
1.首先考虑所需要的总体框架
贪吃蛇游戏主题应为蛇,需要创建蛇这个类命名为Snake,还要有食物类命名为Food,石头类命名为Stone,显示面板类命名为DisplayPanel,逻辑处理类命名为Logic以及主函数类命名为MainOfGreedySnake。
2.搭建类与类之间的关系
蛇吃食物,食物在被蛇吃到后随机产生新的食物,食物不能在石头上生成,关系复杂,我们可以将这些关系在逻辑处理类Logic中搭建,这样即降低了上面三个类之间的耦合性,又方便以后对辅助功能的添加。
蛇,食物,石头需要在显示面板中显示出来,而三者又在逻辑处理这个类Logic中做逻辑关系运算,我们可创建自己的显示面板类DisplayPanel,用逻辑处理类Logic创建对象作为参数传递给显示面板,使得蛇,食物,石头以及显示面板直接的关系更加简单。
3.添加简单的测试功能
首先需要创建主函数,主函数中创建逻辑处理类Logic的实例对象,创
身体由多个格子组成,需要一个链表集合存储,定义一个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();
运行可显示效果,看到蛇,食物,石头已经显示到面板中。
4.逻辑关系处理
做好的蛇还不会移动,接下来就来实现此功能:
蛇要在每隔一段时间移动一个格子。
蛇要移动,还要在没有死亡之前一直移动,主函数所启动的主线程的任务是启动窗体以及在内存中创建好所需要的资源,这里必需另开一个新的线程。
开启线程的方法有两种,这里选择实现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存在,就是如果蛇向下移动的话,在下一次移动触发前,先按下向左,在按下向上,蛇还会向相反的方向移动,对于这个问题的解决首先要找到问题的根源,如果蛇向下移动的时候,先按下向左的方向,蛇的direction会被赋值为向左,但在蛇下一次移动之前,又按下向上的方向键,在判断方向的时候,向上的方向与向左的方向值不是相反方向,又会被赋值,这就导致了相反方向仍然会存在的可能性,关于此问题的解决,可以定义两个方向值,一个用于保存蛇移动之前的方向,命名为oldDirection,一个用于保存蛇移动之后的方向,命名为newDirection,在做方向判断的时候,拿新来的方向跟oldDirection向比较,方向不相反,把新传入的方向值副给newDirection,在蛇移动一次之后,再将newDirection赋值给oldDirection,这样便解决了无效方向的问题。
解决了控制蛇移动的问题之后,应该为程序设计蛇吃食物的逻辑关系:
蛇吃食物的问题较为简单,当蛇吃到食物后,随机产生新的食物,蛇是否吃到食物,在蛇移动一次之后调用一下snake.isEatFood()函数即可,随机产生食物只需在蛇吃到食物的前提下调用一次food.setFood()函数便可以完成。
关于蛇吃到食物后蛇的变化,身体长度增加一格,snake.length++,只是实现了蛇的长度变量增加了一格,还需要在snakeBody集合中真正的添加一个格子单元,问题在于Square的一个对象应该加在集合的哪个位置、添加的格子坐标应该是多少,首先看一下蛇移动的功能实现模式,每移动一次是加头去尾,可以在蛇移动之后添加一个不再面范围之内的虚拟格子到snakeBody的末尾,这样蛇在下一次移动的时候就会去掉的尾巴便是虚拟的尾巴,相当于没有去尾,这样就实现了蛇自身长度
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 毕业设计 思路