データをハードコーディングするか、アルゴリズムを見つける方が良いですか?


8

私はこのボードとして六角グリッドを持つボードゲームに取り組んできました:

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

ボードは決して変更されず、ボード上のスペースは常にその周りの他の同じスペースにリンクされるため、必要な値ですべてのスペースをハードコーディングする必要がありますか?または、さまざまなアルゴリズムを使用してリンクとトラバーサルを計算する必要がありますか?

具体的には、私のボードゲームは4プレイヤーゲームで、各プレイヤーは5x5x5x5x5x5の16進グリッドを持っています(ここでも、上の画像を参照)。目的は、さまざまな障害物を邪魔して、グリッドの一番下から一番上に到達することです。各プレイヤーは、範囲乗数に基づいて、グリッドの端から他のプレイヤーに互いに攻撃できます。

プレーヤーのグリッドは決して変化せず、グリッドの端からの任意のスペースの距離は常に同じであるため、この数値を各スペースにハードコードするか、または幅優先検索アルゴリズムを使用する必要がある場合プレイヤーが攻撃していますか?

すべてをハードコーディングする場合に考えられる唯一の欠点は、9 + 2(5 + 6 + 7 + 8)= 61の個別のセルをコーディングすることです。他に、もっと複雑なアルゴリズムを使用することを検討する必要がある見逃しているものはありますか?


半径攻撃の領域は、1に、f(n)= 6(n-1)でn = 1からn = x(xは行数)までのシーケンスの項の合計を加えたものであることがわかります。EG 3列(半径10フィート)= 1 + 6 + 12 = 19
eazimmerman

これが私が説明したものの疑似コードです int numberOfHexagonsInArea(int rows) { int area = 1; while(rows>0) { area += (rows-1)*6; rows--; } return area; }
eazimmerman '22

難しいと思わない?{X,Y}あなたは明らかに行くことができる {X-1, Y}し、{X+1, Y}同じ行に。下記および上記の行では、あなたがに行くことができる{X, Y-1}{X, Y+1}。最後に、偶数らしさに応じてY、あなたに行くことができる{X-1, Y-1}し、{X-1, Y+1}または、{X + 1、Y-1} `と{X+1, Y+1}
MSalters

回答:


12

ここで対置点を取り、静的な値を使用しないように主張します。この場合、あなたが話している16進領域はすべて(a)計算が簡単です。BFSやその他の複雑なものを使用する必要はありません。あなたは単純な二重にネストされたループでそれらのいずれかのへクスのすべてを反復できるはずです。(b)「オンザフライ」で頻繁に計算する必要のあるものではない。最悪の場合、それらを計算する必要があるのは1ターンに1回だけです。複数のシステムセルをエフェクトに触れさせたい場合は、値を簡単に「reachableCells」配列または類似のものにキャッシュできます。とにかく、計算は非常に簡単なので、フレームごとのコストの観点からは、事実上自由に実行できるはずです。

それで、あなたは何を手に入れますか?柔軟性。これらの値は決して変わらないと今言うのは簡単ですが、ゲームにはあなたを驚かせるコツがあります。これらの地域変更されない可能性が高いとしても、その柔軟性を組み込むことで本質的に何もあきらめ、将来的には将来に感謝する可能性が高くなります。さらに、これらが使用する最後の領域であっても、領域を反復処理するための適切に記述されたループは、あらゆる種類の固定タイル配列よりも理解とデバッグが大幅に容易になります。ハードコーディングされたデータを使用することには、他の方法を使用することの利点と比較して、意味のある利益がまったくありません。


11

値が変更されない場合は、静的である可能性もあります。前回と同じものを再計算するCPU時間を無駄にするのはなぜですか?

ただし、必ずしも「ハードコード」する必要はありません。

  • 値をデータファイルに入れて、最初にロードすることができます。
  • プレイ中に検索を実行し、値が見つかったら値をキャッシュできます。

最初の方法は、マップの形状またはサイズを将来変更する可能性がある場合に適しています。2番目の方法は、静的な値の計算が少し難しい場合に意味があります。

6次元の16進マップがどのように見えるのか、なぜ9 + 2(5 + 6 + 7 + 8)のセルが関係しているのかはわかりませんが、あなたの状況、そして実際のゲームプログラミングのほとんどの状況に最適な結果は正しい結果を最も早く得るものをコード化する。必要に応じて、後でアルゴリズムに一般化できます。「今日のコード」と言う人もいます。


このすべて。最初にそれを機能させ、次に自我を和らげます;)
Mike Cluck

2
混乱を明確にするために、5x5x5x5x5x5の六角形グリッドを参照するときのOPは、6つの物理(または仮想)ディメンションを参照していませんが、六角形の六角形で、六角形の各辺にその長さに沿って5つの小さい六角形が含まれていると思います。これに似ています(黒い点は無視してください)。その場合、ボードには9 + 2(5 + 6 + 7 + 8)セルが含まれます。

ええ、私は編集で投稿された図からそれを見ました。
Kylotan

0

Q:これはあなたが書く唯一の六角ゲームですか?番号?

A:当然、余計な労力がかからないところでは、柔軟に対応する必要があります。ボードの定義方法に関係なく、明示的なリンクを使用して実行時にボードを表します。ボードのサイズやトポロジーとは関係なく、リンクをたどるという観点から、移動と関係のロジックをコーディングするのは非常に便利です。

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