Tạo bản đồ ngẫu nhiên


63

Tôi đang bắt đầu / bắt đầu một trò chơi RPG tilemap 2D bằng Java và tôi muốn thực hiện việc tạo bản đồ ngẫu nhiên. Tôi có một danh sách các loại gạch khác nhau, (bụi / cát / đá / cỏ / sỏi, v.v.) cùng với gạch nước và gạch đường dẫn, vấn đề tôi gặp phải là tôi không biết bắt đầu tạo bản đồ một cách ngẫu nhiên ở đâu.

Nó sẽ cần phải có các phần địa hình (Giống như một phần của nó sẽ là cát, một phần bụi bẩn, v.v.) Tương tự như cách Minecraft là nơi bạn có các quần xã sinh vật khác nhau và chúng biến đổi liền mạch với nhau. Cuối cùng, tôi cũng sẽ cần thêm các đường dẫn ngẫu nhiên vào đây cũng như đi theo các hướng khác nhau trên khắp bản đồ.

Tôi không yêu cầu bất cứ ai viết cho tôi tất cả các mã hoặc bất cứ điều gì, chỉ cần đưa tôi đi đúng hướng.

tl; dr - Tạo bản đồ ô vuông với các quần xã, đường dẫn và đảm bảo các quần xã liền mạch đi vào nhau.

Câu trả lời:


68

Trong số nhiều câu hỏi liên quan khác trên trang web, có một bài viết thường được liên kết để tạo bản đồ: Tạo bản đồ đa giác cho trò chơi, bạn có thể lượm lặt một số chiến lược tốt từ bài viết đó, nhưng nó thực sự không thể được sử dụng.

Mặc dù không phải là một hướng dẫn, nhưng có một bài viết về cách tạo ra các bản đồ thế giới pháo đài Lùn. Về cơ bản, bạn tạo ra nhiều lớp tiếng ồn, cho chiều cao, độ ẩm, nhiệt độ, độ mặn. Sau đó, bạn sẽ sử dụng một cái gì đó như thế này:

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

Hoặc cái này

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

để tạo ra quần xã sinh vật dựa trên các lớp tiếng ồn bạn tạo ra trước đó. Thông thường, điều này mang lại sự chuyển tiếp khá suôn sẻ giữa các quần xã và quá trình chuyển đổi là hợp lý. Tôi cũng sửa đổi các bản đồ độ ẩm và nhiệt độ dựa trên độ cao. Điều này tự nhiên tạo ra một "dòng gỗ" và tạo ra những ngọn núi đá với mũ tuyết.

Tôi đang sử dụng chiến lược này trong trò chơi của mình và nó tạo ra các bản đồ như thế này rất nhanh:

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

Ngoài ra, bạn có thể thấy tôi cuộn qua một vài bản đồ ở đầu video này .

Và đây là một số chi tiết để giúp bạn bắt đầu:

Làm thế nào tôi có thể tạo một "thế giới" ngẫu nhiên trong một công cụ gạch?

Làm cách nào tôi có thể xác định các vùng tính năng trong một thế giới được tạo theo thủ tục?

Làm cách nào để tạo tiếng ồn rắn có thể điều chỉnh để tạo bản đồ?


Mặc dù liên kết Tạo đa giác cho trò chơi là một bài viết rất hay, tôi không nghĩ nó phù hợp với câu hỏi này vì a) nó không phải là lưới tilemap và b) nó không có quần xã - kết cấu địa hình là dựa trên chiều cao.
Tapio

@Tapio Bạn nói đúng, tôi đã cập nhật thêm thông tin.
MichaelHouse

@ Byte56 Cảm ơn bạn, tất cả những điều này cho tôi một điểm khởi đầu! :)
Tom O

@ Byte56 Tôi nhận thấy bạn đã đề cập đến câu hỏi của tôi từ một vài năm trước, vì vậy tôi đã cập nhật nó với mã làm việc!
Nick Badal

1
BTW, dự án tạo bản đồ đa giác được tạo cho một trò chơi có bản đồ ô vuông không hiển thị độ cao. Độ cao và đa giác ở đó để tạo ra các quần xã nhưng chúng không thực sự được hiển thị trong trò chơi.
amitp

29

Trong khi các câu trả lời khác ở đây thực sự tốt để tạo ra các loại cảnh quan tĩnh sẽ hoạt động cho nhu cầu cụ thể này. Có những phương pháp khác mà mọi người gặp phải câu hỏi này có thể đang tìm kiếm nếu họ muốn tạo cảnh quan thay đổi theo thời gian hoặc xuất hiện thực tế hơn nhiều, bạn có thể làm theo kỹ thuật này.

Không giống như các câu trả lời khác, bạn bắt đầu điều này với một bản đồ hoàn toàn trống rỗng. Bắt đầu với những gì bạn sẽ coi là mực nước biển. Sử dụng tiếng ồn Perlin để thêm biến thể rất nhỏ, nếu bạn có 256 độ cao có thể, không thay đổi nhiều hơn 3-5 theo cả hai hướng. Điều này xây dựng cảnh quan vài tỷ năm đầu tiên của bạn mà không cần phải thực sự chạy mô phỏng trong thời gian dài đó.

Kiến tạo địa tầng

Chia bản đồ dọc theo các đường thẳng hoặc cong để tạo các tấm, hình dạng của các tấm càng chi tiết thì phong cảnh của bạn càng thú vị. Giữ chúng lớn. Cho mỗi tấm một hướng, tốc độ. Trong một khung thời gian nhất định, di chuyển các tấm theo kiểu từng bước trên bản đồ, kéo tất cả các ô bên trên chúng với chúng.

Khi hai tấm giao nhau, hãy lựa chọn cái nào sẽ đi qua và cái nào sẽ đi theo, sự lựa chọn này có thể là ngẫu nhiên. Gạch trên các tấm được chỉ định dưới được giảm ngay lập tức chiều cao 5 bước. Khi một tấm đã được chỉ định trên hoặc dưới, tất cả các tương tác trong tương lai với các tấm sẽ tuân theo các quy tắc sau:

  • Khi một tấm được chỉ định đi qua một tấm không được chỉ định, tấm không được chỉ định sẽ trở thành loại ngược lại. (Vì vậy, các tấm UD trở nên thấp hơn khi vượt qua.)
  • Khi một tấm trên nằm trên một tấm dưới, tất cả các ô đó di chuyển lên các bước độ cao 0-1 và các ô theo đường dẫn của tấm trên.
  • Khi một tấm trên vượt qua một tấm trên, tất cả các ô đó di chuyển lên 1-2 bước và các ô trong vùng vượt qua không còn trôi.
  • Khi một tấm dưới vượt qua một tấm dưới, bất kỳ gạch nào trong khu vực có độ cao lớn hơn 66% cho cả hai mảng trong khu vực giao nhau đều di chuyển lên 1-3 bước (như thể do hoạt động của núi lửa, điều này sẽ tạo ra các đảo trong thời gian đủ ) và gạch trong khu vực này ngừng trôi.

Tất cả các tấm vượt qua chậm 20% tốc độ hiện tại của chúng mỗi bước. Để thêm tính thực tế, thêm một thay đổi ngẫu nhiên -10% đến 10% theo hướng di chuyển mỗi bước.

Sau khi thực hiện số bước mong muốn. Có lẽ 5-10 là nhiều. Bất kỳ gạch nào không có tấm là cư dân, nên được thả xuống mức thấp nhất hiện có.

Lớn hay nhỏ?

Bản đồ này có thể được sử dụng hoặc được mở rộng để tạo bản đồ lớn hơn nhiều bằng cách chia nó thành các khối (ô) 4X4 và mở rộng các phần đó dựa trên độ cao riêng của chúng. Hãy coi độ cao của mỗi ô là một điểm và tạo ra sự tăng màu mượt mà trong bản đồ lớn hơn giữa các điểm đó. Vì vậy, nếu bản đồ lớn hơn là 40X40 thay vì 4X4 và điểm (0,0) là 10 và điểm (0,1) là 1, các ô trên bản đồ lớn hơn giữa chúng sẽ là 10,9,8,7,6 , 5,4,3,2,1 chiều cao. Tiếng ồn Perlin hơn nữa có thể được thêm vào để làm mịn các sườn dốc. Trên tất cả các kỹ thuật chia tỷ lệ này tương tự như thuật toán Diamond Square .

Nước

Để mô phỏng sông hồ, đại dương và mực nước ngầm. Tôi thích sử dụng automata di động .

Cao trở thành phao hoặc phạm vi int mở rộng để cho phép theo dõi hạt mịn hơn. Các tế bào nước có giá trị bão hòa, giả sử trong khoảng 1-256. Các bản đồ nên bắt đầu đồng đều. Bạn sẽ cần chơi với các số cho kích thước bản đồ cá nhân của mình, tuy nhiên nhìn chung bạn sẽ tuân theo các quy tắc như thế này:

  • Nếu một tế bào lân cận bão hòa hơn, tăng độ bão hòa và tăng chiều cao.
  • Nếu một tế bào lân cận ít bão hòa, giảm độ bão hòa và mất chiều cao.

Thực hiện kiểm tra này cho mọi tế bào lân cận. Chạy qua một số bước đủ. Nếu bạn muốn, bạn có thể thêm nhiệt độ vào mô phỏng này bằng cách thay đổi lượng bão hòa bị mất / tăng theo nhiệt độ đó. Bạn cũng có thể thay đổi nó dựa trên độ cao. Hồ và sông tự nhiên nên hình thành. Một số sẽ rơi xuống biển. (Đại dương có thể sẽ không được lấp đầy bởi bất kỳ số liệu nào, nhưng bạn sẽ chỉ định bất cứ thứ gì dưới mực nước biển sẽ được lấp đầy vào cuối cùng.)

Bạn có thể giữ nhiệt độ và dữ liệu bão hòa để sử dụng, như trong các câu trả lời khác, để tạo ra quần xã. Họ nên chính xác và thú vị hơn. Với quần xã sinh vật tuyết ở hai cực và nóng ở giữa (nếu bạn sử dụng một danh sách nhiệt độ tốt nghiệp trơn tru.)

Bạn cũng có thể mô phỏng gió và do đó thay đổi nhiệt độ dựa trên độ cao. Bạn có thể bước qua lại giữa việc chạy mô phỏng nhiệt độ và mô phỏng nước nếu bạn muốn. Tuy nhiên tôi đã không xây dựng bất cứ điều gì bằng cách thay đổi nhiệt độ vì vậy tôi sẽ không bình luận về cách làm điều đó.

Phong cảnh tiến hóa

Nếu bạn giữ các mô phỏng cho đất, nước và nhiệt xung quanh và giảm đáng kể hiệu ứng của chúng và cũng ngăn các tấm chuyển động, bạn có thể tiếp tục thay đổi tất cả các số liệu này theo thời gian. Tôi sẽ không chạy các tính toán rất thường xuyên, nhưng bạn có thể nhận được một bản đồ thế giới phản ứng với những thay đổi theo cách này.

Phần kết luận

Trong khi các loại kỹ thuật này được tham gia nhiều hơn, chúng tạo ra các hiệu ứng thực tế và phát triển hơn rất nhiều. Mang nó cho những gì nó có giá trị?


15

Bạn có thể sử dụng Perlin Noise cho việc tạo địa hình, đây là cách các quần xã trong Minecraft hoạt động. Như bạn có thể thấy anh ta sử dụng bản đồ nhiệt kết hợp với bản đồ mưa để tạo ra các quần xã.

Quần xã từ Minecraft

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.