繁体   English   中英

更优雅的方式在一维数组网格中找到邻居?

[英]More elegant way of finding neighbors in 1D array grid with wrap-around?

假设我有一个像以下一维游戏网格:

1D游戏网格

例如,27以南的单元格将是单元格35,59之南的单元格将是3(因为环绕)。 这可以像这样实现:

var s = spot = 59
var r = row length = 8
var b = board size = 64
var south = (s+r) mod b

好的,现在让我们试着找到另一个东边的细胞。 27以东的细胞是28,而31以东的细胞是24(也是因为环绕)。 我能想到的最好的是:

var s = spot = 31
var r = row length = 8
var lc = left column = Math.floor(s / 8) * 8
var east = lc + ((s - lc + 1) % 8)

这要复杂得多,这让我觉得我错过了一些明显的东西。 有没有更好的方法来做到这一点?

此外,我还没有实现,但我想像找到像东北和东南的对角线细胞更复杂。

出于这个问题的目的,请假设这仅限于1D阵列。 此外,我认为有一个比较明智的解决方案,对于2的幂的电路板尺寸可能更优雅,但最好是该解决方案适用于任何电路板尺寸。

东:

i + 1 - ((i mod 8) div 7) * 8

西方:

(i - 1) +  (((i - 1) mod 8) div 7) * 8
or
(i - 1) +  (((i + 7) mod 8) div 7) * 8
to avoid potential problems with negative dividend modulo in some languages

这是我发现的用于计算东方(在Javascript中)的不同方法的列表:

east = s + 1 - (s + 1 & 7 ? 0 : 8)

east = s + 1 - ((s % 8) / 7 | 0) * 8

east = (s + 1) % 8 == 0 ? Math.floor(s / 8) * 8 : s + 1

east = (s & 0xFFF8) + ((s - (s & 0xFFF8) + 1) % 8)

lc = Math.floor(s / 8) * 8; east = lc + ((s - lc + 1) % 8)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM