Tăng xác suất cho các ô tương tự tạo ra cạnh nhau


9

Tôi đang làm việc trên một hệ thống bản đồ gạch, trông giống như thế này (màu xanh lá cây là cỏ, không khí là màu trắng, đá là màu xám và màu xanh là nước):

Gạch ốp lát

Nó sử dụng một trình tạo số ngẫu nhiên đơn giản để có 45% khả năng gạch là cỏ, 30% khả năng nó là nước và 25% khả năng nó là đá.

Có cách nào tôi có thể tăng xu hướng các khối cỏ / đá kết lại với nhau để tạo thành các khối đất và tạo ra các khối nước tạo thành các đại dương (giống như những gì có thể thấy trong một trò chơi như Minecraft) không?

Câu trả lời:


17

Bạn có thể sử dụng một thuật toán kiểm tra các khối gần và thay đổi xác suất tùy thuộc vào những gì ở đó - nhưng tôi nghĩ đó phần lớn là cách tiếp cận sai.

Những gì bạn muốn được xem xét là các loại tiếng ồn fractal - trong trường hợp này, tiếng ồn perlin hoặc đơn giản. Nếu bạn tạo ra tiếng ồn, bạn sẽ nhận được các giá trị từ -1 đến 1.

http://en.wikipedia.org/wiki/Perlin_noir

Sau đó, bạn có thể điều chỉnh mực nước của mình bằng cách đặt ngưỡng của những gì tạo ra nước. Đối với các khối khác, bạn có thể chạy một tiếng ồn thứ hai để chuyển đổi giữa đá và cỏ. (bằng cách này bạn có thể có những mảng nước lớn, nhưng những khối đá nhỏ hơn).

getTerrain(x,y) {
if(perlin_noise(x,y) > 0) {
    if(perlin_noise(x * scale,y * scale) > 0) {
        return rock
    } else {
        return dirt
    }
} else {
    return water
}

Vì tôi nghĩ rằng phương pháp quét và quăng quá phức tạp và không quá mạnh mẽ, tôi sẽ đề xuất một phương pháp khác mà tôi rất thích:

Đặt một lưới trên bản đồ của bạn, phá vỡ bản đồ thành các hình vuông lớn.

Tạo một số ngẫu nhiên tại mỗi giao lộ (từ 0 đến 1 sẽ hoạt động theo tỷ lệ phần trăm của bạn)

Chia nhỏ bằng cách cắt mỗi hình vuông thành 4 hình vuông chẵn - theo các đường cũ và nơi bạn tìm thấy các đường phân chia, tạo một số ngẫu nhiên giữa 2 điểm liền kề, tương tự, đối với tâm của chữ thập, tạo ra một điểm nằm giữa điểm cao nhất và các giá trị thấp nhất.

Rửa sạch và lặp lại. Bạn sẽ nhận được sự ngẫu nhiên ban đầu từ lần đầu tiên, nhưng những lần sau sẽ mang lại sự đồng nhất Xin lỗi cho các số ngẫu nhiên psuedo:

0-------5  0---3---5 0-1-3-4-5 011233455
|       |  |   |   | | | | | | 012344555
|       |  |   |   | 0-2-4-6-5 002445665
|       |  |   |   | | | | | | 123445666
|       |  2---5---7 2-4-5-7-7 234455777
|       |  |   |   | | | | | | 233455688
|       |  |   |   | 2-3-5-5-9 223455589
|       |  |   |   | | | | | | 233455589
2-------9  2---4---9 2-4-4-5-9 234445579

Điều này thậm chí còn hiệu quả hơn đối với các hình tam giác, bởi vì bạn không có thanh ngang bị mất khi bạn chia nhỏ.

Tất nhiên, kết quả tốt nhất tuyệt đối sẽ đến từ việc kết hợp các phương pháp này - lớp trên lớp, một số kỹ thuật sẽ mang lại cho bạn những khối đất lớn, những cái khác sẽ cho bạn những hang động tuyệt vời, những cái khác hoạt động cho những ngọn đồi và nhiều thứ khác sẽ hoạt động cho hệ thống nước.


+1 Vì tôi nghĩ rằng việc nhảy sang tiếng nói chung là nơi điều này sẽ dẫn đến .. Tôi tự hỏi liệu đó có phải là một bước nhảy quá lớn hay không, vì vậy, việc quét xung quanh và thay đổi phần trăm đã giúp tôi bỏ phiếu :)
James

3

Tiếng ồn là một giải pháp tốt, như đã được đề cập. Một tùy chọn khác là lấy một lượt thứ hai tại dữ liệu để đưa nó về phía bố cục mà bạn muốn. Gaussian Blur là một trong nhiều cách bạn có thể đạt được điều này. Thực hiện một lượt với điều đó sẽ giúp bạn có được những đốm tròn "đẹp" của từng loại.

Cho dù bạn đi theo phương pháp nào đi chăng nữa, một điều quan trọng cần ghi nhớ là lưu trữ kết quả của quy trình ở một vị trí mới. Nếu bạn sửa đổi bản đồ tại chỗ, các phần bạn đã xử lý sẽ bắt đầu ảnh hưởng đến thuật toán và bạn sẽ kết thúc với một số mẫu lạ.


2

Một cách tương đối đơn giản để làm điều này sẽ là tạo ra một số hạt nhân tại các vị trí ngẫu nhiên. Vẽ sơ đồ Voronoi của những điểm này. Chỉ định một yếu tố cho từng khu vực của kết quả.

Điều này dẫn đến một cái gì đó khá xấu xí và máy móc. Bùn lên biên giới một chút và bạn sẽ ở trong tình trạng tốt.

Nếu bạn đang tạo một bản đồ lớn, bạn có thể làm điều này ở hai cấp độ. Tạo sơ đồ Voronoi ban đầu của bạn bằng cách sử dụng 20 hạt nhân và gọi mỗi vùng kết quả là một quốc gia. Tạo một sơ đồ khác bằng 400 hạt nhân và gọi mỗi vùng kết quả là một khu vực.

Tất cả các khu vực phụ thuộc hoàn toàn trong một quốc gia sẽ có yếu tố quốc gia. Vicarages một phần được chứa trong hai hoặc nhiều quốc gia sẽ lấy một trong các yếu tố kèm theo của quốc gia đó một cách ngẫu nhiên.

Bài đăng này xứng đáng có một hình ảnh, nhưng tôi quá lười để cung cấp một hình ảnh.


2

Trình tạo bản đồ đa giác sẽ là một cách đọc tốt để tạo bản đồ với các 'vùng' khác nhau, điều này cũng sẽ cung cấp cho bạn bản đồ được hình thành tốt hơn. Nó dựa trên sơ đồ voronoi nhưng tôi đoán đây sẽ là một khởi đầu tốt cho nó.


0

bạn có thể làm điều đó bằng phương pháp này:

  • đặt tất cả các gạch trong danh sách không xác định
  • trong khi có một ô trong danh sách không xác định
  • bắt đầu
  • chọn một ô từ danh sách đó
  • kiểm tra hàng xóm của gạch đó và chọn một loại tùy thuộc vào hàng xóm của nó
  • xóa gạch đó khỏi danh sách không xác định
  • kết thúc
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.