Thủ tục tạo ra một tòa nhà của khu vực cụ thể


15

Bản thân tôi và một nhóm đang làm việc trong một trò chơi xây dựng nhà máy cung cấp cho người chơi một nhà máy ngẫu nhiên khi bắt đầu trò chơi. Để cố gắng đảm bảo có ý nghĩa về "sự công bằng", lý tưởng nhất là nhà máy được tạo ngẫu nhiên sẽ có một khu vực trong một vài đơn vị (giá trị giữ chỗ) 30.

Rất đơn giản để viết một trình tạo hình chữ nhật ngẫu nhiên cơ bản để đáp ứng các thông số kỹ thuật này, nhưng mục tiêu của chúng tôi là nhà máy phức tạp hơn, có thể được tạo thành từ 2, 3 hoặc thậm chí 4 hình chữ nhật giao nhau, tạo ra các hình dạng phức tạp hơn (nghĩ về L, Tòa nhà hình chữ U và chữ O).

Tôi đã thử tạo một hình chữ nhật ngẫu nhiên và sau đó sử dụng đại số cơ bản để điền vào hình chữ nhật thứ 2, nhưng cho đến nay tôi không có may mắn thực hiện hơn 2 hình chữ nhật, và thậm chí sau đó tôi không hài lòng với kết quả cho thiết kế 2 hình chữ nhật .

Một số thông tin liên quan khác: 2D từ trên xuống Một số cơ học là kiểu nhân tố nên các phòng nên có chiều dài và chiều rộng hợp lý để có chỗ cho máy móc Hiện tại trong Java và Lua (có thể sử dụng các thư viện được xây dựng từ nếu cần)

Cảm ơn trước!

EDIT: Khi tôi nói đầu ra "tốt" hoặc "xấu", đầu ra xấu sẽ là bất kỳ đầu ra nào có không gian không thể sử dụng được bởi người chơi. Giới hạn hình dạng nhà máy nơi người chơi có thể đặt các máy móc của nhà máy như băng chuyền. Lý tưởng nhất, nhà máy không nên có các khu vực chỉ rộng 1-2 khối, hình dạng không nên là một hoặc hai hình chữ nhật lớn với một dòng 1-2 khối "treo" ra một bên. Một đầu ra tốt sẽ là nơi tất cả các không gian sàn là "hoàn toàn khả thi", vì vậy tất cả các khu vực rộng tối thiểu 3-4 khối. Một đầu ra tốt không phải lúc nào cũng phải phức tạp (1 hoặc 2 hình chữ nhật là được), nhưng nó sẽ có cơ hội công bằng nếu được tạo thành từ hơn 1-2 hình chữ nhật.

Câu trả lời:


7

Bạn có thể sử dụng trước khi tạo polyominoes như hình dạng meta để xây dựng một loại của các tòa nhà.

Giả sử khoảng cách tối thiểu chấp nhận được của bạn là 3 khối. Sau đó, đơn vị xây dựng nhỏ nhất có thể chấp nhận chúng tôi sẽ xem xét là 3x3. Để thuận tiện, tôi sẽ gọi đó là một tế bào và nó có diện tích 9 khối. Tiếp theo, lấy khu vực bắt đầu mục tiêu của bạn và chia nó cho khu vực tế bào. Sử dụng giá trị bắt đầu mà bạn đã đưa ra, chúng tôi nhận được 3,33; vì vậy 3 ô sẽ cung cấp cho bạn ít hơn một chút so với bạn muốn và 4 ô sẽ cung cấp cho bạn nhiều hơn.

Từ đây bạn có một vài lựa chọn. Nếu bạn linh hoạt trong khu vực bắt đầu của mình, hãy sử dụng bất kỳ phương pháp nào phù hợp nhất với bạn để chọn số lượng ô cung cấp cho bạn số lượng chấp nhận được (ví dụ làm tròn đến giá trị gần nhất, làm tròn, v.v.). Tôi sẽ gọi đây là số lượng tế bào.

Tiếp theo, chọn ngẫu nhiên polyomino với số lượng tế bào mong muốn. Thay thế mỗi hình vuông trên polyomino bằng một ô xây dựng & bạn có hình dạng cuối cùng của mình.

Để minh họa, nói rằng chúng ta chọn làm tròn xuống. Dưới đây là tất cả các đa giác kích thước 3 (không bao gồm các phép quay / lật):

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

Giả sử chúng ta chọn ngẫu nhiên hình chữ L và áp dụng xoay ngẫu nhiên, tòa nhà của bạn sẽ có bố cục như sau:

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

Một vài vấn đề. Đầu tiên, có giới hạn về số lượng ô bạn có thể sử dụng. Wikipedia sẽ cung cấp cho bạn tất cả các đa giác có kích thước lên tới 8 ( octomino ). Nó bao gồm dữ liệu tóm tắt cho tới cỡ 12, nhưng tôi không biết liệu có một danh sách trực tuyến cho tất cả chúng không. Thứ hai, giải pháp trên chỉ hoạt động chính xác cho kích thước tòa nhà là bội số của 9. Có một số cách để khắc phục một số vấn đề sau:

1) Sử dụng kích thước ô khác nhau. Ví dụ: 3x4, 4x4, v.v.

2) Thêm các tế bào bổ sung cho một polyomino bắt đầu. Điều này có thể khó khăn nếu bạn phải đảm bảo tất cả các hình dạng đều có khả năng như nhau, nhưng rất có thể đối với hầu hết các mục đích của nhà phát triển trò chơi, bạn không cần một sự phân phối đồng đều các hình dạng tòa nhà.

3) Đưa ra một tòa nhà để làm cho nó lớn hơn. Quay trở lại ví dụ, nếu bạn sử dụng 3 ô, tòa nhà của bạn sẽ có diện tích 27 ô vuông khiến bạn ngắn lại 3. Sau đó, bạn có thể quét chu vi cho một vị trí để dán một nhóm hình vuông có kích thước 1x3. Miễn là nhóm trang điểm của bạn ít nhất là AxB trong đó A ít nhất là khoảng cách tối thiểu chấp nhận được của bạn, kết quả của bạn sẽ không vi phạm ràng buộc khoảng cách tối thiểu chấp nhận được của bạn. Xây dựng ví dụ trên, đây là một minh họa về một kết quả có thể xảy ra:

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

4) Thay vì đệm một tòa nhà quá nhỏ, bạn có thể cắt bớt một tòa nhà quá lớn. Đảm bảo rằng ràng buộc khoảng cách tối thiểu chấp nhận được của bạn được theo dõi phức tạp hơn tùy chọn đệm, nhưng sẽ cung cấp cho bạn nhiều lựa chọn thay thế để xem xét.

Một số ý kiến ​​khác:

Chỉ vì bạn có thể sử dụng tất cả các đa giác có thể có kích thước nhất định không có nghĩa là bạn nên. Nếu một số trong số chúng không vui, phá vỡ chủ đề của bạn, gây khó chịu cho khán giả của bạn (mẫu hình chữ vạn) hoặc gây ra một số vấn đề khác, hãy đưa chúng ra ngoài. Ngoài ra, bạn có thể cân nhắc thói quen lựa chọn của mình nếu một số mẫu thú vị, nhưng quá kỳ lạ để thường xuyên bật lên. Cuối cùng, bạn có thể sử dụng giải pháp này kết hợp với chiến lược hiện tại của bạn. Có thể 70% thời gian bạn tạo các tòa nhà hình chữ nhật & 30% thời gian bạn sử dụng phương pháp polyomino. Hoặc có thể bạn bắt đầu với một tòa nhà hình chữ nhật và dán một polyomino nhỏ ra bên ngoài.


16

Một cách đơn giản để xây dựng một trình tạo thủ tục là:

  1. Xây dựng ngẫu nhiên mọi thứ
  2. Chạy một chức năng kiểm tra xem đầu ra có tốt không
  3. Nếu đầu ra không tốt, chuyển sang bước 1

Ngay cả khi phải mất hàng ngàn lần chạy để hoàn thành, hầu hết các máy phát điện đơn giản vẫn hoạt động tốt với phương pháp này. Ưu điểm là không có nhiều thông minh cần thiết trong máy phát điện, và vì việc kiểm tra xem một thứ gì đó tốt có dễ hơn nhiều so với việc xây dựng thứ gì đó tốt 100% không, cách tiếp cận này rất dễ dàng.

Bạn đã liệt kê một số biện pháp khách quan về việc liệu đầu ra có tốt không; đủ để bạn tạo ra một máy phát điện nhanh và bẩn. Đặt hình chữ nhật ngẫu nhiên bên trong một khu vực và từ chối đầu ra nếu, ví dụ, có những khu vực chỉ rộng 1-2 khối.

Bắt đầu với điều đó, cải thiện và tối ưu hóa sau đó.


Cảm ơn bạn! Tôi nhớ đã xem xét điều này, nhưng ý nghĩ về việc có cơ hội trong vài giây + thời gian tải đã dừng tôi lại. Bây giờ tôi nhận ra cơ hội đó nhỏ đến mức nào. Tôi sẽ phải thử nó, nhưng tôi có thể chờ xem ai đó có giải pháp trực tiếp hơn trước không.
dùng2129189

@ user2129189 Khi bạn chạy trình tạo, bạn vẫn có thể điều chỉnh phạm vi số ngẫu nhiên của nó để tránh tạo bố cục không có khả năng vượt qua bài kiểm tra. Cũng có thể song song thuật toán tạo thử và lỗi này trên nhiều lõi bằng cách mỗi lõi tạo một bố cục tại một thời điểm.
Philipp

3
Bản thân tôi không phải là người hâm mộ các phương pháp tạo ra từ chối và thử lại. Chúng đủ nhanh khi trình tạo của bạn chỉ làm một điều đơn giản, nhưng đối với các cấp độ trò chơi, chúng tôi thường bắt đầu xếp lớp nhiều tính năng hơn và các bước tạo để tạo bản đồ phong phú hơn. Tại thời điểm đó, xác suất trúng bản đồ khả thi là sản phẩm của xác suất mỗi bước thành công, có thể co lại nhanh chóng. Đây không chỉ là mối quan tâm về mặt học thuật - Tôi đã nói chuyện với các nhà phát triển, những người phải triển khai hệ thống bộ nhớ đệm hạt giống tốt / xấu để tránh thời gian phát sinh quá mức, khi một trình tạo pass đơn được xây dựng chính xác sẽ dễ dàng hơn.
DMGregory

@DMGregory vâng tôi chắc chắn có thể thấy điều đó. Một trình tạo ngẫu nhiên cơ bản sẽ hoạt động giống như 99% thời gian trong một vài lần cho trường hợp của tôi, nhưng nếu tôi muốn thêm độ phức tạp sau này, nó có thể chậm lại đáng kể. Bất cứ ai cũng biết về bất kỳ ứng dụng lập trình / trò chơi thực tế nào của mô hình đoán và kiểm tra?
dùng2129189

Có lẽ có thể có các chức năng và kiểm tra các thế hệ, chú ý để phù hợp với các giai đoạn của các điều kiện với mức độ tạo ra hiện tại. Bằng cách đó, toàn bộ cấp độ không cần phải được tạo lại toàn bộ chỉ từ lỗi được tìm thấy đặt một mục không chính xác.
Pysis

7

Đưa ra một hạn chế về "tất cả các khu vực đều rộng tối thiểu 3-4 khối", ý tưởng đầu tiên nảy ra trong đầu tôi là một cái gì đó như sau:

  1. chọn một trong 3x3, 3x4, 4x3 hoặc 4x4
  2. đặt một khối có kích thước đó vào trung tâm của lưới
  3. chọn một hướng (lên, trái, phải, xuống)
  4. cố gắng đặt một khối 3x3 cùng với các khối được đặt trước đó theo hướng đó
  5. nếu thành công, với một số xác suất, hãy thử mở rộng khối thành khối 4x3 theo một trong những hướng bạn không chọn
  6. với một số xác suất, di chuyển đến cạnh ngẫu nhiên của khối được điền
  7. Lặp lại các bước từ 3 đến 6 cho đến khi diện tích đủ lớn

Ý tưởng cơ bản là, nếu bạn muốn tất cả các khu vực có ít nhất một kích thước nhất định, chỉ hoạt động trong các khu vực có kích thước đó. Tổng quát hơn, nếu bạn muốn một cái gì đó đúng với tất cả các đầu ra được tạo, hãy xem liệu nó có thể được làm đúng với tất cả các đầu ra được tạo một phần không.


4
Tôi đơn giản hóa mọi thứ bằng cách luôn bắt đầu từ một khối 3x3, sau đó thêm các khối 3x1 vào các vị trí ngẫu nhiên trong đó mỗi ô vuông liền kề với một khối hiện có. Thêm vào một khối 3x3, có bốn vị trí có thể. Tất cả cung cấp cho bạn một khối 3x4, với sáu vị trí có thể cho vị trí tiếp theo. Từ đó trở nên phức tạp hơn, nhưng không quá tệ.
JollyJoker

0

Cân nhắc sử dụng booleans KHÔNG và UNION và chọn ngẫu nhiên giữa chúng.

  1. Đặt một hình chữ nhật ngẫu nhiên.
  2. Đặt một hình chữ nhật ngẫu nhiên thứ hai.
  3. Chọn ngẫu nhiên để UNION chúng hoặc SUBTRACT cái thứ hai từ cái đầu tiên.
  4. Lặp lại cho một số hình chữ nhật. Mặc dù, chỉ có hai hoặc ba có thể cho kết quả đủ hợp lý.

Sau đó, tôi sẽ tính diện tích và tăng tỷ lệ lên hoặc xuống để phù hợp hơn với kích thước gần đúng mà bạn tìm kiếm, và sau đó kiểm tra rằng không có kích thước nào nhỏ hơn số lượng tối thiểu bắt buộc.


Ý tưởng mở rộng của bạn để có được khu vực mong muốn thực sự yên tĩnh thông minh. Tôi có thể thực hiện một cái gì đó yên tĩnh một chút như thế này.
dùng2129189
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.