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.
java
maps
random
procedural-generation
pengguna1500452
sumber
sumber
Jawaban:
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:
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> rooms
gantinya. Dengan cara ini saat Anda membuat kamar (0,0) Anda meminta kamar tetangga yang sudah ada, Anda cukup memintarooms.get((1,0))
dll. Dan menambahkan kamar Anda yang baru dihasilkan pada (0,0) yang akan Anda lakukanrooms.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.
sumber
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.
sumber
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)
sumber