蛇的数据结构
结合我们自己的应用场景可以发现,贪吃蛇不断变长小经常做插入操作,而且我们不需要随机去访问贪吃蛇中的某一个节点。因此选择LinkedList。
- 棋盘的方格是否被贪吃蛇覆盖
- 食物的位置在哪个方格
- 贪吃蛇目前的移动方向
一个Grid创建后,它的长宽就是固定不变了,方格的覆盖可以用一个boolean类型的二维数组来表示,如果一个Node被贪吃蛇覆盖,则对应坐标的数组元素为true,否则为false。
随机创建食物,即随机生成食物的X坐标和Y坐标。我们可以使用Java提供的Random类来生成随机数。
这里需要注意两点:
- 生成的X坐标和Y坐标必须在有效的范围之内,不能超过棋盘大小
- 食物的位置不能喝贪吃蛇的位置重叠
在Sanke的move方法中,我们只是让贪吃蛇进行移动,移动方向是否有效以及移动后游戏能否继续并没有判断,我们把这些逻辑都放到Grid类的实现中,由Grid类来驱动Snake的move操作,Snake只管执行命令即可。
每一次移动可以认为是游戏的下一步,因此我们将这个函数定义为nextRound()。
如何移动后能够继续,返回true,否则返回false。
1 | public boolean nextRound() { |
头部位置无效有两种情况:
- 碰到边界
- 碰到自己