Tạo Dungeon thủ tục: Có một thuật toán đơn giản để đảm bảo tất cả các phòng này được kết nối bằng các hành lang tối thiểu?


9

Có thể có được một cấu trúc giống như tổ ong, kết nối tất cả các phòng mà không có quá nhiều hành lang? (Quá nhiều là 3-4 hành lang đến từ một phòng)

Dưới đây là đầu ra của các phòng của tôi trông như thế nào, về cơ bản chúng được đặt ngẫu nhiên.

đầu ra của một phòng lưới, được đặt ngẫu nhiên

Những gì tôi đang hy vọng có được hành lang khôn ngoan.

http://i.imgur.com/9GUi6Yy.png


Tôi không nghĩ 3 hoặc 4 là "quá nhiều hành lang". Đặc biệt nếu bạn có 9 phòng trong ngục tối của bạn. Thêm vào đó, tôi không chắc ý của bạn về "cấu trúc giống như tổ ong", bạn có thể nói rõ hơn về vẻ ngoài mà bạn đang cố gắng thực hiện không?
fnord ngày

Có thể bao gồm một bản đồ "đã hoàn thành" để hiển thị những gì bạn quan tâm.
MichaelHouse

À đúng rồi, ý tôi là tối đa 3 hoặc 4 người điều chỉnh đến từ mỗi phòng.
Máy xay sinh tố

Tôi đã thêm một hình ảnh về những gì tôi đang làm việc hướng tới hành lang.
Máy xay sinh tố

2
Nếu bạn không có 3 hành lang từ bất kỳ phòng nào, bạn sẽ chỉ có thể tạo một liên kết tuyến tính đơn giản của các phòng, và vì vậy chỉ cần chọn một hành lang, và tham gia nó với hai người hàng xóm gần nhất.
Nick

Câu trả lời:


6

Chà, cách đơn giản nhất tôi có thể nghĩ đến bắt đầu bằng việc đảm bảo tất cả các phòng đều được kết nối bởi ít nhất 1 hành lang:

  1. Bắt đầu với phòng cuối cùng hoặc đầu tiên.
  2. Chọn một phòng ngẫu nhiên trong khoảng cách 1, chưa được kết nối với một số phòng (tất cả các phòng bắt đầu bị ngắt kết nối, vì vậy bạn sẽ theo dõi điều này khi bạn đi).
  3. Nếu không có phòng như vậy, hãy đi đến khoảng cách +1. Nếu bạn có thể chui qua / dưới một phòng khác thì điều này sẽ dễ dàng hơn, giả sử bạn không muốn kết nối hành lang.
  4. Làm việc theo cách của bạn thông qua giả ngẫu nhiên cho đến khi tất cả các phòng được kết nối.

Bây giờ chúng tôi biết bạn có thể đến tất cả các phòng, nhưng bây giờ nếu bạn muốn nhiều hơn mê cung tuyến tính nghiêm ngặt này, bạn có thể chỉ cần bước qua các phòng của mình và tạo một con đường mới để kết nối các phòng, lên đến giới hạn cho mỗi phòng 2-3 hoặc cho đến khi một tỷ lệ nhất định các phòng đạt kết nối tối đa - vv

Bước cuối cùng, bạn có thể thêm các quy tắc sẽ thay đổi kết quả của mình để phù hợp với các tình huống khác nhau. Chẳng hạn, bạn có thể quan sát rằng bất kỳ phòng nào chỉ có 1 hành lang, theo định nghĩa, là ngõ cụt; Bạn có thể tạo ra nhiều ngõ cụt hơn hoặc bạn có thể loại bỏ tất cả bằng cách đảm bảo mọi thứ đều có ít nhất 2 kết nối. Bạn có thể làm cho ngõ cụt có một lối đi bí mật. Bạn có thể chắc chắn rằng một phòng ông chủ là một ngõ cụt. Bạn có thể chắc chắn rằng phòng bắt đầu của bạn là ngõ cụt, nhưng sau đó hãy chắc chắn rằng phòng thứ hai có tối thiểu các kết nối X. Quảng cáo vô hạn.

Mỗi giả định và quy tắc có thể thay đổi hoàn toàn mức độ của bạn, nhưng đó là một phần của niềm vui! Điều này ít nhất sẽ giúp bạn bắt đầu các phòng giống như hang động / hang động.


Điều này khá gần với thuật toán Cây kéo dài tối thiểu của Kruskal - điều này sửa đổi điều kiện trong 2 từ "chưa được kết nối với một số phòng" thành "chưa được kết nối với cùng một cụm " để sửa lỗi trong các quy tắc được mô tả ở trên nơi bạn có thể có tình huống trong đó mỗi phòng được kết nối với một số phòng nhưng toàn bộ hầm ngục vẫn tạo thành nhiều hòn đảo bị ngắt kết nối. Kruskal được đảm bảo tìm thấy một biểu đồ kết nối với tổng chiều dài hành lang tối thiểu.
DMGregory

3

Chỉ cần xây dựng phòng của bạn đã được kết nối. Bắt đầu với một phòng, sau đó xây dựng 1-3 hành lang đến các phòng khác. Sau đó lặp lại cho đến khi bạn đã thêm đủ phòng.


2

Vì các phòng này là các đỉnh Đồ thị được nhúng trong đồng bằng 2d, về lý thuyết có thể được thực hiện bằng cách giải quyết vấn đề nhân viên bán hàng du lịch (sẽ ổn với chỉ một vài phòng). Rõ ràng, một heuristic đơn giản sẽ ổn và cho phép khả năng mở rộng hợp lý.

Bạn tính các cạnh (độ dài hành lang) giữa tất cả các phòng. Bạn sắp xếp chúng theo chiều dài. Bạn thêm hành lang ngắn nhất trừ khi nó tạo ra một chu kỳ hoặc tăng mức độ của đỉnh (phòng) trên giá trị tối đa mong muốn của bạn (3-4) (Lặp lại). Để kiểm tra các chu kỳ, bạn có thể áp dụng UnionFind hoặc thực hiện BFS nhanh trên dữ liệu nhỏ.


Câu trả lời này tốt hơn câu trả lời được chấp nhận. Một chiến lược tham lam chọn các hành lang kết nối ngắn nhất trước tiên nên hoạt động. Để tránh chu kỳ, đừng tạo kết nối đến các phòng đã có hành lang kết nối với chúng.
Jelle van Campen

@JellevanCampen Cảm ơn. ;) Bạn có thể có hai thành phần kết nối bị cô lập. Vì vậy, có lẽ bạn muốn sử dụng union find hoặc kiểm tra với BFS nếu hai nút được kết nối.
AturSams

À đúng rồi, quyền của bạn về điều đó, xấu của tôi.
Jelle van Campen
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.