螺旋矩阵:由内向外,游戏掉落问题

问题

  • 游戏内怪物死亡掉落一般要求是以死亡点为圆心向周围扩散找到可用点刷新场景道具
  • 画图可以看到这是一个螺旋矩阵问题
  • 以某个点为中心点,周围的坐标都是其相对坐标
  • 要求由内向外,矩阵样式如下代码注释
  • 使用静态变量提前初始化好矩阵,之后遍历矩阵的相对坐标就可以
  • 传送目标点等可用点搜索也可以用这个array

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/*
42 43 44 45 46 47 48
41 20 21 22 23 24 25
40 19 6 7 8 9 26
39 18 5 0 1 10 27
38 17 4 3 2 11 28
37 16 15 14 13 12 29
36 35 34 33 32 31 30
*/

// 坐标点
struct cell {
unsigned x = 0;
unsigned y = 0;
};

static constexpr int __helix_radius = 3;
static constexpr int __helix_size = (__helix_radius * 2 + 1) * (__helix_radius * 2 + 1);
static cell __cell_helix[__helix_size];

static int _helix(int x, int y) {
int t = std::max(std::abs(x), std::abs(y));
int u = t + t;
int v = u - 1;

v = v * v + u;
if( x == -t )
v += u + t - y;
else if( y == -t )
v += 3 * u + x - t;
else if( y == t )
v += t - x;
else
v += y - t;

return v - 1;
}

static bool _init_helix() {
for(int y = -1 * __helix_radius; y <= __helix_radius; ++y) {
for(int x = -1 * __helix_radius; x <= __helix_radius; ++x) {
cell& cpt = __cell_helix[_helix(x, y)];
cpt.x = x;
cpt.y = y;
}
}

return true;
}

static bool __call_init_helix = _init_helix();
------ 本文结束 ------
------ 版权声明:转载请注明出处 ------