ランダムゼルダスタイルのマップ生成


9

ドアで接続された部屋のマップをランダムに生成しようとしていますが、このコードを使用してマップを生成することに成功しました。

public void generate(GameContainer gc) {
        rooms = new ArrayList<Room>();
        startingRoom = new Room(0);
        startingRoom.setPosition(viewport.getCenterX(), viewport.getCenterY());
        lastRoom = startingRoom;
        rooms.add(startingRoom);
        int roomsize = 25;

        for (int i = 0; i <= (1000 + Math.random() * 4000); i++) {
            Room room = new Room(i + 1);
            int direction = (int) (Math.random() * (4));

            switch (direction) {
                case 0:
                    room.setPosition(lastRoom.x, lastRoom.y - roomsize);
                    break;
                case 1:
                    room.setPosition(lastRoom.x, lastRoom.y + roomsize);
                    break;
                case 2:
                    room.setPosition(lastRoom.x + roomsize, lastRoom.y);
                    break;
                case 3:
                    room.setPosition(lastRoom.x - roomsize, lastRoom.y);
                    break;
                default:
                    room.setPosition(lastRoom.x, lastRoom.y - roomsize);
                    break;
            }
            rooms.add(room);
            lastRoom = room;
        }
    } 

ただし、これでは、指定された部屋のドアを見つけることができません。ドアを正しい場所に配置して、部屋に隣接して使用できるように、それを理解できるようにする必要があります。この種の「スマートマップ」は現在のアルゴリズムで可能ですか、それとも最初からやり直す必要がありますか?これを機能させるためにどのような手順を踏めますか?

これにはSlick2dとJavaを使用しています

ありがとう。


最初に部屋をまとめて、必要に応じてドアを作成してそれらをリンクしませんか?
petervaz 2013年

それが私がやりたいことですが、ソースではない既存の部屋の隣に表示される部屋を説明する方法がないため、このアルゴリズムではできません。つまり、ドアがそこ。この時点で、まったく新しい何かを書く必要があると確信しています。それが役立つ場合、私はアイザックの束縛のような地図システムを目指しています。
user1500452 2013年

部屋の位置を簡単に検索できるようにする必要があるようです。Map <Vector2d、Room>をお勧めしますが、並べ替えられた配列の並べ替えられた配列をまとめることができます。
2013年

ここを見てください:pcg.wikidot.com/pcg-algorithm : dungeon-generation(質問には答えませんが、助けることができます)
tigrou

これはオプションではないかもしれませんが、次のようなことを試すことができます。4つのオープンスポット(各壁に1つ)で各部屋を生成し、各部屋の接続に開いたドア、閉じたドア、壁などをランダムに配置します。
Supericy

回答:


1

部屋を適切にリンクする前に必要なコードがいくつかあり、コードの作成方法が状況に応じて大きく左右されるため、この質問はかなり自由回答だと思います。

そうは言っても、私はあなたが正しい方向に進むのを助けるためにいくつかの提案をすることができます。

まず、部屋のサイズが一定の場合は、部屋の座標系を上位レベルにすることをお勧めします。次のようになります。

 _____ _____ _____ _____ _____
|     |     |     |     |     |
|-2,-1|-1,-1| 0,-1| 1,-1| 2,-1|
|_____|_____|_____|_____|_____|
|     |     |     |     |     |
|-2,0 |-1,0 | 0,0 | 1,0 | 2,0 |
|_____|_____|_____|_____|_____|
|     |     |     |     |     |
|-2,1 |-1,1 | 0,1 | 1,1 | 2,1 |
|_____|_____|_____|_____|_____|

部屋(0,0)を作成するとき、隣接するドアの場所を(-1,0)(0、-1)(1,0)と(0,1)と尋ねます。画面の座標が必要な場合は、GetScreenCoordsメソッドや変換行列を追加するのが簡単です。

次に、部屋のリストをクエリできるようにする必要があります。隣の部屋を見つけるためだけにリストのすべての部屋(最大5000まで!)を調べると、コストがかかります。物事をすばやく実行するために、HashMap<coord, Room> rooms代わりにを使用することをお勧めします。このように、部屋(0,0)を作成するときに、既存の隣接する部屋を要求するだけですrooms.get((1,0))rooms.put((0,0), newroom) たとえば、(0,0)に新しく生成された部屋を追加します。これが遅くなりすぎると、ソートされたリストを見る価値があります。おそらく、ソートされたリスト(y)のソートされたリスト(x)。

最後に、隣接する部屋からドアの位置を取得する方法を追加する必要があります。のような新しい方法int GetSouthDoor()でうまくいくはずです。

完全なソリューションをコーディングするための作業がさらに増えると思います。これがあなたが始めるのに役立つことを願っています。


非常に役立ちます。ハッシュマップに関する情報は、正しい方向に導くために私が必要としていたものとまったく同じです。ありがとう!
user1500452 2013年

2

2つのこと:

1)あなたのコメントで、あなたはあなたがIsaacの束縛のようなものを望んでいると言います。そのゲームは各ピースの中央にドアがあり、それらが整列することを保証します。あなたがスーツに従うなら、それはそれらを接続するためのドアの種類(開いている、ロックされている、ボーウォールなど)を決定することになります。

2)コードが1つの場所から始まり、手順に従って新しいタイルを一方向に生成するように見えます。あなたのswitch文では、しかし、あなたが来ている方向を考慮していないから。そのアルゴリズムを続行する場合は、タイルが互いに上書きしないように、最後の配置も追跡することを検討してください。


0

迷路生成アルゴリズムを使用する

プリムのアルゴリズムの変更された形式を使用して、20部屋程度の基本的な迷路を作成します。開始と終了の部屋として2つの部屋を選択し、最後に常に到達できるようにします。異なるドアタイプのランダムドアをブロックし、隣接する2つの部屋が接続されていないドアをランダムに追加します(確率は低い)。

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