Làm thế nào để tạo ra các ô cửa theo thủ tục, nhanh chóng và đảm bảo tính khả thi


7

Tôi hiện đang tạo ra một trò chơi thám hiểm tàu ​​vũ trụ và tôi gặp một vấn đề lớn mà tôi đã cố gắng giải quyết trong nhiều tháng, và qua phần còn lại của nhóm tôi quyết định chọn viết lại để sửa một số spaghetti lớn.

Dù sao, các vấn đề diễn ra như sau:

Người chơi bắt đầu trong một căn phòng, từ đó họ có thể đi đến một số phòng liền kề khác thông qua các ô cửa.

Những ô cửa này được lưu trữ trong bản đồ về hướng mà chúng đi vào và đối tượng ô cửa mà chúng tham chiếu. Mỗi đối tượng Doorway theo dõi hai phòng mà nó liên kết và sẽ hướng người chơi đến từng phòng khi cần thiết.

Tuy nhiên, tất cả các phòng cần có thể truy cập được bằng ít nhất một tuyến đường và đi qua một ô cửa ở phía mạn phải có nghĩa là các phòng khác cần phải có cùng một ô cửa ở phía cổng. Tôi có thể làm điều này bằng cách chỉ cần mỗi bức tường là một cánh cửa, nhưng điều đó trở nên nhàm chán để khám phá.

Việc tạo trước những thứ này đã chứng tỏ đủ một mớ hỗn độn khiến tôi thất bại, nhưng bây giờ, thông số kỹ thuật đã thay đổi. Thế giới sẽ là vô hạn về mặt lý thuyết, và như vậy, đường dẫn không thể được tạo trước, và thay vào đó phải được thực hiện khi cần phòng mới, hoặc dự kiến ​​sẽ sớm được yêu cầu.

Vì vậy, tôi cần phải tạo ra cái mà thực chất là một mê cung, với các vòng lặp được phép, được vẽ trên lưới, mỗi ô vuông một lần, trong đó không chỉ mỗi phòng không trực tiếp nhận ra những cái khác tồn tại, mà còn có thể nhận được từ nhau. Trên hết, đi qua một ô cửa ở một bên của căn phòng có nghĩa là cùng một ô cửa cần phải ở phía đối diện của phòng bên cạnh.

Cách tốt để đảm bảo tất cả các tính chất này là gì? Tôi sẵn sàng chia tay với những căn phòng không có kiến ​​thức về người khác, nhưng thà giữ nó theo cách này để dễ dàng tạo lại loại phòng sau này, nếu điều đó trở nên cần thiết.

Dưới đây là tệp văn bản ascii mockup của ví dụ 5x5 tôi đã tạo https://pastebin.com/EtdAWAwD Các dòng là tường, X là cửa và S là vị trí bắt đầu của người chơi.

Bất kỳ lời khuyên nào đều được đánh giá cao, ngay cả trên các tuyến đường thay thế để xem xét để tạo ra những điều này.


1
Trong một mê cung được kết nối đơn giản vô cùng lớn, trong khi mọi phòng đều có thể tiếp cận được với bất kỳ ai khác, con đường để đi giữa chúng có thể dài tùy tiện và rối rắm. Đó có phải là mong muốn cho trường hợp này?
DMGregory

Câu trả lời:


4

nhiều cách để làm điều này - thậm chí có một bài viết trên wikipedia về nó .

Googling cho những thứ như "Mê cung thuật toán Prim", "Mê cung thuật toán của Kruskal", vv dẫn đến một loạt các mã mẫu và video youtube.

Đối với yêu cầu của bạn là cần một thứ gì đó mở rộng ra một thế giới vô tận, tôi nghĩ rằng phương pháp "phân chia đệ quy" sẽ dễ dàng nhất, mặc dù có sự liên kết lưới rõ ràng nếu người chơi đang nhìn vào bản đồ. Bạn sẽ có thể đặt các khoảng trống trong lưới thông qua một số hàm băm xác định cố định để bạn có thể tạo lại cùng một mê cung tại cùng một vị trí mỗi lần.


4

Khi thế giới của bạn được phát triển vô hạn, thì Thuật toán của Prim và Thuật toán của Kruslak sẽ không giúp bạn, bởi vì chúng hoạt động trên một lĩnh vực có quy mô đã biết.

Thay vào đó, những gì bạn có thể làm là phát triển mê cung của mình bằng cách bắt đầu với một phòng duy nhất và sau đó tiếp tục gắn các phòng mới một cách ngẫu nhiên vào biên giới của mê cung. Bạn làm điều đó bằng cách chọn một phòng ngẫu nhiên vẫn có các cạnh miễn phí, tạo ra một phòng mới giáp với cạnh đó và kết nối hai phòng với một ô cửa.

Điều đó sẽ tạo ra một mê cung với cấu trúc liên kết hình cây với căn phòng đầu tiên là gốc của nó. Khi bạn muốn mê cung có thể lặp lại, bạn chỉ cần kiểm tra xem một phòng mới được tạo cũng có biên giới với bất kỳ phòng nào khác ngoài phòng được tạo từ đó không, cuộn một số ngẫu nhiên cho mỗi phòng và khi đủ cao, bạn cũng kết nối đến căn phòng đó với một cánh cửa khác (bao nhiêu là "đủ cao" tùy thuộc vào số lượng vòng bạn muốn).


0

Bạn có thể thử điều đó:

Bất cứ khi nào một căn phòng cần được tạo ra (giả sử, nó ở một nơi gần rvà chưa được tạo ra) tại(x,y)

  1. tìm tất cả các cửa đến 'void' trong bán kính Rtừ (x,y)(nó có thể ở bất kỳ số đo nào). Nếu không tìm thấy thì tạo một cửa kết nối với(x, y)

  2. tạo ra một mê cung bắt đầu từ bất kỳ vị trí nào được tìm thấy trong 1, lấp đầy 'khoảng trống' trong toàn bộ khu vực bán kính Rxung quanh (x, y)(bằng bất kỳ thuật toán nào đảm bảo kết nối giữa hai điểm bất kỳ, ví dụ như backtracing đệ quy). Nếu tại bất kỳ thời điểm nào, nó sẽ tạo ra một cánh cửa cho một căn phòng bên ngoài bán kính Rtạo ra cánh cửa nhưng đừng đi theo nó. (Vì vậy, bạn tạo hiệu quả cả một khu vực cùng một lúc, thay vì phòng đơn)

  3. Đối với các cửa được tìm thấy trong 1. buộc kết nối từ cả hai bên.

Bạn phải chọn Rvà số liệu theo kinh nghiệm cho những gì bạn cần. Thậm chí có thể tạo thủ tục đa giác giới hạn (khá dễ dàng) mỗi lần và sử dụng nó làm vùng giới hạn. Bằng cách đó bạn đặt nhiều bất thường hơn vào máy phát điện.

Một nhược điểm của thuật toán đó là hình dạng của mê cung phụ thuộc vào thứ tự khám phá, do đó không thể sao chép chỉ bằng hạt giống. Nhưng tôi không thể nghĩ ra bất kỳ thuật toán nào khác đạt được điều đó sẽ không hoàn toàn là xác suất.

Tôi cũng sẽ để lại liên kết này https://nothings.org/gamedev/herringbone/ tại đây, có lẽ nó có thể hữu ích bằng cách nào đó.


0

Điều đầu tiên là nhận ra đó là một biểu đồ và vì nó nằm trên lưới nên có nghĩa là mỗi nút có ít nhất 4 nút lân cận.

  1. Vì bạn có một vị trí bắt đầu, sử dụng một cây như các cấu trúc đảm bảo tất cả các phòng luôn có thể truy cập được. Vì vậy, khi tạo phòng mới, nó phải luôn liên kết với phòng trước, quy tắc đơn giản này đảm bảo luôn có đường dẫn đến điểm bắt đầu và vì tất cả các phòng được kết nối với phòng bắt đầu nên luôn có đường dẫn đến bất kỳ phòng nào, bởi vì đó là cây hoạt động như thế nào
  2. Bây giờ bạn có một cái cây, thêm ngẫu nhiên hoặc sử dụng các thủ thuật thông minh, liên kết đến một phòng khác, và bạn sẽ có chu kỳ và nó dừng lại là một cái cây.
  3. Để có nhiều tính năng như mê cung, lồng lưới, tạo một biểu đồ tổng thể, sau đó bên trong mỗi khối, chạy bất kỳ thuật toán mê cung tổng quát nào để nó liên kết tất cả việc mở nút chính.
  4. Đây là một trò chơi, xin đừng nhầm lẫn người chơi và cung cấp cách hiểu cách điều hướng xung quanh lol.
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.