2017-11-23 11 views
3

はのは、私は次のような1次元ゲームグリッドを持っているとしましょう:ラップアラウンドを使用して1Dアレイグリッドで隣人を見つけるよりエレガントな方法はありますか?

1D game grid

例として、南27のセルは、南59のセル35、およびセルになりますので、ラップの(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の累乗である基板サイズに対してよりエレガントなビットワイズのソリューションがあると思いますが、ソリューションはどのボードサイズでも機能することが好ましいでしょう。

+0

最初の言語を選択してください。 – Berger

+0

@Bergerどの言語が質問に答えても気にしないことを指定する方法はありますか? –

+0

あなたのコードが動作し、最適化を目指すこのような質問は、http://codereview.stackexchange.com/でよりよく尋ねられます。 – charlietfl

答えて

1

東:

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 
+0

賢い!ありがとうございました。 –

0

ここで私は(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) 
関連する問題