瓷砖运动范围产生模式?

时间:2012-11-08 13:02:07

标签: algorithm design-patterns tile

我正在做一个基于平铺的游戏。我尝试创建一个方法,返回一个我的角色可以根据x,y坐标和移动限制移动的数组。

例如,如果我输入currentPosition:(3,3)moveLimit:1

然后它应该给我回来((3,2),(3,2),(3,4),(4,3))

如果我输入currentPosition:(3,3)moveLimit:2

那么它应该回((3,1),(2,2),(3,2),(4,2),(1,3),(2,3),(4,3), (5,3),(2,4),(3,4),(4,4),(3,5))

我计划通过在x和y上使所有可能的-1和+1来使用递归方法。但这是非常低效的,因为可能会发生很多重复的情况,比如+1然后-1比-1然后+1。

任何人都知道这有什么好的模式吗?

非常感谢你。

2 个答案:

答案 0 :(得分:1)

让我们首先定义问题以及您正在寻找的内容:

k表示为距离,将(x,y)表示为原点(来源)。

f((x,y),k) = { (a,b) | abs(x-a) + abs(y-b) <= k } 

这意味着,一个包含所有点(a,b)的集合:abs(x-a) + abs(y-b) <= k(这是距离限制)

现在,要获得所有相关元素,您可以这样做:

moves((x,y),k):
  for i=0 to k+1: //number of steps in the x axis, some number between 0 to k inclusive
     //number of steps in the y axis, some number between 0 to k-i inclusive:
     for j=0 to k-i+1: 
        if (x-i,y-j) is in range: output (x-i,y-j)
        if (x+i,y-j) is in range: output (x+i,y-j)
        if (x-i,y+j) is in range: output (x-i,y+j)
        if (x+i,y+j) is in range: output (x+i,y+j)

注意:

  1. 这可以保证条件,因为您检查了两个轴中的所有可能步骤,并限制为abs(a-x) + abs(b-x) <= k
  2. 在这里“在范围内”是一个健全性检查,确保你没有超出界限(例如,假设你只需得到正值,得到x值为-1。

答案 1 :(得分:0)

尝试从元素(向上,向左,向下,向右)计算长度“moveLimit”的所有组合。

E.g。

UUU
UUL
UUD
UUR

ULL
ULD
ULR

UDD
UDR

URR

LLL
...

这应该已经减少了很多计算次数。您仍然可能会得到导致相同位置的不同移动组合。