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).