贪吃蛇思路总结(参考天码营)
2017-09-06 09:49
148 查看
1.总体设计思路
我们知道,Java是一门面向对象的语言,设计贪吃蛇游戏时。首先能想到的两个对象,一条蛇和一个棋盘,同时用户如果需要控制蛇的移动,就需要有一个显示和接收窗体。想到这些并不难,但是设计一个优秀系统的关键确实表达虚拟概念的类的创建。这里通过GameController连接SnakeApp和Grid。该设计是一个典型的MVC模式,MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller):
Controller——负责转发请求,对请求进行处理:对应于
GameController
View——负责界面显示,对应于
SnakeApp
Model——业务功能编写(例如算法实现)、数据库设计以及数据存取操作实现,对应于
Grid和
Snake
2.类的完善
贪吃蛇的方向:使用枚举来定义方向
public enum Direction { UP(0), RIGHT(1), DOWN(2), LEFT(3); }
关于Java中枚举的学习,参考大神博客java enum(枚举)使用详解 + 总结 - ido - 博客园,这里定义了enum的value属性,同时添加了一个私有的成员directionCode作为方向
的整数代码,成员方法directionCode()使得外部可以访问到方向的整数代码,巧妙之处是大大方便了判断贪吃蛇移动方向的合法性。注意枚举的构造函数不能用Public修饰。
public boolean compatibleWith(Direction direction) { return Math.abs(direction.directionCode - directionCode) != 2; }
直接通过Value的值来判断方向是否合法。小知识:enum一个普通的 class,它们都可以定义一些属性和方法,不同之处是:enum 不能使用 extends 关键字继承其他类,
因为 enum 已经继承了 java.lang.Enum(java是单一继承)。
定义贪吃蛇:集合类的使用
贪吃蛇是由一个一个的节点组成的,表示节点状态的就是它的X坐标和Y坐标,这里用集合类List来保存所有节点,LinkedList参考C语言中的链表。比较ArrayList和LinkedList:
ArrayList:通过下标随机访问元素快,但是插入、删除元素较慢
LinkedList:插入、删除和移动元素快,但是通过下标随机访问元素性能较低
贪吃蛇不点变长经常做插入操作,而且我们不需要随机去访问贪吃蛇中的某一个节点,这里选择LinkedList。
public class Snake { private LinkedList<Node> body = new LinkedList<>(); }经过Snake的定义,就可以考虑贪吃蛇的行为了,吃和移动,这里描述一下Snake移动一格的处理:在头部增加一个Node,尾部删除一个Node。
Grid类定义关键算法
比较重要的有蛇身的创建和食物的随机生成,如果进一步改进这个游戏的话可以在蛇的移动速度和食物的生成位置上做文章,比如增加难度系数可以提高蛇的移动速度,食物尽量在墙壁边缘生成,还可以增加双人模式,多食物模式调整具体细节,增加积分栏,不同位置增加不同积分等等,待基础知识掌握牢固可进一步优化。
值得一提的是,这里定义了一个数组status,初始化每个元素为false,蛇身每个节点坐标为true,Snake的每次移动,都要判断这次移动是否碰撞到自身或者墙壁,status
作用就是只要Snake的头结点移动到true的坐标,就说明贪吃蛇碰撞到了自身,游戏结束。
用Swing和Graphics编写游戏界面
这方面暴露了我的短板,之前没有写过类似程序,所以在参考代码时力不从心,大部分是原文摘抄,以后一定要多了解一下这部分内容,至少自己能独立创建窗体,显示界面。
用GameController协调界面与模型
调用KeyListener接口实现键盘接听。让贪吃蛇自己动起来:Thread的使用
这里涉及了多线程的使用,之前做坦克大战时听学长讲过,不过很快便忘光了,这里要标记一下,以后会经常用到。相关文章推荐
- 豆瓣项目的思路总结
- 内存溢出的解决思路(总结的不错)
- 黑马--程序员 总结:多态变量,在编译和运行期间,都参考的是左边(引用类型所属的类)
- KMP算法思路总结
- 基于maven的spring boot项目 部署到tomcat出现js文件失效处理思路总结
- 财智理财7破解思路与总结
- 企业架构研究总结(11)——联邦企业架构之FEA及参考模型(上)
- HEVC参考软件代码总结
- MySQL分库分表总结参考
- 调试Linux驱动Bug的思路总结
- MySQL的安装与使用中问题总结过程中的参考网址
- 操作系统性能分析思路总结
- 黑马程序员_银行业务调度系统思路及总结
- HM6.01 (HEVC参考软件)代码总结(一)
- 适易信息管理系统架构、配置实现增删改查思路及总结
- java程序员面试笔试宝典之算法思路总结
- 一道淘汰85%面试者的百度开发者面试题——解题、参考答案和优化思路
- 无线(仅WIFI)攻击思路总结
- [29期] 学习总结,关于循环的思路
- 关于CentOS防火墙总结(其他Linux发行版可参考)