2015-02-23 72 views
4

为了好玩,我正在实现一个贪吃蛇游戏,我已经成功实现了蛇,它的动作和蛇的增长因为它吃了一个苹果。贪吃蛇游戏 - 如何计算下一个苹果位置

要计算苹果的位置我正在以下步骤:

  1. 创建一个新的苹果对象
  2. 创建随机坐标(X和Y,游戏容器边界之间),为苹果
  3. 检查苹果的坐标是否等于其中一个蛇形块坐标
  4. 如果步骤#3为TRUE,则重新计算苹果的位置,否则在游戏容器中绘制苹果

不幸的是,我发现,这个算法是非常弱的..让我们说我有一个10×10的比赛容器,红色正方形是苹果,绿色广场是我的蛇头(游戏初始状态)

enter image description here

随着比赛的进行蛇吃越来越多的苹果,增加其长度,留下少空单元格将一个苹果

enter image description here

现在假设蛇REA吃苹果时,长度等于99。这意味着有只有一个广场左侧放置下一个苹果。我的算法(显然这是最糟糕的情况)可能会永远存在,以便随机化正确的值,因为它放弃了已经被蛇的头部或尾部采集的任意随机位置,而不是关心随机化一个范围内的新位置只有“空细胞”,而是在整个10×10的游戏画布上随机化。

我应该如何着手解决我的busillis?你能给我任何关于我可以使用的好算法的建议吗?

谢谢

+4

我现在能想到的最简单的解决方案是制作一个自由坐标列表并从中随机选择它们? – mkabanen 2015-02-23 23:15:47

+0

@kabanen:实际上这是最好的解决方案:-) – Bergi 2015-02-23 23:17:32

+0

我认为这不是最佳的,因为每次蛇移动时都必须刷​​新此列表,删除占用的单元格(我必须扫描列表才能找到单元格)并添加释放的。我错了吗? – BeNdErR 2015-02-23 23:17:42

回答

5

正如你说的意见,我能想到的最简单的解决方案是让自由坐标列表,然后刚刚从他们随机选择。 只有在需要时(您需要添加苹果时),您才可以计算自由坐标。

+0

您也可以使用常规方法(随机坐标),直到蛇的长度不超过某个阈值(例如:10x10网格的长度<= 50),然后切换到更精细的方法。 – ciamej 2015-02-23 23:55:02

+1

这对于Snake游戏的这种小例子来说并不重要,但从数据结构的角度来看,最好使用Set数据结构而不是列表。每次蛇移动时,您都必须执行添加操作和删除操作,但它们都将是O(1)或O(log n),然后当您需要新的Apple位置时,计算将会很简单从预先计算的集合中随机选取1个元素。 – Shashank 2015-02-24 01:14:40