Chức năng hạt giống ngẫu nhiên để tạo bản đồ?


28

Tôi đang tìm kiếm một chức năng để tạo một bản đồ dựa trên ô ngẫu nhiên làm ranh giới trực quan của bản đồ thay đổi (bằng cách đi qua bản đồ). Tôi muốn bản đồ rộng vô hạn và có cấu trúc giống như mê cung.

Tuy nhiên, nếu thế giới là vô tận, quay trở lại nơi mà một người chơi đã ở trước khi phát sinh vấn đề. Trò chơi phải nhớ mọi thứ ở đó thực sự trông như thế nào.

Vì vậy, tôi đã suy nghĩ - "Minecraft giải quyết vấn đề này như thế nào?" và tôi tự nghĩ rằng họ phải sử dụng một loại hàm số ngẫu nhiên nào đó với một hạt giống, có thể đi tiếp nhưng cũng có thể lùi lại, và theo cách đó, tạo lại các ô cũ chính xác như chúng, nhưng trong các trường hợp mới.

Suy nghĩ của bạn về điều này là gì?


Làm thế nào là câu trả lời của tôi là +5 nhưng câu hỏi chỉ ở mức +2? Đây là một trong những câu hỏi hay nhất trên trang nhất ngay bây giờ.

2
không phải minecraft chỉ đơn giản là lưu trữ các đoạn bạn đã truy cập / sửa đổi?
FxIII

@FxIII: Minecraft phải, vì bạn có thể sửa đổi cảnh quan. Nếu bạn không thể làm điều đó, việc lưu trữ các khối có thể là một sự lãng phí hoặc ít nhất là một sự quá mức.

@Joe Wreschnig: Ok, Ok ... Tôi sợ rằng tôi đã bỏ lỡ một cái gì đó thực sự lớn!
FxIII

Câu trả lời:


20

Điều bạn nhận thấy là sự khác biệt giữa bộ tạo số ngẫu nhiênhàm nhiễu . Một trình tạo số ngẫu nhiên tạo ra một số khác nhau mỗi lần bạn gọi nó. Hàm nhiễu lấy một số đối số - giả sử, ánh xạ x và y - và tạo ra các số có thuộc tính thống kê giống như ngẫu nhiên , nhưng cùng một giá trị cho cùng một đối số , nghĩa là nó là một hàm toán học thích hợp.

Hai người có liên quan rất chặt chẽ. Một hàm nhiễu có thể mô phỏng một trình tạo số ngẫu nhiên, bằng cách chuyển vào một giá trị khác nhau mỗi lần - ví dụ noise(1), noise(2)v.v. Và một bộ tạo số ngẫu nhiên, được đổ vào một cái bàn khổng lồ, có thể hoạt động như một hàm nhiễu. Trong cả hai trường hợp, bạn đang sử dụng công cụ sai cho công việc.

Minecraft đặc biệt sử dụng Perlin tiếng ồn , một loại tiếng ồn mà là giá rẻ để tính toán, và có một tài sản mong muốn trở liên tục trong nhiều khía cạnh như bạn cần - nếu bạn tạo biểu đồ f(x)để f(x + 1), sẽ không có bất kỳ bước nhảy đột ngột. Điều này làm cho nó rất hữu ích cho nhiều thứ như điều chế kết cấu, mây và khí thể tích và tạo địa hình.

Nếu bạn đang tìm kiếm một triển khai để bắt đầu chơi, máy tạo tiếng ồn Perlin cải tiến của Ken Perlin là một trong những triển khai đơn giản nhất.


3
Lưu ý rằng rất nhiều trình tạo số ngẫu nhiên sử dụng một hạt giống và sẽ tạo ra cùng một bộ số được cung cấp cùng một hạt giống.
thedaian

3
@thedaian: Điều này không đặc biệt hữu ích trong trường hợp này, trừ khi bạn muốn tạo lại mọi số; một chức năng tiếng ồn cho phép bạn có được số thứ 500 mà không phải tạo ra 499 trước đó.

Với thuật toán Perlin Noise, có thể hiệu chỉnh nó? Hãy xem xét tôi muốn thuật toán có nhiều khả năng tạo ra một gói gạch ốp tường, và sau đó là một gói gạch không gian.
Mathias Lykkegaard Lorenzen

3
Bạn đã không đọc và hiểu các liên kết tôi đã đưa ra trong sáu phút.

1
Câu trả lời này đã được hoàn thành với bài đăng trên blog của Notch: notch.tumblr.com/post/3746989361/terrain-generation-part-1
deceleratedcaviar

3

Cách Minecraft kiểm soát thế hệ của nó là bằng cách tạo một hạt giống cấp độ được sử dụng để gieo tất cả các thế hệ số ngẫu nhiên cho trò chơi. Nếu một đoạn không tồn tại trên đĩa khi được yêu cầu, nó sẽ được tạo bằng hàm tạo của Notch dựa trên hạt giống của cấp; Sau đó, nó sẽ được lưu vào đĩa .

Có vẻ như bạn đang muốn đạt được hành vi tương tự, vì vậy đó là cách an toàn.


2

Như Joe đã chỉ ra, bạn đang tìm kiếm một hàm băm. Nói chung, các hàm ngẫu nhiên chỉ là các hàm băm được gieo bằng số trả về cuối cùng. Vì vậy, nếu được Random()trả lại Hash(seed)=1234, một cuộc gọi thứ hai Random()sẽ trở lại Hash(1234), cứ như vậy.

Nếu bạn đang tìm kiếm một hàm băm đơn giản cho các số ngẫu nhiên giả, hãy xem MurMurHash . Tôi đã triển khai nó trong C # và có thể đăng nó ở đâu đó nếu bạn quan tâm. Thông tin chi tiết hơn về Perlin Noise, sử dụng hàm băm như vậy, có thể tìm thấy ở đây và việc triển khai nó trong C # có ở đây .

Tất cả thông tin này đến từ một câu hỏi tôi đã hỏi một năm trước đây trên Stack Overflow. Những gì bạn đang tìm kiếm được gọi là tạo nội dung theo thủ tục, vì vậy nếu bạn cần thêm thông tin, hãy tìm kiếm nó. Chúc bạn tạo địa hình vui vẻ!


-1. Băm của Perlin, tại đó, không giống với các kỹ thuật được sử dụng trong MMH hoặc các thói quen băm mật mã khác; mã C # là rác dường như chỉ thực hiện phép nội suy tuyến tính giữa các giá trị ngẫu nhiên; nó đòi hỏi nhiều bộ nhớ hơn tiếng ồn Perlin thích hợp và có khả năng chạy chậm hơn.

1
@Joe - Tôi xin lỗi bạn cảm thấy rất mạnh mẽ về việc triển khai Perlin Noise. Tiếng ồn Perlin tự nó là một khái niệm biến một hàm băm thành một hàm nhiễu liên tục. Tôi đã tạo ra rất nhiều tiếng ồn Perlin rất hiệu quả với MurMurHash. Đối với mã C #, đây là một ví dụ về cách xác định theo chương trình giá trị của một điểm trong Nhiễu Perlin 2D. Tôi sẽ không bao giờ sử dụng nó trong sản xuất, nhưng theo tôi, nó dễ đi qua hơn mã bạn đã đăng.
dlras2

1
OP không có kiến ​​thức về tiếng ồn hoặc băm, vì vậy tôi chỉ cố gắng cung cấp tài liệu tham khảo với hy vọng họ sẽ điều tra thêm và tự quyết định cách thực hiện bất cứ điều gì họ cần làm.
dlras2

"Perlin Noise tự nó là một khái niệm biến hàm băm thành hàm nhiễu liên tục." Không, tiếng ồn Perlin là một trong những chức năng nhiễu liên tục được phát minh bởi Ken Perlin (và không phải là chức năng mà ông gọi là "tiếng ồn đơn giản"). Không phải tất cả các chức năng tiếng ồn liên tục là tiếng ồn Perlin; không phải tất cả các hàm nhiễu liên tục đều là nhiễu gradient, trong đó nhiễu Perlin là một ví dụ cụ thể; thứ bạn liên kết đến không phải là nhiễu gradient, mà là nhiễu giá trị.

Mã trong liên kết của bạn "dễ đi qua hơn" vì đó không phải là tiếng ồn Perlin; nó không trơn tru như vậy; nó sử dụng nhiều tài nguyên hơn nhiều; Nói tóm lại, đi bộ dễ dàng hơn vì nó là gỗ.
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.