特定のエリアの建物を手続き的に生成する


15

私とチームは、ゲームの開始時にプレイヤーにランダムなファクトリーを提供するファクトリービルダーゲームに取り組んでいます。「公平性」の感覚を確保するために、ランダムに生成されたファクトリーは、(プレースホルダー値)30の数単位以内の領域を持つことが理想です。

これらの仕様を満たすために基本的なランダム長方形ジェネレーターを書くのは比較的簡単ですが、私たちの目標は、おそらく2、3、または4つの交差する長方形で構成される工場をより複雑にし、より複雑な形状を生成することです(L U、およびO形の建物)。

ランダムな長方形を生成し、基本的な代数を使用して2番目の長方形を埋めようとしましたが、これまでのところ2つ以上の長方形を実装することはできませんでしたが、それでも2つの長方形のデザインの結果に満足できませんでした。

より関連性の高い情報:2Dトップダウンメカニックの一部はファクトリースタイルであるため、部屋には適切な長さと幅を持たせて、現在JavaとLuaで使用できるようにします(必要に応じて、いずれかの組み込みライブラリを使用できます)

前もって感謝します!

編集:「良い」または「悪い」出力を言うと、悪い出力は、プレーヤーが使用できないスペースがある出力になります。工場の形状は、プレーヤーがコンベアベルトなどの工場の機械を配置できる場所を制限します。理想的には、工場には幅が1〜2ブロックしかない領域はなく、形状は1〜2ブロックの線が1辺に「垂れ下がる」1つまたは2つの大きな長方形であってはなりません。適切な出力は、すべての床面積が「実行可能」であるため、すべての領域が少なくとも3〜4ブロック幅です。優れた出力は必ずしも複雑である必要はありません(1つまたは2つの長方形でも構いません)が、1-2を超える長方形で構成される場合は、かなりのチャンスがあるはずです。

回答:


7

事前に生成されたポリオミノをメタシェイプとして使用して、さまざまな建物を構築できます。

最小許容距離が3ブロックであるとします。次に、考慮する最小の許容可能な建築単位は3x3です。便宜上、セルと呼び、9ブロックの領域を提供します。次に、ターゲットの開始領域を取得し、セル領域で分割します。指定した開始値を使用すると、3.333が得られます。そのため、3つのセルで必要な量より少し少なくなり、4つのセルでより多くなります。

ここからいくつかのオプションがあります。開始エリアに柔軟性がある場合は、最適な方法を使用して、許容量を与えるセルの数を選択します(最も近い値に切り上げる、切り上げるなど)。これを細胞数と呼びます。

次に、目的のセル数を持つポリオミノをランダムに選択します。polyominoの各正方形を建物のセルに置き換えて、最終的な形状にします。

例として、切り捨てを選択したとします。すべてのサイズ3ポリオミノがあります(回転/反転は含まれません):

ここに画像の説明を入力してください

L字形をランダムに選択してランダムな回転を適用すると、建物のレイアウトは次のようになります。

ここに画像の説明を入力してください

いくつかの問題。まず、使用できるセルの数には制限があります。ウィキペディアは、サイズ8(octomino)までのすべてのポリオミノを提供します。サイズ12までの要約データが含まれていますが、すべてのオンラインリストがあるかどうかはわかりません。第二に、上記のソリューションは、9の倍数の建物サイズに対してのみ正確に機能します。これらの問題のいくつかを回避する方法がいくつかあります。

1)別のセルサイズを使用します。たとえば、3x4、4x4など。

2)開始ポリオミノに追加のセルを追加します。すべてのシェイプが等しくなるようにする必要がある場合、これは難しい場合がありますが、ほとんどのゲーム開発の目的では、建物シェイプの真に均一な分布は必要ありません。

3)建物を広げて大きくします。例に戻ると、3つのセルを使用した場合、建物の面積は27正方形になり、3だけ短くなります。その後、サイズの1x3の正方形のグループを接着する場所を周囲でスキャンできます。メイクアップグループが少なくともAxBで、Aが少なくとも許容可能な最小距離である限り、結果は最小許容距離の制約に違反しません。上記の例を基にして、可能な結果の例を示します。

ここに画像の説明を入力してください

4)小さすぎる建物をパディングする代わりに、大きすぎる建物を切り詰めることができます。最小許容距離制約が守られていることを確認することは、パディングオプションよりも複雑ですが、考慮する選択肢が増えます。

他のコメント:

特定のサイズのすべての可能なポリオミノを使用できるからといって、そうすべきだというわけではありません。面白くないもの、テーマを壊すもの、視聴者に不快感を与えるもの(swパターン)、またはその他の問題を引き起こすものがある場合は、それらを削除します。また、いくつかのパターンが興味深いが、日常的にポップアップするには奇妙すぎる場合、選択ルーチンに重みを付けることができます。最後に、このソリューションを現在の戦略と組み合わせて使用​​できます。たぶん、長方形の建物を生成する時間の70%と、ポリオミノアプローチを使用する時間の30%です。または、長方形の建物から始めて、小さなポリオミノを外側に接着します。


16

手続き型ジェネレーターを構築する簡単な方法は次のとおりです。

  1. ランダムに構築する
  2. 出力が良好かどうかを確認する関数を実行します
  3. 出力が良好でない場合は、ステップ1に進みます

数千回の実行を完了する必要がある場合でも、ほとんどの単純なジェネレーターはこのアプローチで問題なく動作します。利点は、ジェネレーターで必要なスマート機能があまりないことです。また、100%良いものを構築するよりも何か良いものをチェックする方がはるかに簡単なので、このアプローチは非常に簡単です。

出力が良好かどうかに関する客観的な測定値をいくつか挙げました。これで、高速でダーティーなジェネレーターを作成できます。領域内に長方形をランダムに配置し、たとえば、幅が1〜2ブロックしかない領域がある場合、出力を拒否します。

それから始めて、後で改善して最適化します。


ありがとうございました!私はこれを検討したことを覚えていますが、数秒以上のロード時間が発生する可能性があると考えて停止しました。私は今、そのチャンスがどれほど小さいかを実感しています。私はそれを試してみる必要がありますが、誰かがより直接的な解決策を最初に持っているかどうかを確認するのを待つかもしれません。
user2129189

@ user2129189ジェネレーターを実行しても、乱数範囲を微調整して、テストに合格しそうにないレイアウトを生成しないようにすることができます。また、各コアで一度に1つのレイアウトを生成することにより、この試行錯誤生成アルゴリズムを複数のコアで並列化することもできます。
フィリップ

3
私自身は、リジェクトアンドリトライ生成メソッドのファンではありません。ジェネレーターが1つの簡単なことをしているときは十分に高速ですが、ゲームレベルでは通常、より多くの機能と生成ステップを重ねて、より豊かなマップを作成します。その時点で、実行可能なマップにヒットする確率は、各ステップが成功する確率の積であり、急速に縮小する可能性があります。これは単なる学術的な問題ではありません。私は、適切な/悪いシードキャッシングシステムを実装しなければならない開発者と話をしました。
DMGregory

@DMGregoryええ、私は間違いなくそれを見ることができます。私の場合、基本的なランダムジェネレーターは数パス内で99%の時間のように機能しますが、後でさらに複雑にしたい場合は、大幅に遅くなる可能性があります。推測やチェックのようなモデルの実際のプログラミング/ゲームアプリケーションを知っている人はいますか?
user2129189

世代の機能とチェックの層があり、条件のフレージングを現在の世代のレベルに一致させるように注意することができます。そうすれば、アイテムをわずかに間違って配置したときに見つかったエラーだけで、レベル全体を全体として再生成する必要はありません。
-Pysis

7

「すべてのエリアの幅は少なくとも3〜4ブロック」という制限を考えると、私の頭に浮かぶ最初のアイデアは次のようなものです。

  1. 3x3、3x4、4x3、4x4のいずれかを選択します
  2. そのサイズのブロックをグリッドの中央に配置します
  3. 方向を選択(上、左、右、下)
  4. その方向に以前に配置されたブロックと一緒に3x3のブロックを配置しよう
  5. 成功した場合、ある程度の確率で、あなたが選んだのではない方向の1つでブロックを4x3ブロックに拡大してみてください
  6. ある程度の確率で、aを塗りつぶされたブロックのランダムな端に移動します
  7. 面積が十分に大きくなるまで手順3〜6を繰り返します

基本的な考え方は、すべての領域に少なくとも特定のサイズを持たせたい場合、そのサイズの領域でのみ動作するということです。より一般的には、生成されたすべての出力について何かを真にしたい場合は、部分的に生成されたすべての出力についてそれを真にできるかどうかを確認します。


4
常に3x3ブロックから開始し、各正方形が既存の正方形に隣接するランダムな位置に3x1ブロックを追加することで、物事を単純化します。3x3ブロックに追加すると、4つの可能な位置があります。すべてが3x4ブロックを提供し、次のブロックに6つの可能な位置があります。そこからさらに複雑になりますが、それほど悪くはありません。
JollyJoker

0

NOTとUNIONのブール値を使用し、ランダムに選択することを検討してください。

  1. ランダムな長方形を配置します。
  2. 2番目のランダムな長方形を配置します。
  3. それらを結合するか、最初から2番目を減算するかをランダムに選択します。
  4. いくつかの長方形について繰り返します。ただし、妥当な十分な結果が得られるのは2〜3個だけです。

次に、面積を計算して、求めるおおよそのサイズにさらに一致するように拡大または縮小し、必要な最小量よりも小さい寸法がないことをテストします。


目的の領域を取得するためのスケーリングのアイデアは、実際には静かです。このような少し静かなものを実装するかもしれません。
user2129189
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.