Vấn đề cần giải quyết: Tạo bản đồ ngục tối 2D ngẫu nhiên cho trò chơi xếp gạch trong đó tất cả các phòng được kết nối.
Tôi đang tìm kiếm giải pháp tốt hơn những gì tôi hiện đang có.
Giải pháp hiện tại của tôi là tôi chạy hai thuật toán. Việc đầu tiên tạo ra ngục tối với các phòng của nó. Thứ hai đảm bảo rằng tất cả các phòng được kết nối. Tôi tò mò những gì giải pháp khác có thể tồn tại. Nhanh hơn và / hoặc dễ dàng hơn, vv Tốc độ không thực sự là một mối quan tâm, nhưng nếu tốc độ có thể đạt được mà không phải trả chi phí thực sự, đó là một điều tốt. Quan trọng hơn là tôi và những người khác đọc được có thể học những cách khác nhau để tiếp cận và giải quyết vấn đề.
Dưới đây là thực hiện hiện tại của tôi. Các phòng hiện không có lối ra hoặc lối ra ở bất kỳ 2, 3 hoặc 4 hướng.
Tạo các phòng ngục tối
Cài đặt: Đặt phòng hiện tại thành phòng trên cùng bên trái.
- Nhận loại phòng hợp lệ cho phòng (trong đó loại phòng hợp lệ là loại không có lối ra khỏi ngục tối và có lối thoát phù hợp với lối thoát của phòng ở trên và phòng bên trái. Chỉ cần kiểm tra ở trên và sang còn lại do bước 2 bên dưới).
- Đặt phòng xuống và tiến lên tọa độ x một bước. Nếu tọa độ x vượt quá chiều rộng ngục tối, hãy đặt tọa độ x thành 0 và tiến lên tọa độ y một bước. Nếu tọa độ y vượt quá chiều cao ngục tối, chúng ta đã hoàn thành.
- Lặp lại từ # 1.
Sau đó tôi kiểm tra xem tất cả các phòng có được kết nối hay không Nếu chúng không được kết nối, tôi chạy thuật toán thứ hai, theo cách không gợi cảm nhưng chắc chắn đủ tốt về mặt bố trí ngục tối, đi qua các phòng và thay đổi chúng để tất cả kết thúc đang được kết nối.
Kiểm tra xem tất cả các phòng được kết nối
Thiết lập: Tạo bản đồ 2D gồm các số nguyên biểu thị các đường dẫn và khởi tạo các mục nhập thành giá trị "chưa được xử lý" (chưa được duyệt), -1. Đặt số nguyên chỉ mục đường dẫn bắt đầu theo dõi đường dẫn hiện tại thành 1. Đặt phòng hiện tại ở phòng trên cùng bên trái bằng cách thêm nó vào một chồng các phòng để kiểm tra.
- Nếu ngăn xếp chứa các phòng cần kiểm tra, hãy bật nó đặt chỉ mục đường dẫn của phòng thành chỉ mục đường dẫn hiện tại. Nếu ngăn xếp không chứa bất kỳ phòng nào, hãy tăng chỉ số đường dẫn và cố gắng lấy một phòng bằng cách tiến lên từng cột, từng hàng, cho đến khi chúng ta có được một phòng chưa được xử lý. Nếu không có phòng có thể được tìm thấy, chúng tôi đã hoàn thành.
- Kiểm tra xem phòng có lối ra bên trái không. Nếu nó đã thêm phòng bên trái vào ngăn xếp nếu nó chưa có trên đó.
- Lặp lại bước 2 cho hướng xuống, phải và trên cùng (vì chúng tôi đang sử dụng ngăn xếp có nghĩa là các phòng được đi qua theo chiều kim đồng hồ, bắt đầu từ hướng trên cùng).
- Lặp lại từ bước 1.
- Nếu số chỉ số đường dẫn lớn hơn một, có các phòng bị ngắt kết nối.
Nếu có các phòng bị ngắt kết nối thì tôi sẽ nhóm các phòng theo chỉ số đường dẫn của chúng, lấy chỉ số của đường dẫn lớn nhất và kết nối tất cả các phòng khác với các phòng đó. Đây là một công việc đang tiến triển, nhưng kế hoạch (hiện tại, "tàn bạo") của tôi là đi qua từng phòng trong một nhóm phòng (trừ phòng đầu tiên) kiểm tra xem liệu có một đường ngang hoặc dọc đến nhóm phòng biggeset không, và nếu vậy, hãy tạo một đường dẫn ngang / dọc ở đó bằng cách tiêm / cập nhật các phòng ở giữa. Rửa sạch và lặp lại. Xấu xí, vâng, nhưng nó là một cái gì đó sẽ không đáng chú ý về mặt hình ảnh để nó hoạt động theo nghĩa đó.