Tạo bản đồ ngẫu nhiên theo phong cách Zelda


9

Tôi đang cố gắng tạo ngẫu nhiên bản đồ các phòng được kết nối bằng cửa và tôi đã thành công trong việc tạo một bản đồ bằng mã này:

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

Tuy nhiên, điều này không cho phép tôi tìm ra những cánh cửa mà căn phòng đã cho có. Tôi cần phải có khả năng tìm ra điều đó để tôi có thể đặt cửa ở đúng vị trí để chúng có thể được sử dụng để liền kề phòng. Đây có phải là loại "bản đồ thông minh" với thuật toán hiện tại của tôi không, hay tôi nên bắt đầu lại? Những bước tôi có thể làm để làm việc này?

Tôi đang sử dụng Slick2d và Java cho việc này

Cảm ơn.


Tại sao bạn không đặt các phòng lại với nhau trước và tạo các cửa khi cần thiết để liên kết chúng?
petervaz 18/03/13

Đó là những gì tôi muốn làm, nhưng tôi không nghĩ rằng tôi có thể với thuật toán này bởi vì không có cách nào để tính đến các phòng xuất hiện bên cạnh các phòng hiện tại không phải là nguồn của nó, điều đó có nghĩa là cánh cửa không phải là ở đó Tôi chắc chắn tại thời điểm này tôi sẽ cần phải viết một cái gì đó hoàn toàn mới. Tôi đang nhắm đến một hệ thống bản đồ như The Binding of Isaac's, nếu điều đó có ích.
dùng1500452

Có vẻ như bạn cần phải có các phòng dễ dàng truy vấn theo vị trí của họ. Tôi muốn đề xuất một Bản đồ <Vector2d, Room> cho nhanh và bẩn, nhưng bạn có thể muốn tập hợp một mảng các mảng được sắp xếp.
kéo

có một cái nhìn ở đây: pcg.wikidot.com/pcg-alacticm:dungeon-generation (không trả lời câu hỏi của bạn, nhưng có thể giúp đỡ)
tigrou 18/03/13

Đây có thể không phải là một lựa chọn, nhưng bạn có thể thử một cái gì đó như: Tạo mỗi phòng với 4 điểm mở (1 cho mỗi bức tường) và sau đó chỉ cần đặt ngẫu nhiên một cửa mở, cửa đóng, tường, v.v. trong mỗi kết nối phòng.
Supericy

Câu trả lời:


1

Tôi nghĩ rằng câu hỏi này khá mở, vì có một vài đoạn mã bạn sẽ cần trước khi bạn có thể liên kết các phòng một cách chính xác và cách bạn viết mã đó phụ thuộc rất nhiều vào cách mọi thứ có ý nghĩa với bạn.

Phải nói rằng, tôi có thể đưa ra một vài khuyến nghị để giúp bạn đi đúng hướng.

Trước hết, nếu kích thước phòng không đổi, tôi khuyên bạn nên tạo một hệ thống tọa độ cao hơn cho các phòng. Một cái gì đó sẽ trông như thế này:

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

Ý tưởng là khi bạn tạo phòng (0,0), bạn hỏi phòng (-1,0) (0, -1) (1,0) và (0,1) nơi có cửa liền kề. Nếu bạn cần coords màn hình, thật dễ dàng để thêm phương thức GetScreenCoords hoặc ma trận biến đổi nếu bạn tham gia vào đó.

Tiếp theo bạn sẽ muốn có thể truy vấn danh sách các phòng. Đi qua tất cả các phòng trong danh sách của bạn (tối đa 5000!) Chỉ để tìm các phòng lân cận sẽ tốn kém. Để có cách nhanh chóng để khởi động và vận hành, tôi khuyên bạn nên sử dụng HashMap<coord, Room> roomsthay thế. Bằng cách này khi bạn tạo phòng (0,0) bạn yêu cầu các phòng lân cận hiện tại bạn chỉ cần yêu cầu, rooms.get((1,0))v.v. và để thêm phòng mới được tạo của bạn tại (0,0) bạn sẽ làm rooms.put((0,0), newroom) Nếu điều này trở nên quá chậm, nó có thể đáng để xem danh sách sắp xếp. Có lẽ một danh sách được sắp xếp (x) của danh sách được sắp xếp (y).

Cuối cùng, bạn sẽ cần thêm một số cách để có được vị trí cửa từ các phòng lân cận. Một phương pháp mới như int GetSouthDoor()nên làm thủ thuật.

Tôi chắc chắn sẽ có nhiều công việc hơn để bạn viết mã cho một giải pháp đầy đủ. Tôi hy vọng điều này sẽ giúp bạn bắt đầu.


Vô cùng hữu ích, thông tin về hashtag chính xác là những gì tôi cần để đẩy tôi đi đúng hướng. Cảm ơn!
dùng1500452

2

Hai điều:

1) Trong bình luận của bạn, bạn nói rằng bạn muốn một cái gì đó giống như Binding of Isaac. Trò chơi đó có cửa ở giữa mỗi phần, đảm bảo rằng họ xếp hàng. Nếu bạn làm theo, thì bạn chỉ cần quyết định loại cửa nào để kết nối chúng (mở, khóa, cung, v.v.).

2) Mã của bạn dường như bắt đầu tại một địa điểm và theo thủ tục tạo ra các ô mới theo một hướng. Trong tuyên bố chuyển đổi của bạn, tuy nhiên, bạn không chiếm theo hướng bạn đang đến từ . Nếu bạn tiếp tục với thuật toán đó, hãy xem xét theo dõi vị trí cuối cùng để các ô không ghi đè lên nhau.


0

Sử dụng thuật toán tạo mê cung

Sử dụng một hình thức sửa đổi của Thuật toán Prim để tạo ra một mê cung cơ bản gồm 20 phòng hoặc hơn. Chọn hai phòng là phòng bắt đầu và phòng kết thúc, đảm bảo kết thúc luôn luôn có thể tiếp cận. Chặn các cửa ngẫu nhiên với các loại cửa khác nhau và thêm ngẫu nhiên các cửa mà hai phòng liền kề không được kết nối (với xác suất thấp)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.