Thuật toán cho bản đồ 2D thủ tục với các đường dẫn được kết nối


26

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.

  1. 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).
  2. Đặ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.
  3. 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.

  1. 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.
  2. 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 đó.
  3. 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).
  4. Lặp lại từ bước 1.
  5. 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 đó.


1
Bạn đã xem "Dungeon Generation" trên PCG wiki chưa? Nó có trả lời câu hỏi của bạn không?
congusbongus

@congusbongus Đọc hữu ích cho chắc chắn. Trình tạo donjon được liên kết trên trang đó thật tuyệt vời. Cảm ơn.
user1323245

Câu trả lời:


33

Một trong những thuật toán tốt nhất và được sử dụng nhiều nhất mà tôi đã thấy hiện đang tạo ra các dungeon bằng cách sử dụng Phân vùng không gian nhị phân.

Giải thích chung tốt nhất mà tôi đã đọc là một trong những cuốn được tìm thấy trong The Chronicles of Doryen (được đính kèm ở phần cuối cho mục đích sao lưu) vì giải thích quy trình mà không cần nhập mã, do đó để lại cho người đọc.

Hai hướng dẫn khác về cùng một chủ đề, với mã, có thể được tìm thấy tại


Xây dựng cây BSP

Chúng tôi bắt đầu với một ngục tối hình chữ nhật chứa đầy các tế bào tường. Chúng tôi sẽ phân chia ngục tối này theo cách đệ quy cho đến khi mỗi ngục tối có kích thước xấp xỉ một căn phòng. Việc tách dungeon sử dụng thao tác này:

  • Chọn một hướng ngẫu nhiên: chia ngang hoặc dọc
  • Chọn một vị trí ngẫu nhiên (x cho dọc, y cho ngang)
  • Tách ngục tối thành hai ngục tối phụ

nhập mô tả hình ảnh ở đây

Bây giờ chúng ta có hai ngục tối A và B. Chúng ta có thể áp dụng cùng một hoạt động cho cả hai.

nhập mô tả hình ảnh ở đây

Khi chọn vị trí chia tách, chúng ta phải cẩn thận không quá gần biên giới ngục tối. Chúng ta phải có thể đặt một phòng bên trong mỗi ngục tối được tạo. Chúng tôi lặp lại cho đến khi các ngục tối thấp nhất có kích thước xấp xỉ các phòng chúng tôi muốn tạo.

nhập mô tả hình ảnh ở đây

Xây dựng ngục tối

Bây giờ chúng tôi tạo ra một căn phòng với kích thước ngẫu nhiên trong mỗi lá của cây. Tất nhiên, căn phòng phải được chứa bên trong ngục tối phụ tương ứng. Nhờ có cây BSP, chúng tôi không thể có hai phòng chồng chéo.

nhập mô tả hình ảnh ở đây

Để xây dựng hành lang, chúng tôi vòng qua tất cả các lá của cây, nối từng lá với chị của nó. Nếu hai phòng có tường đối diện, chúng ta có thể sử dụng hành lang thẳng. Khác chúng ta phải sử dụng một hành lang hình chữ Z.

nhập mô tả hình ảnh ở đây

Bây giờ chúng tôi nhận được một cấp độ trong cây và lặp lại quá trình cho các tiểu vùng cha. Bây giờ, chúng ta có thể kết nối hai tiểu vùng với một liên kết giữa hai phòng, hoặc một hành lang và một phòng hoặc hai hành lang.

nhập mô tả hình ảnh ở đây

Chúng tôi lặp lại quá trình cho đến khi chúng tôi kết nối hai ngục tối phụ A và B đầu tiên

nhập mô tả hình ảnh ở đây


Có thể không có giá trị gì khi kỹ thuật này sẽ không bao giờ tạo ra các vòng lặp, tuy nhiên tôi không chắc có cách nào khác không mà không cần thêm các hành lang ngẫu nhiên. Vẫn là câu trả lời rất hay, +1
Vality

Đây là một khởi đầu đầy hứa hẹn. Chỉ cần tìm ra một cách để thêm một số vòng lặp vào nó, nhưng tôi thích giải quyết vấn đề đó hơn là tiếp tục con đường tôi hiện đang làm. Cảm ơn.
dùng1323245

2
Tốt đẹp ! Tôi đã quan tâm đến id vì vậy tôi đã thực hiện một nỗ lực nhỏ. Bạn cần cẩn thận khi sử dụng ngẫu nhiên nếu không kết quả quá lạ sẽ xảy ra. Và tôi tự hỏi nếu các hành lang không nên được xử lý ngay trong quá trình phân chia đệ quy, bởi vì tôi không thấy cách dễ dàng để xây dựng hành lang ra khỏi cây. Dù sao cho bất cứ ai quan tâm đến fiddle là ở đây: jsfiddle.net/gamealchemist/xt57zwb8
GameAlchemist

Trong khi tôi thấy điều này có chút vấn đề trong quá trình thủ tục hạt giống lặp lại trong các môi trường lớn. Đây có lẽ là một trong những phương pháp tốt nhất tôi từng thấy cho loại thế hệ này với điều kiện bạn đang tạo ra toàn bộ cấp độ của mình cùng một lúc. Tôi +1 cái này
Kẻ vô gia cư đó

4

Các phương pháp BSP là rõ ràng là phương pháp phổ biến nhất để tạo ra các hang động, nhưng nó không phải là chỉ có một.

Để hoàn thiện tôi sẽ giải thích máy phát điện làm việc cho tôi . Tôi phải thừa nhận rằng tôi không nhớ mình đã đọc về điều này vì vậy tôi sẽ chỉ nói rằng đó không phải là phát minh của tôi (một bài viết cũ của Jamis Buck nghe rất quen thuộc).

Một mê cung với các phòng

Ý tưởng cơ bản là một ngục tối là một mê cung với các phòng, loại. Vì vậy, bước đầu tiên cho thuật toán này là tạo ra một mê cung :

Mê cung được tạo ra với một biến thể của thuật toán Eller

Bước tiếp theo là làm cho nó thưa thớt (loại bỏ ngõ cụt):

Làm cho thưa thớt: loại bỏ ngõ cụt

Bước số 3 là thêm một số vòng lặp (làm cho nó không hoàn hảo ) nhưng tôi sẽ bỏ qua hình ảnh vì nó hầu như không đáng chú ý (Tôi không cần một mê cung hoàn hảo nên tôi đã sử dụng một vài phím tắt trên thuật toán tạo mê cung, vì vậy nó đã có vòng lặp ở điểm này).

Sau đó, đối với bước 4, chúng ta cần xóa các ô bị cô lập:

Loại bỏ các tế bào bị cô lập

Tại thời điểm này, chúng tôi đã hoàn thành với các hành lang và chúng tôi đã sẵn sàng để thêm phòng. Cho rằng chúng tôi làm như sau:

  1. Tạo một bộ các phòng (chiều rộng và chiều cao)
  2. Đối với mỗi phòng, chúng tôi lặp qua tất cả các vị trí có thể và quyết định vị trí tốt nhất.
    • Vị trí tốt nhất được tính bằng cách thêm trọng số vào các điều kiện (chẳng hạn như kề với hành lang).
  3. Chúng tôi đặt các phòng.

Cho đến nay, ngục tối của chúng ta sẽ trông như thế này: Đã thêm phòng

Bước cuối cùng là thêm đồ trang trí.

Vẽ cửa và số phòng

Một số suy nghĩ cuối cùng

  • Tôi đã sử dụng một phiên bản rút gọn của Thuật toán Eller .
  • Các thuật toán mê cung khác nhau có thể dẫn đến kết cấu khác nhau. Bạn có thể thích một thuật toán khác. Ví dụ: hình ảnh sau đây cho thấy các kết cấu khác nhau do "Cây nhị phân" (độ lệch đường chéo) và một biến thể của thuật toán "Bộ phận đệ quy" (hành lang dài): Cây nhị phân vs Bộ phận đệ quy giả

2
Đồ tốt. Tôi đã tìm kiếm những cách khác nhau để làm điều đó, vì sử dụng các thuật toán khác nhau cho các cấp độ khác nhau có thể làm cho trò chơi trở nên linh hoạt hơn.
dùng1323245
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.