Thuật toán tạo thị trấn


8

Trong RPG.SE này đăng một trang bị mất từ ​​lâu với một số trình tạo trực tuyến được đề cập.

Tôi đặc biệt tò mò về cách tạo ra các thị trấn. Lấy hình ảnh này làm ví dụ:

Một thị trấn PCG từ Irony Games không còn tồn tại

Mặc dù rất nhiều thứ có thể được cải thiện về mặt đồ họa, nhưng rất tốt khi xem xét các công cụ có sẵn tại thời điểm đó (từ giữa đến cuối thập niên 90):

  • Bố cục đường có vẻ khá hữu cơ (thậm chí xem xét tất cả các đường được đặt theo cách trực giao).
  • Không phải tất cả các con đường đều nhất thiết phải được kết nối, nhưng nó cảm thấy đúng .
  • Các tòa nhà được đặt ở những điểm đáng tin cậy .
  • Ngay cả cây dường như được đặt trong các điểm hợp lý .

Tôi nghĩ sẽ rất vui nếu được thử và tự mình thử. Đặc biệt là vì những nỗ lực trước đây của tôi đã quá "chặn":

Nỗ lực mới nhất của tôi ở thế hệ thành phố

Bạn sẽ nhận thấy rằng tôi đang mô tả nhiều phẩm chất với các tính từ không thể đo lường được ( dường như , cảm thấy , đáng tin cậy , v.v.) vì vậy tôi gặp khó khăn khi dịch chúng sang hướng dẫn và cuối cùng là thuật toán.

Có bất kỳ thuật toán thử và đúng cho thế hệ thị trấn?

Tôi hiểu điều này dường như quá rộng, vì vậy hãy xem xét điều này: Nếu tôi yêu cầu một thuật toán tạo bản đồ khối đất liền lục địa, tôi sẽ nhận được tài liệu tham khảo về Perlin và các thuật toán nhiễu khác ngay lập tức; theo sát bởi Voronoi.

Tôi đã thấy những câu hỏi như thế này nhưng dường như chúng đã có một ý tưởng cụ thể hơn trong đầu (ví dụ: nhà 2x2, số lượng nhà cố định, hạn chế vị trí kênh và đường).

Những gì tôi muốn có là một cái gì đó ít ràng buộc hơn. Ngoại trừ có thể là cách bố trí lưới, sẽ dễ dàng hơn rất nhiều cho lần thử đầu tiên hơn là, hệ thống L.


Các thuật toán liệt kê cho một miền vấn đề rộng thường kết thúc quá rộng để trả lời tốt ở định dạng Hỏi và Đáp của chúng tôi. Chúng tôi thường có may mắn hơn với "Làm cách nào tôi có thể tạo nội dung trò chơi với các đặc điểm cụ thể này " - nơi bạn cung cấp một số tiêu chí hoặc ví dụ tích cực / tiêu cực mà chúng tôi có thể sử dụng để đánh giá các câu trả lời tiềm năng và đánh giá đề xuất tốt nhất. Bạn có thể thử chỉnh sửa câu hỏi của mình để giải thích chi tiết hơn những gì tạo ra một đầu ra thị trấn phù hợp so với một đầu ra ít phù hợp hơn không?
DMGregory

quá rộng, đặc biệt là vì các máy phát như vậy rất có thể là các tổ hợp (ví dụ: bước 1 tạo đường, bước 2 tạo nhà, bước 3 tạo cây). Nếu bạn có thể thu hẹp mọi thứ vào một trình tạo cụ thể và những vấn đề cụ thể mà bạn gặp phải với điều đó, thì điều đó sẽ ít rộng hơn.
congusbongus

1
Chúng tôi cũng có câu hỏi này về thế hệ thành phố thủ tục . Nó có thể hữu ích nếu bạn có thể nói rõ nhu cầu của bạn khác với câu hỏi đó như thế nào.
Pikalek

1
Không có câu trả lời tuyệt vời nào ở đây, nhưng một điều tôi nhận thấy là trong ví dụ điển hình, mọi tòa nhà đều nằm cạnh một con đường, trong khi trong ví dụ của bạn, chúng không như vậy.
dùng1118321

@ user1118321: Trên thực tế, những ngôi nhà không phải lúc nào cũng nằm cạnh một con đường, mà là những mảnh đất là (Cách tiếp cận hiện đại) hoặc ít nhất là có một con đường tiếp theo (có thể là cách tiếp cận cũ hơn, không giống như một ngôi nhà ở sân sau). Vì vậy, không gian không phải là không tự nhiên, như thị trường chẳng hạn.
PSquall

Câu trả lời:


9

Phần mềm Introversion đã tạo ra một trình tạo thành phố thực sự ấn tượng cho dự án Subversion bị hủy vô thời hạn của họ :

Máy phát điện thành phố Subversion

Thuật toán được thiết kế để tạo ra các siêu thị lớn, hiện đại. Nhưng các kỹ thuật tương tự có thể được sử dụng để tạo ra nhiều khu định cư nông thôn.

Đây là một thuật toán từ trên xuống, tạo ra các phác thảo thô trước và sau đó tạo ra ngày càng nhiều chi tiết để phù hợp với chúng (đối với aproach từ dưới lên đối diện để tạo thủ tục, kiểm tra câu trả lời của uliwitness). Đây là một video mà trực quan hóa các thuật toán đang tiến hành .

Thuật toán dường như hoạt động như sau (hơi đơn giản):

  1. Trung tâm thành phố: Chọn một số điểm của bản đồ vẫn còn trống làm nút giao thông chính. Chúng nên được phân bố đều trên bản đồ
  2. Đường cao tốc: Kết nối các nút giao thông chính với hàng xóm của họ và với thế giới bên ngoài bằng các đường chính.
  3. Đường cao tốc: Chia nhỏ các ô được tạo bởi các đường chính bằng cách tạo một số đường nhỏ.
  4. Đường phố: Lặp lại quy trình phân khu theo cách đệ quy với các đường nhỏ hơn và nhỏ hơn cho đến khi bạn đạt được kích thước khối xây dựng mong muốn
  5. Khối: Quyết định mục đích của từng khối xây dựng (khu dân cư, bán lẻ, công ty, công nghiệp ...). Các yếu tố liên quan là kích thước của các con đường lân cận và khoảng cách từ trung tâm.
  6. Phân bổ: Chia các cạnh của tất cả các khối xây dựng thành nhiều lô (điều này có nghĩa là mỗi lô có ít nhất một cạnh được kết nối với một con đường).
  7. Tòa nhà: Tạo một tòa nhà phù hợp cho từng lô.

Về vị trí của cây: Cách tiếp cận đầu tiên của tôi sẽ là tích hợp những thứ trong thuật toán tạo tòa nhà. Một tòa nhà không cần phải điền đầy đủ. Bạn có thể lấp đầy không gian trống với các đồ vật trang trí thích hợp.

Vấn đề với cách tiếp cận từ trên xuống là trong khi nó có thể tạo ra một thành phố hợp lý, nó có thể không tạo ra một thành phố hợp lý với mọi thứ bạn muốn . Giả sử mỗi thành phố trong trò chơi của bạn cần một cửa hàng vũ khí, một cửa hàng áo giáp, một cửa hàng thuốc và một nhà trọ. Thuật toán trên chọn các tòa nhà dựa trên yêu cầu của lô, vì vậy bạn có thể kết thúc với 12 cửa hàng áo giáp nhưng không phải là một quán trọ. Tôi sẽ tiếp cận vấn đề đó trong giai đoạn tạo ra tòa nhà. Trước khi bạn bắt đầu tạo các tòa nhà một cách ngẫu nhiên, hãy xem qua danh sách các tòa nhà bắt buộc của bạn và chọn lô phù hợp nhất cho từng tòa nhà. Sau đó lấp đầy các lô còn lại với các tòa nhà ngẫu nhiên.

Tôi mong được khám phá các thị trấn được tạo theo thủ tục trong trò chơi của bạn.


Tôi hoàn toàn quên đề cập đến các đường phố có kích cỡ khác nhau, điểm tốt!
uliwitness

Cảm ơn! Không chắc chắn tôi sẽ thử từ trên xuống hay từ dưới lên tiếp theo ... nhưng nhận ra tôi có hai lựa chọn khiến bộ não của tôi khởi động trở lại. ;)
Roflo

5

Nhận các ràng buộc từ cuộc sống thực

Thường thì câu trả lời về cách tìm ra thuật toán phù hợp bắt đầu bằng việc xem xét những điều này xảy ra như thế nào trong cuộc sống thực. Bạn đã nhìn vào đó chưa? Ngoài đỉnh đầu, tôi có thể nghĩ về những điều sau đây:

  • Đường ở đó để kết nối các tòa nhà và các điểm quan tâm khác
  • Các tòa nhà được đặt dọc theo các con đường hiện có, nếu có thể
  • Nếu không có đường, một tòa nhà được đặt ở một vị trí trống và được kết nối với một con đường gần đó thông qua con đường của chính nó
  • Các tòa nhà được đặt gần các tòa nhà khác mà người dân của họ quan tâm: Mọi người chuyển đến sống gần nơi làm việc, cửa hàng thực phẩm và quần áo, v.v.
  • Các tòa nhà được đặt gần các tài nguyên cần thiết cho mục đích sử dụng của họ. Ví dụ, một xưởng cưa được đặt gần rừng, hoặc thậm chí trong một khu rừng trống. con người cần nước và thức ăn (thực vật, động vật) để sống ở đâu đó.
  • Các tòa nhà được đặt cách xa các tòa nhà khác gây bất lợi cho mục đích sử dụng của chúng, hoặc chúng sẽ gây bất lợi. Ví dụ, cửa hàng của thợ nhuộm có mùi rất kinh khủng, vì vậy thường không được đặt trong khu dân cư. Tương tự, quán rượu và nhà hàng rất ồn ào, vì vậy cư dân không muốn sống trên đỉnh của họ, nhưng cần khách hàng, vì vậy cần phải ở gần khu dân cư.
  • Một số quốc gia có luật quy hoạch cũng ảnh hưởng đến vị trí xây dựng. Thông thường đây là một cách chính thức hơn để dự đoán loại công trình nào có thể gây bất lợi cho nhau hoặc tài nguyên nào là duy nhất cho khu vực (như đất chất lượng cao dành cho các cánh đồng, không phải để xây dựng bãi đỗ xe).
  • Các tòa nhà dành cho cư dân, và phong cách và sở thích cá nhân của họ được phản ánh trong đó. Ví dụ, nếu dân số nghèo, họ có nhiều khả năng chia sẻ mặt đất (tòa nhà chọc trời, chung cư), nếu họ khá giả hơn, họ có thể nhận được bao cao su, nếu họ giàu, họ có một biệt thự độc lập. Nếu một số nhóm nhất định không thích các nhóm khác, họ sẽ ít có khả năng cùng sinh sống. Nếu có một mối quan hệ giữa các nhóm nhất định, họ có thể di chuyển vào các khu vực tương tự.

Áp dụng chúng cho địa hình của bạn

Khi bạn có những ràng buộc này, bạn có thể cố gắng xây dựng một thuật toán xung quanh nó. Ví dụ: tạo địa hình của bạn và phân phối các tài nguyên cần thiết trên bản đồ (có thể để mắt đến việc đặt các khoản tiền gửi nhỏ của các tài nguyên quan trọng nhất trong khu vực bắt đầu, sau đó các khoản tiền gửi lớn hơn ở xa và xa nhau). Tất nhiên, đây là lúc nhu cầu và cơ chế trò chơi của bạn phát huy tác dụng, nhưng có khả năng bạn cũng sẽ thêm một yếu tố ngẫu nhiên.

Sau đó xây dựng các doanh nghiệp (và các tòa nhà dân cư của họ) gần những tài nguyên sử dụng chúng. Ví dụ một mỏ đá bên cạnh một ngọn núi lớn. Sau đó thêm cơ sở hạ tầng cần thiết cho họ. Ví dụ, một bưu điện giao dịch với bưu điện và quán rượu nơi họ có thể kinh doanh và bán sản phẩm của họ, một lò rèn để cung cấp các công cụ, v.v.

Để quyết định xem đi đâu, hãy chia bản đồ thành các ô trong đó bạn tính một số cho mỗi ô như thế nào là mong muốn cho một mục đích nhất định, sử dụng hàm trọng số. Đặt các tòa nhà trong gạch mong muốn nhất cho loại công trình đó. Thêm các quy tắc như "một bài giao dịch có thể xử lý 50 doanh nghiệp hoặc 100 nhà", điều này làm tăng khả năng thêm một bài đăng giao dịch khác nếu một thành phố đạt đến quy mô nhất định.

Một khi bạn có điều này, bạn sẽ nhận được một số bản đồ khá phong nha. Nếu bạn nhận thấy rằng tất cả các bản đồ đều có hình dạng không tự nhiên, hãy thêm các hình phạt cho các hàm trọng số của bạn cho các hình dạng đó, như "nếu đường của tôi kết thúc ngay bên cạnh một đường khác, -100 mong muốn" hoặc "nếu đường của tôi đi qua chính nó, -100 mong muốn "v.v. Bạn luôn có thể thêm vào một yếu tố ngẫu nhiên để cho phép điều này mang lại cảm giác kỳ quặc hơn, hoặc thêm các cơ chế khác như" nếu một ngã tư có nhiều hơn N tòa nhà được kết nối với đường của nó, hãy biến nó thành một bùng binh ".

Bạn thậm chí có thể sử dụng các ràng buộc này để tạo cho các bản đồ khác nhau một cảm giác khác nhau, như làm cho một quốc gia nào đó có nhiều ngọn núi hơn trong địa hình hoặc có một nền văn hóa nhất định xây dựng nhiều con đường quanh co hơn và một con đường khác thích những con đường thẳng, v.v. Tất cả chỉ bằng cách sửa đổi một trong những hàm trọng số.

Đơn giản hóa

Tất nhiên, cách tiếp cận này quá phức tạp đối với các trò chơi không giao dịch mô phỏng, nhưng dù sao đi nữa, và xem loại công trình nào có ý nghĩa cho trò chơi của bạn và loại bỏ những thứ không cần thiết. Sau đó, đưa ra các quy tắc đơn giản như "đặt các thành phố gần sông, núi hoặc đất tốt. 1 tòa nhà trên 100 tài nguyên, các doanh nghiệp dựa trên loại tài nguyên, 10 tòa nhà dân cư cho mỗi bộ tài nguyên chế biến / thực phẩm đầy đủ ... hoặc chỉ" 1 triệu sông / 1m2 đất có thể hỗ trợ 10 tòa nhà dân cư ... bất cứ điều gì có ý nghĩa cho một trò chơi. Tuy nhiên, một khi bạn biết bạn có bao nhiêu diện tích (ví dụ: không có tòa nhà nào ở sườn núi dốc) và khu vực đó có thể hỗ trợ bao nhiêu tòa nhà, chỉ cần đặt các tòa nhà trong khu vực đó cho đến khi đầy (như, 1 tòa nhà kinh doanh, 10 khu dân cư , 3 cơ sở hạ tầng, hoặc bất cứ điều gì) và kết nối chúng với đường.


1
Câu trả lời này mô tả cách tiếp cận từ dưới lên để tạo thủ tục. Nó khen rất tốt với câu trả lời của tôi trong đó mô tả một ví dụ về cách tiếp cận từ trên xuống ngược lại. Cả hai phương pháp đều có ưu điểm và nhược điểm. Ưu điểm của từ dưới lên là bạn có khả năng kiểm soát rất tốt đối với những vật thể bạn có trong thành phố được tạo ra. Nhược điểm là bạn cần một bộ quy tắc phức tạp và dễ vỡ hơn nhiều để tạo ra một thị trấn trông giống như thực tế.
Philipp

Vâng. Cũng phụ thuộc rất nhiều vào loại trò chơi và bố trí thành phố mong muốn. Từ dưới lên hoạt động tốt hơn cho các thành phố nhỏ hơn, theo phong cách trung cổ, phát triển tự nhiên, trong khi từ trên xuống hoạt động tốt hơn cho các thành phố và đô thị kiểu Mỹ. Tương tự, nếu bạn có một trò chơi liên quan đến các tòa nhà chức năng và quản lý tài nguyên, từ dưới lên có thể giúp bạn kiểm soát tốt hơn, trong khi từ trên xuống là tối ưu hóa tốt nhất cho các thành phố trong các trò chơi đua xe, v.v ... nơi bạn thực sự không quan tâm đến chức năng của các tòa nhà .
uliwitness

Cảm ơn câu trả lời. Have you looked into that?Tôi có. Chà, đại loại thế (tôi không thể nghĩ ra nhiều "quy tắc thực tế"). Nhưng đây là một điều khá khó hiểu so với những nỗ lực trước đây của tôi: Tôi đã không nhận ra các tài nguyên mà tôi có thể không rút ra được (ví dụ: có một khu rừng ở phía đông ... bất kể tôi có vẽ hay không).
Roflo
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.