Giảm số cạnh của đồ thị, giữ cho nó được kết nối


10

Tôi đang thiết kế một trò chơi với các ngục tối được tạo ngẫu nhiên. Tôi muốn xem đây là một biểu đồ được kết nối, không bị chặn trong đó các nút là các phòng và các cạnh là cửa ra vào hoặc hành lang. Sau đó, tôi chọn một nút "bên" làm lối vào ngục tối, tôi tính khoảng cách giữa lối vào này và tất cả các nút khác và quyết định rằng một trong những nút xa nhất là "mục tiêu" của ngục tối (vị trí của kho báu, ông chủ, công chúa, v.v.)

Tôi đã thấy 2 cách để tạo địa hình ngục tối cuối cùng:

  • Đầu tiên tạo một biểu đồ ngẫu nhiên, sau đó cố gắng lấp đầy thế giới 2d với các phòng tại các vị trí ngẫu nhiên, tôn trọng các kết nối cạnh. Tôi cho rằng điều này đôi khi sẽ khó khăn vì thế hệ phòng có thể bị "khóa" khi cố gắng lắp phòng ở những nơi không thể.
  • Tạo các phòng đầu tiên, đặt chúng ngẫu nhiên ở nơi phù hợp, sau đó ánh xạ kết quả tới các nút và cạnh. Tôi quyết định thử điều này.

Ý tưởng của tôi bao gồm:

  • Đầu tiên tạo ra một căn phòng lớn có thể chứa toàn bộ ngục tối.
  • Đặt một bức tường bên trong căn phòng lớn, tại một vị trí ngẫu nhiên, chia căn phòng lớn thành 2 phòng nhỏ hơn với diện tích khác nhau.
  • Sau đó, tôi tiếp tục chia mỗi phòng thành 2, cho đến khi chúng quá nhỏ hoặc tổng số phòng đạt tối đa (hoặc bất kỳ điều kiện nào khác). Mỗi phòng mới là một nút.
  • Sau khi hoàn thành, tôi kiểm tra từng phòng và tìm tất cả các phòng khác liền kề, đánh dấu 2 nút được nối với nhau bằng một cạnh.

Bằng cách đó, tôi đảm bảo rằng tất cả các phòng đều có một vị trí có thể có trong thế giới 2D và được ánh xạ chính xác bằng biểu đồ được kết nối.

Vấn đề của tôi là có quá nhiều cửa và hành lang nối các phòng.

Vì vậy, tôi muốn một thuật toán làm giảm số cạnh của đồ thị không được kết nối , nhưng cuối cùng vẫn giữ cho nó được kết nối (tất cả các nút vẫn có thể truy cập được).


Ý tưởng của bạn về cơ bản là một cây tìm kiếm nhị phân, nếu bạn muốn biết. Tôi đã sử dụng nó; Nó làm cho ngục tối khá đẹp và dễ dàng. :)
Vịt Cộng sản

2
FYI: Một biểu đồ hoàn chỉnh có các cạnh giữa tất cả các cặp đỉnh, vì vậy (giả sử các cạnh trùng lặp không được phép), bạn không thể xóa bất kỳ cạnh nào mà vẫn có một biểu đồ hoàn chỉnh. Thuật ngữ đúng là một biểu đồ được kết nối .
Michael Madsen

Cây tìm kiếm nhị phân, đồ thị kết nối, phải. Tôi rất tệ với tên thông thường của mọi thứ.
Splo

Câu trả lời:


13

Sử dụng Thuật toán của Prim để lấy cây bao trùm tối thiểu cho biểu đồ của bạn (thêm trọng số ngẫu nhiên hoặc thêm trọng số cao hơn gần lối vào hoặc thực hiện thuật toán bạn chọn) và thêm lại một số cửa / cạnh một cách ngẫu nhiên. Bằng cách này, bạn sẽ có tất cả các phòng được kết nối và một vài đường dẫn dự phòng.


1
Oh phải, cây bao trùm tối thiểu, tất nhiên! Ý kiến ​​hay, cảm ơn.
Splo


0

Một số trình tạo dungeon trong danh sách này từ Inkwell Ideas là nguồn mở hoặc cung cấp tài liệu về các thuật toán của chúng. Google cũng sẽ cung cấp cho bạn rất nhiều bằng cách tìm kiếm '[chương trình tạo dungeon]. Thật không may, yêu thích của tôi không thể tìm thấy bằng một trong những phương pháp đó, mặc dù là tài liệu tốt nhất tôi từng gặp và tôi không thể nhớ tên của nó khi tôi bị mất nó trong một sự cố ổ cứng gần đây. Tôi sẽ cập nhật câu trả lời này sau khi tôi thực hiện khôi phục trên ổ đĩa đó.

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.