毕业设计方案思路.docx

上传人:b****2 文档编号:12881096 上传时间:2023-04-22 格式:DOCX 页数:11 大小:58.94KB
下载 相关 举报
毕业设计方案思路.docx_第1页
第1页 / 共11页
毕业设计方案思路.docx_第2页
第2页 / 共11页
毕业设计方案思路.docx_第3页
第3页 / 共11页
毕业设计方案思路.docx_第4页
第4页 / 共11页
毕业设计方案思路.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

毕业设计方案思路.docx

《毕业设计方案思路.docx》由会员分享,可在线阅读,更多相关《毕业设计方案思路.docx(11页珍藏版)》请在冰豆网上搜索。

毕业设计方案思路.docx

毕业设计方案思路

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()给它传递一种画笔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函数需要重新被调用才会重新绘制图形,在DisplayPanelpaint最后加上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末尾,这样蛇在下一次移动时候就会去掉尾巴便是虚拟尾巴,相称于没有去尾,这样就实现了蛇自身长度加一格功能。

测试运营,效果已经不错了。

多次控制蛇吃到食物后,会发现食物会跑到石头上面,蛇吃到食物同步会吃到石头,意味着游戏结束,这就需要在生成食物之后判断一下食物与否在石头上,调用一下isFoodOnStone();问题基本解决,同样测试运营,又会发现小问题,有时候食物会在四回头上显示一下,在蛇移动一下之后再重新生成新食物,这是由于生成食物和蛇移动是在同一种线程中锁产生,有不也许单独为食物创立一种线程,解决此问题就需要先让食物生成一次,循环判断食物与否在石头上,若是,继续重新生成,不是才跳出循环,可以用到do{}while()语句来实现。

最后一种逻辑问题便是蛇吃到石头后,游戏结束:

run办法中while(true)条件需要重新定义,在Logic中定义一种boolean类型变量isGameOver,在move之后加以判断蛇与否吃到石头,是则设立isGameOver为true,while中条件应当设立为!

isGameOver。

吃到石头后,在下一次蛇移动之前判断条件时候便会跳出循环,执行完run()办法体中语句之后,logic线程会自动结束,完毕了游戏结束功能。

到此为止,贪吃蛇游戏基本功能都以实现,做一种标志性存盘解决。

6.增设暂停\开始按钮,实现游戏暂停\开始功能

暂停游戏办法有各种,可以从线程方向去考虑,让游戏暂停可以使用线中waite和notify机制,但是waite和notify机制中必须有各种线程,还必要在同一种锁中才可以唤醒另一种等待线程过于繁琐。

让游戏暂停也即是让蛇不在移动,食物不再随机产生,可以在Logic中设立一种标记变量,定义为boolean类型isSuspend,在蛇移动时候先判断游戏与否为暂停状态,暂停状态步调用move办法,实现游戏暂停效果。

考虑好暂停逻辑之后,可以做暂停效果了,先在主函数中创立JButtionsuspendButtion按钮,将暂停按钮suspendButtion添加到JFrame中,JFrame默认布局管理器为边界布局BorderLayout,为了不覆盖本来显示面板,可以在jf.add(),中传入两个参数,suspendButtion,BorderLayout.NORTH,在Frame最上边添加一种按钮。

为按钮添加监听器也采用匿名内部类办法来实现,suspendButtion.addMouseListener(newMousListener(){}),实现未创立功能函数,重要为监听器添加单击事件监听,在mouseClicked()函数中设立单击后变化logicisSuspend值为!

isSuspend。

暂停\开始按钮已添加完毕,功能也已实现。

测试没什么问题继续背面辅助功能添加。

7.增设“开始新游戏”按钮,并可以在游戏时重新开始游戏:

先考虑开始新游戏思路,开始新游戏之后蛇位置会被初始化,食物被初始化,地图被初始化,线程需要被重新启动,有了这些基本思路后开始实现功能,一方面是创立按钮JButtionrestarButtion,将按钮添加到JFrame中,为restarButtion添加监听器,监听器添加同样采用创立匿名内部类办法创立,restarButtion.addMousListener(newMoustener(){}),实现功能函数mouseClicked();函数中初始化logic,调用函数logic.init()。

初始化完毕之后创立新线程,Threadt=newThread(logic),启动线程t.start();测试新加功能效果。

当游戏结束之后,单击“开始新游戏”按钮,游戏会重新开始。

在游戏过程中不小心单击了一下重新开始按钮,游戏依然重新被创立,但速度会被加快,再次单击重新开始游戏,速度更快,寻找问题根源,当咱们重新开始游戏时候,logic对象被初始化,创立了新线程,可是本来线程并没有结束,两个线程操控仍旧是同一种对象,相称于在同一段时间内,调用了两次move()函数,因而在restar时候应当对线程进行判断,判断线程与否结束,借用之前标记isGameOver若是游戏结束话,觉得着线程结束,再重新创立新线程,启动线程。

若是游戏还没有结束,意味着本来线程还没有结束,就不需要创立新线程,只需对logic进行初始化即可。

在对程序进行测试,在开始游戏之前点击一下暂停游戏,在点击开始新游戏按钮,蛇不会动,只有再次点击暂停\开始按钮游戏才会被启动,这有违正常操作习惯,需要在点击开始新游戏按钮功能中强制将isSuspend设为false。

到此程序除了框架之外也有往常游戏最基本功能,再做一标志性存盘解决。

8.为游戏添设不同关卡:

一方面创立一种关卡信息类StageInfo,这个类用于存储关卡信息,应当具备变化关卡功能,通过传入不同关卡参数,创立不同关卡。

同样是解决逻辑一种类,与Logic放在同一种包下,至于Logic与StageInfo两个类之间关系是Logic解决StageInfo还是相反解决方式都无所谓,这里采用让StageInfo解决Logic,那么StageInfo中应当创立Logic实例对象,不同关卡之间区别重要是地图和蛇移动速度不同,依照前面石头类设立7个地图把关卡设为7关,关卡没提高一种层次,调用石头类对象产生地图难度加大,在Logic中需要新曾一种speedint型变量用于控制蛇移动速度,将speed传递给Logic中run办法sleep中,通过移动之间线程休眠时间减短与增长控制蛇移动速度,变化关卡只需对logic中snake,stone,food对象赋不同值即可,相称与是初始化StageInfo,变化关卡功能函数命名为init()。

关卡信息解决好,要在游戏中实践需要在框架上添加新按钮“上一关”、“下一关”都用来实现调用不同关卡。

同样添加MouseListener监听器上一关对单击事件解决方式为让StageInfo中stage—然后调用StageInfoinit();下一关对单击事件解决方式为让StageInfo中stage++然后调用StageInfoinit()。

为了游戏美观,在游戏开始之前让界面实现关卡信息,这里借用坦克大战开始信息界面作为游戏开始前关卡信息,在StageInfo中添加drawStage()函数,实现显示一张类似于图片信息,设立背景等自己以为比较好效果。

三、备注:

背面功能在编写程序中尚未实现或者功能还不够完美,这里只阐述实现功能思想,办法,也许会存在局限性之处,待程序完善功能并测试之后详细阐述程序设计环节。

1.为游戏增长背景音乐以及不同场景音频解决:

要为游戏添加音乐,一方面选好所需声音素材,背景音乐选LinkinParkPale;蛇吃到食物时声音选用最进比较流行植物大战僵尸中大嘴花吃僵尸声音;游戏开始\暂停选童年时期玩街机游戏中暂停\开始音效;游戏结束选名为“啊喔”消息提示声音。

选好素材之后,实现声音播放功能。

Javase中解决声音有3种办法,一种是运用Applet类中play()办法,一种是安装sun公司提供专门解决声音视频开发包,尚有一种是运用输入输出流解决,这里选则第三种解决方式,先创立字节型输入输出流,创立一种字节输入输出流缓冲区,由于播放声音与玩游戏是同步进行,这里关于声音解决应当再启动一条线程,同样实现Runnable接口中run()办法,在游戏逻辑类中通过传入不同音频文献来实现不同场景下播放部同声音。

2.实现游戏存盘和读盘功能:

存盘功能实现要考虑需要存储数据,第一条应当是关卡信息,这样在读盘时便可以依照读到数据创立相似关卡地图、速度等信息,第二条应当是当前分数,直接换行存储即可,第三条最复杂应当是蛇身信息,要保存蛇身体每一截坐标,还要存储蛇当前移动方向。

最所需保存数据分析过之后,就该考虑存储方式,由于索要存储数据仅仅是某些简朴数据,数据量还很小,只需要用一种文献存储即可。

接下来便是实现功能,一方面应当创立一种输入输出流,然后将关卡信息、当前分数,当前蛇移动方向按照writeLine()方式写入到信息文献下,关于蛇身体存储,从蛇头到蛇尾依次换行写入,最后关闭文献,关闭流。

读盘与存盘相似,先创立输入流,从存储文献中readLine(),第一行信息应当是关卡信息,将读取String数据转换成int型传给StageInfo,第二行信息应当是当前分数,同读取关卡信息相似将读到数据转换类型传给score,方向也以同样方式得到,到蛇身数据读取了,由于不懂得之前存储是蛇身有多少截,只能加一种while循环以读取下一行与否为空做为循环条件,没读到一次,在存储蛇集合中添加一种Square对象,这样即可实现读盘功能,再在主函数中创立新赋值后logic线程即可实现接着上次存储游戏进度继续游戏。

3.创新模式添加:

新模式规则是依照典型模式逆向思维得到,当蛇吃到食物后,通过蛇消化,会变为石头存在与面板中,蛇长度会减短,直到蛇只剩余蛇头与蛇尾游戏胜利。

功能实现需要重新定义一种解决逻辑类,与logic相似,同样要实现Runnable接口中run()办法,办法中功能与logic基本相似,蛇吃到食物后,食物随机产生,蛇吃到石头后游戏结束,蛇吃到自己身体后游戏结束,不同之处是在判断蛇与否吃到食物解决,蛇吃到食物后,不在蛇身体上添加虚拟一种格子,相反是在蛇尾与食物位置相似时候再次removeLast(),这就需要定义一种oldFood,用来存储刚刚被吃到食物坐标信息,还需在蛇移动一格之后将map[oldFood.getx()][oldFood.gety()]赋值为true,表达食物以变成石头被加载到地图中。

4.游戏中随机生成一种心形食物,吃到心形食物可以多加游戏成绩,心形食物每隔10秒会生成一次,食物在5秒之后会消失,或者在蛇吃到这个食物后消失:

再次创立类Prize,心形食物与游戏关联性较小,令创立新线程比较容易实现,先实现每隔十秒生成一次,定义boolean型变量isBe,每隔十秒生成一次,isBe=true;Thread.sleep(10000);就是每隔十秒给isBe赋值为ture,然后是新食物存在时间只有5秒,5秒内,蛇可以移动5000/speed次,这里判断蛇与否吃到心形食物,没有则让线程休眠speed段时间,然后5000/speed次数--,直到次数变为0,跳出循环,while(time!

=0&&!

snake.isEatPrize){time--};isBe=false。

完毕线程功能,在游戏创立时候创立这个线程即可。

5.完毕所有功能后对游戏综合测试。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1