javascript - 使用环绕在一维阵列网格中查找邻居的更优雅的方法?

标签 javascript java c# arrays algorithm

假设我有一个如下所示的一维游戏网格:

1D game grid

例如,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(也是因为wrap-around)。我能想到的最好的是:

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)

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

此外,我还没有实现,但我想找到像东北和东南这样的对 Angular 线单元格会更加复杂。

为了这个问题的目的,请假设这仅限于一维数组。此外,我想有一个按位解决方案,它对于 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 - 使用环绕在一维阵列网格中查找邻居的更优雅的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47458895/

相关文章:

c# - 为什么 ScrollViewer 属性不影响标签?

javascript - 选中复选框后执行两次函数

javascript - 后台 HTML 监听器

Javascript内容可编辑,防止没有文本时的<br>

java - 为什么 GUI 不以观察者模式更新?

c# - 以编程方式修改端点 ReaderQuotas

javascript - 如何检查数组下是否存在值且差值小于 0.000002

java - 弗林克 SQL : Joining Tables with timestamp in pure SQL syntax

java - 在 C++ 中实现观察者模式

c# - 什么控制着C#中未等待的异步任务的数量?