我正在尝试制作蛇克隆,我希望蛇的宽度为5个左右,并以1个像素的增量移动。这意味着蛇可以比一条蛇宽更接近自身。当随机生成食物时,这会使事情变得复杂,食物将是5x5像素的正方形。我需要/想要一种算法,将随机生成减少到不包含蛇片的5x5正方形。
部分问题在于,由于食物是5x5,因此必须检查食物中每个像素的碰撞检测,以查看蛇是否部分位于食物中。这给我留下了两个问题
问题
如何在随机生成食物时减少搜索空间?
我考虑过做一个四叉树,细分空间,直到分区小于我想放的食物。我还考虑过使用awt' Rectangle
,并确定食物生成的位置是否包含在构成播放器的矩形列表中。
我能想到的最佳解决方案是生成一个包含所有可能矩形的2D数组,其左上角为索引值。然后生成另一个2D数组,将每个像素映射到包含它的每个矩形,或者甚至只是起始点,不需要整个矩形(每个25个)。然后在每次移动后,更新头部和尾部的角落地图,标记它所占据的每个映射矩形。然后使用映射的角阵列进行更简单的随机搜索(这会将其缩小到1x1像素搜索空间)。
我要避免的主要问题是当蛇占据可玩空间的90%时,任何基本的搜索 - 失败 - 重复系统都需要花费相当多的时间才能完成,最糟糕的情况是,永远不会产生食物方。
答案 0 :(得分:0)
7个月后,我有一个解决方案。我还没有测试过,因为我还是要实现它。
我处理蛇体的方式是由左上角X,Y坐标,宽度和高度定义的矩形列表。
我能做的是从整个棋盘开始创建一个8级树,然后将每个蛇部分放入树中,左上角偏移苹果的大小。当放置一个零件时,我可以根据蛇的4个角,4个边和中心将板分成9个部分。忽略包含蛇的板部件和尺寸<= 0的板部件,我可以将它们放入树中。
由于蛇形部分已根据苹果大小进行了调整,因此非占用叶节点内的任何点都可用于放置苹果