电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

[指南]毕业设计思路

14页
  • 卖家[上传人]:pu****.1
  • 文档编号:495709943
  • 上传时间:2023-09-19
  • 文档格式:DOC
  • 文档大小:64.50KB
  • / 14 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、指南毕业设计思路Java编写贪吃蛇游戏思路一、 需求分析: 1. 游戏以经典贪吃蛇默认规则设计需要蛇能够按照给定的方向每隔一段时间自动移动;方向键“?”、“?”、“?”、“?”可以控制蛇移动的方向,蛇每吃到一个食物后身体长度增加一格,原有食物消失,再随机生成一个不再石头上的新食物;石头即为地图,蛇吃到石头后游戏结束。2. 为了使游戏更加具备娱乐性和挑战性,增设关卡,随着关卡级别的升高,蛇移动速度加快,蛇吃到食物的难度加大,吃到一定数量的食物即可过关进入下一个关卡;为蛇吃到食物后添加声音效果,增设背景音乐,可以控制背景音乐的开关; 3. 为了区别与经典模式的不同,游戏增加新的规则模式,新的模式规则中,初始化的蛇长度一定,蛇吃到食物后,食物随机产生一个新的食物,原来的食物经过蛇的消化后变为石头固定在原处不能移动。二、 设计思路: 1. 首先考虑所需要的总体框架 贪吃蛇游戏主题应为蛇,需要创建蛇这个类命名为Snake,还要有食物类命名为Food,石头类命名为Stone,显示面板类命名为DisplayPanel,逻辑处理类命名为Logic以及主函数类命名为MainOfGreedySnake。2

      2、. 搭建类与类之间的关系 蛇吃食物,食物在被蛇吃到后随机产生新的食物,食物不能在石头上生成,关系复杂,我们可以将这些关系在逻辑处理类Logic中搭建,这样即降低了上面三个类之间的耦合性,又方便以后对辅助功能的添加。蛇,食物,石头需要在显示面板中显示出来,而三者又在逻辑处理这个类Logic中做逻辑关系运算,我们可创建自己的显示面板类DisplayPanel,用逻辑处理类Logic创建对象作为参数传递给显示面板,使得蛇,食物,石头以及显示面板直接的关系更加简单。 3. 添加简单的测试功能 首先需要创建主函数,主函数中创建逻辑处理类Logic的实例对象,创建自定义的显示面板对象DisplayPanel,将逻辑处理类Logic的实例对象作为参数传递给显示面板DisplayPanel的实例对象中,显示面板需要寄托在Frame框架上,这就需要在主函数中创建一个JFrame对象,然后将自定义的显示面板添加到JFrame对象上。 接着是在每个类中添加一个测试用的功能函数,简单的打印一条输出语句,在蛇类Snake中,创建一个功能函数打印“蛇类被加载”,食物类,石头类,逻辑处理类,显示面板类中添加同样的功

      3、能,在逻辑处理类中定义蛇,食物,石头对象,创建构造函数参数传入蛇,食物,石头类型的对象;自定义的显示面板继承JPanel类,定义逻辑处理类的对象,创建构造函数传入逻辑处理类的对象。 通过调用类中的功能函数来测试,确保他们之间已经建立联系。4. 类中填充功能及参数 首先分析蛇: 图2-4.1 我们把显示面板划分为格子,每个单位的蛇身占一个格子,食物,石头同样,通过抽取定义一个格子类命名为Square;蛇的身体由多个格子组成,需要一个链表集合存储,定义一个LinkedList类型的集合命名为snakeBody,存储类型为格子类型Square的对象;蛇有一个长度,定义一个int型的变量Length存储长度,定义一个int型的direction变量控制蛇移动的方向;定义一个boolean类型的变量iseatfood,来标识蛇是否吃到食物;定义一个boolean类型的变量iseatstone来标识蛇是否吃到石头; 蛇的功能有移动功能,创建功能函数move(),关于蛇移动,我们可以让存储蛇身体的集合snakeBody添加一个蛇头,去掉一个尾巴来实现,蛇头添加的位置又应该由蛇移动的方向控制,因此在添

      4、加蛇头之前应该判断蛇头的方向,如果蛇向上移动,direction应为1,我们让改变之前的snakeBody调用addFirst()功能添加蛇头,里面的参数应为改变之前的蛇头的纵坐标减一个格子,向下,向左,向右原理相同。蛇已更改具有改变方向的功能,以便于后面控制蛇移动的时候改变方向,定义函数changeDirection(),传入int型的方向值。蛇还应该有判断是否吃到食物的功能,定义功能函数isEatFood(),判断蛇是否吃到食物只需判断蛇头的坐标是否和食物的坐标相同,这里有一个小问题,蛇类中没有定义食物Food类型的引用,判断时还要有食物类型的对象,为了降低蛇与食物之间的联系,不得不传入一个Food 类型的参数。 图:2-4.2 蛇应该有判断是否吃到石头的功能,由于石头是一个比较大的集合,若沿用判断是否吃到食物的方法必将浪费大量的资源,在后面设计石头的时候我们可以用一个boolean类型的二维数组来存储一组石头命名为map,是石头设置这个坐标为true,不是则设为false,这样判断蛇是否吃到食物就较为简单,只需判断蛇头的坐标作为石头数组时是否为treu即可。如图2-4.2所示,也

      5、即是直接反回mapsnakeBody.getfirst().getx()snakeBody.getfirst().getx()即可。蛇的另一个功能是判断蛇是否吃到自己的身体,需要定义一个功能函数isEatBoody()判断蛇是否吃到身体同判断是否吃到食物相同,只需判断蛇头的坐标与蛇身的坐标是否相同,为了减少CPU的工作量,可以稍微优化一点,判断蛇头与蛇身的坐标是否相同时从第4截身体开始判断即可,因为不管蛇怎么移动都不会与第二截、第三截身体相撞。蛇要在显示面板中显示,按照面向对象的思想,蛇要在面板中显示身体,设计到的两个对象,蛇、面板,显然显示这个动作蛇自身应该最具权威性,蛇对自己的属性最了解,就应该把显示蛇这个功能定义在蛇这个类中,创建功能函数drawMe()给它传递一个画笔Graphics g,从蛇头到蛇身依次画出每个格子。 最后考虑到以后重新开始游戏,以及多个关卡的问题,这里先定义好一个蛇初始化的功能函数init()。 关于蛇的分析先到这里。 其次是对食物的分析: 食物在游戏中自始至终只会有一个,只需定义一个Square对象即可,命名为food;由于后面蛇吃到食物后要随机生成一个新

      6、的食物,需要用到Random类中的随机函数,这里事先定义好一个Random ran;确定好参数后确定功能函数,首先应该是判断食物是否被吃掉,定义函数isFoodEaten();同isEatFood相似。 其次食物被吃掉之后会随机产生一个新的食物,定义函数setFood(),产生新食物的瞬间,旧食物已经消失,没有必要在去创建一个food对象,只需将food中的坐标改变一下即可,x坐标传入一个随机的参数,y坐标传入一个随机的参数,显示面板大小先确定划分为30*30个格子,x坐标和y坐标应该在029之间,只需简单的一句话x = (int)(ran.nextFloat()*30),通过Random类获取01之间的小数,乘以30得到030之间的数,在强制转换为int类型的数传递给x,y;最后同蛇相似,食物也应该在面板中显示,定义显示的功能函数drawMe()传入参数Graphics g。 再接着对石头分析: 在对蛇分析的时候依然考虑到石头的存储,定义一个boolean类型的数组记录是否画石头,boolean map = new boolean 3030;考虑到以后地图的改变,在创建石头的时候应该

      7、设计不同的地图,根据传入参数的不同,创建不同的地图,定义构造函数Stone();传入一个int类型的参数,根据参数创建不同的地图;地图设计较为简单,利用switch()case:判断需要创建何种地图。创建地图既是在map数组中不同的位置设置成true。 同蛇与食物相同,石头类应该具有显示功能drawMe(),传入参数Graphics g。 完善以上功能之后就可以在逻辑处理类Logic中先搭建简单的处理关系,以保证蛇,食物,石头可以显示出来;Snake snake = new Sanke();Food food = new Food();Stone stone = new Stone(1);先显示地图1作为测试。 在显示面板类DisplayPanel中创建构造函数传入Logic的实例对象;重写paint方法,paint()方法中调用logic.Snake.drawMe() logic.Stone.drawMe() logic.food.drawMe() ;运行可显示效果,看到蛇,食物,石头已经显示到面板中。 5. 逻辑关系处理 做好的蛇还不会移动,接下来就来实现此功能: 蛇要在每隔一段时

      8、间移动一个格子。蛇要移动,还要在没有死亡之前一直移动,主函数所启动的主线程的任务是启动窗体以及在内存中创建好所需要的资源,这里必需另开一个新的线程。开启线程的方法有两种,这里选择实现Runnable接口的方法,让Logic implements Runnable,实现run()方法,由于蛇要不停的运动在蛇的move方法之外加入while(true),蛇每隔一段时间会自动移动一格,在move方法之后添加Thread.sleep(300),经过多次运行测试得出的时间;在主函数MainOfGreedySnake中创建线程thread t = new Thread(logic);运行观察效果,会发现蛇依旧不会移动,这是因为显示面板中的paint函数需要重新被调用才会重新绘制图形,在DisplayPanel的paint最后加上repaint();再次运行,蛇已经可以自己移动。 现在的蛇依然可以移动,但不受控制,会移动出边界,因此需要在蛇移动之后判断蛇是否移出边界,将此功能封装成函数,显然应该定义在蛇类中,命名为isOverBand(),函数所需的功能即判断蛇头是否移出边界,若是则将蛇头的坐标更换

      9、为另一边界的坐标,实现了蛇在规定范围内自动移动。 蛇可以自动移动,但仍然还不受控制,后面将实现键盘控制蛇移动方向:键盘控制蛇移动方向,也即是每按下一个键,通过某种响应,让蛇的方向改变,很容易想到Java GUI开发中提供的事件监听机制,但问题在于事件监听机制是针对GUI组件设计的,这就需要将蛇的方向和主函数创建的JFrame联系到一起,主函数中需要创建Logic实例对象,Logic中有创建蛇对象,可以直接在主函数的JFrame上添加监听器,关于监听器的创建这里为了以后添加更多功能不至于关系复杂化,采用匿名内部类的方法为JFrame添加监听器,JFrame jf = new JFrame();jf.addKeyListener(new KeyListener(),),监听器里面重写keyPressed()功能函数,利用switch(),case,语句判断方向键调用logic.snake.chageDirection()方法改变方向。 到这里程序调试运行方向以然可以控制,但按照规定,蛇不能向相反方向运行,在改变方向的时候应该做一个判断,新传入的方向值若和snake对象中方向值相同的话,snake方向值不做改变,加以判断之后,蛇的运行轨迹同想象中的运行规则几乎没有差别了,但是还有一个小小的bug存在,就是如果蛇向下移动的话,在下一次移动触发前,先按下向左,在按下向上,蛇还会向相反的方向移动,对于这个问题的解决首先要找到问题的根源,如果蛇向下移动的时候,先按下向左的方向,蛇的direction会被赋值为向左,但在蛇下一次移动之前,又按下向上的方向键,在判断方向的时候,向上的方向与向左的方向值不是相反方向,又会被赋值,这就导致了相反方向仍然会存在的可能性,关于此问题的解决,可以定义两个方向值,一个用于保存蛇移动之前的方向,命名为oldDirection,一个用于保存蛇移动之后的方向,命名为newDirection,在做方向判断的时候,拿新来的方向跟oldDirectio

      《[指南]毕业设计思路》由会员pu****.1分享,可在线阅读,更多相关《[指南]毕业设计思路》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    监控施工 信息化课堂中的合作学习结业作业七年级语文 发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.