贪吃蛇思路总结(参考天码营)

来源:互联网 发布:log4j2 java api 编辑:程序博客网 时间:2024/05/21 18:35

1.总体设计思路


我们知道,Java是一门面向对象的语言,设计贪吃蛇游戏时。首先能想到的两个对象,一条蛇和一个棋盘,同时用户如果需要控制蛇的移动,就需要有一个显示和接收窗体。想到这些并不难,但是设计一个优秀系统的关键确实表达虚拟概念的类的创建。这里通过GameController连接SnakeApp和Grid。该设计是一个典型的MVC模式,
MVC模式(Model-View-Controller)软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller):
  • Controller——负责转发请求,对请求进行处理:对应于GameController
  • View——负责界面显示,对应于SnakeApp
  • Model——业务功能编写(例如算法实现)、数据库设计以及数据存取操作实现,对应于GridSnake

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的使用

这里涉及了多线程的使用,之前做坦克大战时听学长讲过,不过很快便忘光了,这里要标记一下,以后会经常用到。







原创粉丝点击