3

各エージェントが直線/斜め (8 方向) に移動できる、タイル ベースのゲームを検討します。基本的に、このようなマップは通常の 2D グリッドとして表すことができます。ここで、0 は歩行可能な場所を表し、1 つは歩行不可能な場所を表します (私は Lua を使用しています)。

-- Example : 3x3 sized map
local map = {
 {0,0,0},
 {0,1,1},
 {0,0,0},
}

この時点で、エージェントが来る方向に応じて、タイルの歩行可能性をどのように表現できるでしょうか? つまり、上のセル [2][2] は静的に歩くことができませんが、[1][2] (上) または [2][1] (左) から来る場合は歩くことができますが、たとえば [ 3][2] (下)。

私はこれにいくつかの考えを与えましたが、私には十分にきれいなものを思いつくことができませんでした.

前もって感謝します。

4

1 に答える 1

2

別の 2D グリッドを 1 バイトでオーバーレイします。バイトの各ビットは、可能な入口方向に対応し、1 はその方向から歩くことができることを意味し、0 はそうでないことを意味します。その後、バイナリ マスキングを使用して入力可能性を確認できます。

ほとんどのセルに任意の方向から入力できる場合は、タイルの絶対 ID (X*MaxY+Y など) をキーとしてマップを使用し、入力可能性を示す上記のバイト スキームを使用することを検討してください。これはアクセスが遅くなりますが、必要なスペースは少なくなります。

たとえば、方向を次のようにレイアウトします。

Bit #      X offset  Y offset
123        -1 0 1    -1 -1 -1
4 5        -1 0 1     0  0  0
678        -1 0 1     1  1  1

北東方向に行くと、これはビット #3 に対応します。上記の値をビット マスクに変換することで、マスキングを実行できます。

1   2   4
8      16
32 64 128

以下がtrueを返す場合、方向から入ることができます

Enterability(CurrentX+Xoffset(Dir), CurrentY+Yoffset(Dir)) & BitMask(Dir)

(申し訳ありませんが、私は Lua をその言語で書くのに十分な知識がありません)

編集

で、私の行き方などは上記の通りで、北からしか入れない広場が欲しいとします。これを行うには、ビット #2 を設定します。

Enterability(X)=2

北と南西の両方から入ることができる正方形が必要な場合は、次のようにします。

Enterability(X)=2 | 64

ここ|で、ビットごとの OR 演算です。

正方形を西以外のどの方向からでも入力できるようにする場合は、次を使用します。

Enterability(X)=(~8)

~not操作はどこにありますか。

ドアを閉める必要がある場合、たとえば東に、そのビットの設定を解除できます。

Enterability(X)=Enterability(X) & (~16)

ドアを再び開くには、次を使用します。

Enterability(X)=Enterability(X) | 16

または、より簡単に、

Enterability(X)|=16

~16、16 を参照するビットを除いてすべて 1 のビットフィールドを生成します。これを AND 演算子 ( &) と共に使用すると、16 を参照するビットを除くすべてのビットがオンのままになります。

また、16 進数のアドレス指定の方が便利な場合があることにも注意してください。

 Decimal          Hexadecimal
1   2   4       0x1  0x2  0x4
8      16   =   0x8       0x10
32 64 128       0x20 0x40 0x80
于 2012-10-15T10:53:26.277 に答える