JSのランダムラビリンスは、自分で何行知っているか

JavaScriptの[何でも]に関する記事を30行のコードで読んで、考えたのはなぜですか。 欠点のリストに「悪いコードを書く」という項目が見つからなかったため、彼は何か面白いことをすることにしました。

迷宮は常に私の方向にいくつかの魔法と謎を吹き飛ばしたので、「何か面白いもの」の検索は十分に迅速に終了しました。 残念ながら、ゲームの作成は、コンソールと私の神経質で何時間も実験を続けました。

最初は、汚れのないプログラミングの信奉者の正しい怒りの次元を理解して、作品を公開するつもりはありませんでしたが、猫、数人の友人、私の虚栄心がゲームを気に入った後、記事を書くことにしました(幸いなことに、理論的な部分を紹介することができます)。

「あまり知らない-よく眠る」という原則の支持者には、JSFiddle(矢印コントロール)へのリンクが推奨されます。

開始する


そのようなゲームを作成するのに最も難しいことは何ですか? そうです、迷路の生成そのものです。 そのため、最初は、既存のアルゴリズムを検討して最適なアルゴリズムを選択するのではなく、最も厳格なルールの未亡人貴族を優先して独自のホイールを作成することから始めました。

私のアイデアは、グレゴリーギャロウェーの雪のようにシンプルでした。再帰関数を作成し、ポイント[0:0]から開始して、迷路を走り抜け、クロールアウトするまでその経路を「食べ尽くす」ことです。 彼女がこれを行うとすぐに、彼女が横断したパスからN個のセルをランダムに選択し、これらのセルから同じ機能を実行します。

長所: Nの値を調整することにより、迷路の複雑さを調整する機能
短所:すべての事故。

すぐに言ってやった!

私の決定を叫んだ後、私は専門家に助けを求めました。 幸いなことに、彼らのアドバイスはNEMALOでした

プリムのランダム化アルゴリズム


これらのアルゴリズムを研究した後、私はその実装が最も簡潔であると考えて、ランダム化されたPrimアルゴリズムに着手しました(実際、それをわずかに変更しました)。

だから、最初に、迷路について少し。 ラビリンスは、セル(頂点)が次の2つのセットのいずれかに属する必要があるテーブルです(もちろん、それをグラフと呼ぶ方が正しいでしょう)。
1)これらの奇妙な迷路パターンを形成する「壁」(黒いブロック)。
2)「通路」(白いブロック)-移動できるもの。

アルゴリズムは次のとおりです。
  1. すべてのセル(頂点)が「壁」のセットに属するテーブル(グラフ)から始めます。
  2. セルを選択します。 「壁」のセットからそれを削除し、「通路」のセットに追加します。 それに隣接するすべての壁(垂直および水平)は、「 州下院の本会議で承認された壁の特別リスト」に追加されます。
  3. 「壁の特別リスト」を取ります。
    1. 空でない場合は、そこからランダムな壁を選択します
      1)壁の反対側のセルが「Passages」のセットに属する場合、「SPS」(壁の特別なリスト)からこの壁を削除します。

      画像

      2)反対側のセルが「壁」のセットに属している場合:
      • この壁を「壁」のセットから削除します。
      • この壁を多くの「通路」に追加します。
      • 「壁」のセットから反対側のセルを削除します。
      • 「通路」のセットの反対側にセルを追加します。
      • 「特別な壁のリスト」の反対側のセルに隣接する壁を追加します。
      • ポイント3に戻ります。

    2. 空の場合、ラビリンス生成は完了しています。

    (矢印コントロール)。

    頑張って

    PS通過するときに何も(画面上に)表示されない場合、何らかの理由で画像が読み込まれていません。

    PPS JSFiddleのコードは、40行に収まるようにわずかに変更(圧縮)されています(ヒットしないでください!)。

Source: https://habr.com/ru/post/J249929/


All Articles