Pembuatan peta gaya Zelda acak

9

Saya mencoba membuat secara acak peta kamar yang terhubung dengan pintu, dan saya berhasil membuatnya dengan menggunakan kode ini:

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;
        }
    } 

Namun, ini tidak memungkinkan saya untuk mencari tahu pintu mana yang diberikan kamar. Saya harus bisa mengetahuinya sehingga saya bisa menempatkan pintu di tempat yang benar sehingga mereka dapat digunakan untuk kamar sebelah. Apakah "peta pintar" semacam ini dimungkinkan dengan algoritma saya saat ini, atau haruskah saya memulai kembali? Langkah apa yang bisa saya ambil untuk membuatnya bekerja?

Saya menggunakan Slick2d dan Java untuk ini

Terima kasih.

pengguna1500452
sumber
Mengapa Anda tidak menyatukan kamar terlebih dahulu dan membuat pintu yang diperlukan untuk menghubungkannya?
petervaz
Itu yang ingin saya lakukan, tapi saya rasa saya tidak bisa dengan algoritma ini karena tidak akan ada cara untuk menghitung kamar yang muncul di sebelah kamar yang ada yang bukan sumbernya, yang bisa berarti pintu tidak sana. Saya yakin pada titik ini bahwa saya harus menulis sesuatu yang sama sekali baru. Saya bertujuan untuk sistem peta seperti The Binding of Isaac's, jika itu membantu.
user1500452
Sepertinya Anda perlu memiliki kamar dengan mudah permintaan-oleh posisi mereka. Saya menyarankan Map <Vector2d, Room> agar cepat dan kotor, tetapi Anda mungkin ingin menyusun array yang diurutkan dari array yang diurutkan.
kapal tunda
lihat di sini: pcg.wikidot.com/pcg-algorithm:dungeon-generation (tidak menjawab pertanyaan Anda, tetapi dapat membantu)
tigrou
Ini mungkin bukan pilihan, tetapi Anda dapat mencoba sesuatu seperti: Hasilkan setiap kamar dengan 4 tempat terbuka (1 untuk setiap dinding) dan kemudian secara acak letakkan pintu terbuka, pintu tertutup, dinding, dll di setiap sambungan kamar.
Supericy

Jawaban:

1

Saya pikir pertanyaan ini cukup terbuka, karena ada beberapa potong kode yang Anda perlukan sebelum Anda dapat menautkan kamar dengan benar dan bagaimana Anda membuat kode itu sangat tergantung pada bagaimana hal-hal masuk akal bagi Anda.

Karena itu, saya dapat membuat beberapa rekomendasi untuk membantu Anda pergi ke arah yang benar.

Pertama-tama, jika ukuran kamar konstan saya akan merekomendasikan membuat sistem koordinat tingkat yang lebih tinggi untuk kamar. Sesuatu yang akan terlihat seperti ini:

 _____ _____ _____ _____ _____
|     |     |     |     |     |
|-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 |
|_____|_____|_____|_____|_____|

Idenya adalah bahwa ketika Anda membuat kamar (0,0) Anda bertanya kamar (-1,0) (0, -1) (1,0) dan (0,1) di mana pintu sebelahnya berada. Jika Anda membutuhkan coord layar, itu seharusnya cukup mudah untuk menambahkan metode GetScreenCoords atau mengubah matriks jika Anda menyukainya.

Selanjutnya Anda ingin dapat menanyakan daftar kamar. Melewati semua kamar dalam daftar Anda (hingga 5000!) Hanya untuk menemukan kamar tetangga akan menjadi mahal. Untuk cara cepat untuk memperbaiki dan menjalankan, saya sarankan menggunakan sebagai HashMap<coord, Room> roomsgantinya. Dengan cara ini saat Anda membuat kamar (0,0) Anda meminta kamar tetangga yang sudah ada, Anda cukup meminta rooms.get((1,0))dll. Dan menambahkan kamar Anda yang baru dihasilkan pada (0,0) yang akan Anda lakukan rooms.put((0,0), newroom) Jika ini menjadi terlalu lambat, mungkin layak untuk melihat daftar yang diurutkan. Mungkin daftar diurutkan (x) dari daftar diurutkan (y).

Akhirnya Anda harus menambahkan beberapa cara untuk mendapatkan posisi pintu dari kamar-kamar tetangga. Metode baru seperti int GetSouthDoor()harus melakukan trik.

Saya yakin akan ada lebih banyak pekerjaan bagi Anda untuk kode solusi lengkap. Saya harap ini akan membantu Anda memulai.

kapal tunda
sumber
Sangat membantu, informasi tentang hashmaps adalah persis apa yang saya butuhkan untuk mendorong saya ke arah yang benar. Terima kasih!
user1500452
2

Dua hal:

1) Dalam komentar Anda, Anda mengatakan Anda menginginkan sesuatu seperti Binding Ishak. Permainan itu memiliki pintu di tengah masing-masing bagian, menjamin bahwa mereka berbaris. Jika Anda mengikutinya, maka hanya memutuskan untuk memutuskan seperti apa pintu untuk menghubungkan mereka (terbuka, terkunci, bowall, dll).

2) Kode Anda tampaknya dimulai pada satu lokasi dan secara prosedural menghasilkan ubin baru dalam satu arah. Namun, dalam pernyataan peralihan Anda, Anda tidak memperhitungkan arah kedatangan Anda dari . Jika Anda melanjutkan dengan algoritma itu, pertimbangkan untuk melacak penempatan terakhir juga, sehingga ubin tidak saling menimpa.

clintonmonk
sumber
0

Gunakan algoritma pembuatan labirin

Gunakan bentuk Algoritma Prim yang dimodifikasi untuk membuat labirin dasar yang terdiri dari 20 kamar atau lebih. Pilih dua kamar sebagai kamar awal dan akhir, memastikan akhir selalu dapat dijangkau. Blokir pintu acak dengan tipe pintu berbeda dan tambahkan pintu secara acak di mana dua kamar yang berdekatan tidak terhubung (dengan probabilitas rendah)

Beefster
sumber