プレーヤーが作成した構造が3Dブロックベースのゲームのテンプレートと一致するかどうかを判断する


8

免責事項:これは恐ろしいMinecraftスタイルの質問の1つですが、データ構造とアルゴリズムの質問のほうが多いと思います

私は3Dデータ構造に本当に慣れていないので、3Dブロック構造を保存および照合するための最良の方法を考えています。

現在、プレイヤーは任意のスペースにブロックを配置でき、これらのブロックが事前定義された構造と一致すると、イベントが発生します。私が現在行っている方法は、プレーヤーがブロックを配置するときに、ゲームが再帰的に各隣接ブロックをチェックして、x、y、z座標が最も低いブロックを見つけ、そのブロックをルートブロックにします。次に、ルートブロックに基づいて残りのブロックをチェックし、特定のテンプレートと一致することを確認します。問題は、テンプレートが複雑になるにつれて、私のコード(非常に非効率的)も複雑になることです。

これを行う最善の方法は、構造を定義するあるタイプのマトリックスを保存し、プレーヤーがブロックを配置するたびにマトリックスと照合することです。このタイプの問題に一致するデータ構造/アルゴリズムはすでにありますか?


1
例として、Minecraftポータルのような構造をテンプレート化する方法を考えていますか?
deceleratedcaviar

1
@ダニエル実際には、それは良い例だと思います。しかし、私の目標は、任意に大きく複雑な構造にすることです。ポータルはかなりシンプルです。
WillP '09 / 09/28

1
答えではなく、単なる考えです。構造が任意に大きくなり、ターゲット構造のリスト(一致を見つけるために検索する必要がある)が信じられないほど大きくなる場合、これはテキストや音声の認識などのパターン認識の問題になります。次に、ブルートフォースの比較から、ターゲット構造でトレーニングされた隠しマルコフモデルなどの統計的手法に移行します。それはとてもクールでしょう。
ピーター・ミューラー

@はりかわしそうだね。私の目標は天文学的に大きなものではありませんが、とにかくそれを試すことができるようにとにかくそれをするかもしれません。ありがとう!
WillP、2011年

回答:


10

正直なところ、私は簡単な解決策をとります。

構造を定義する行列を作成します。ブロックが変更されるときはいつでも、そのマトリックスを、新しい構造を作成した可能性のあるすべての場所に適用してみてください。これは幅*奥行き*高さの場所になります。これは、プレーヤーが構造上の任意のポイントを終了した可能性があるためです。ただし、これらの場所のほとんどは、最初のチェックが失敗したときに早期終了するため、悪くないはずです。

基本的に、3Dマトリックスを取得し、それを別の3Dマトリックスと比較します。

ここから、実行できる完全にオプションの最適化の束があります。たとえば、あなたの構造が極めて希薄である場合-つまりプレイヤーが一番上に球を持つ背の高いタワーを構築しているが、塔の底部は木々に囲まれている場合、あなたは気にしないでください-あなたはにそれを回すことができ、リストの行列の代わりにブロック。(マトリックスからリストを生成します-マトリックスを直接維持する方がはるかに簡単になります。)

超賢くなりたい場合は、構造をブロックタイプに分割してください。プレーヤーがブロック1、2、3を変更したことがわかっていて、構造を座標0、0、0に配置するには、ブロック1、2、3が黒曜石である必要があり、ブロック1、2、3が木材であることがわかっている場合、ブロック1、2、3を試す必要もありません。プレーヤーが特定のタイプのブロックを配置したことを前提として、構造に可能なすべてのオフセットを生成します。次に、プレーヤーがそのブロックを配置したら、事前に生成された可能なオフセットを確認します。

しかし、真剣に、これはすべて最適化です。マトリックスを作成し、そのマトリックスを世界の総当たり式と比較してください。あなたがMinecraftyで何かを作っていると仮定すると、人々は実際にはそれほど多くのブロックを配置しません-毎秒数ブロックです。何百もの巨大な構造物がない限り、簡単にテストできます。


3
あなたが正しい。ブルートフォースは、パフォーマンスの大きな問題にはなりません。時期尚早の最適化の罠に陥ったような気がします。あなたの洞察をありがとう。
WillP '09 / 09/28

0

さてあなたは興味深い問題を思い付きます。次のようなものをお勧めします。ブロックをピクセルとして使用し、ピクセルごとの衝突検出を実行します。真の衝突を返すには、すべてのブロックが一致する必要があります。

これは正常に機能しますが、オブジェクト/ブロックが変更されたときにのみこれを実行するようにしてください。そのため、変更をオブジェクトチェッカーに渡すための単純なイベントシステムをお勧めします。これにより、確実にアルゴリズムを使用できます。これにより、そのオブジェクトに何をさせたいかが決まります。また、アルゴリズムを実行する前に、高さと幅を確認することをお勧めします。高すぎないか高すぎると、明らかに一致しません。

データ構造に関して言えば、単純なベクトルでも、おそらくカスタムデータ構造でもかまいません。

興味深い質問です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.