Làm thế nào để tạo mức ngẫu nhiên từ một hạt giống? [đóng cửa]


46

Làm thế nào tôi có thể sử dụng một hạt giống ngẫu nhiên để tạo một cấp độ trò chơi? Cùng một hạt giống phải luôn tạo ra cùng một cấp chính xác.

Trong ví dụ này, nó sẽ là một mức độ kiểu Worms . Vì vậy, mỗi cấp độ sẽ có một chủ đề (đồng cỏ, tuyết, v.v.), địa hình cơ sở, các đối tượng khác nhau như cây cối.

Vậy tôi sẽ bắt đầu tạo ra loại máy phát cấp này ở đâu? Điều gì sẽ được tham gia? Nó sử dụng khái niệm gì?

Điểm thưởng cho bất kỳ liên kết nào tốt ( thưởng điểm thưởng cho bất cứ điều gì liên quan đến nó như thế nào đã được thực hiện ở những con giun hoặc tương tự).

Cảm ơn.


Tạo mức ngẫu nhiên còn được gọi là Tạo nội dung theo thủ tục (PCG). Và đây là một wiki đối phó với điều đó. pcg.wikidot.com Sẽ cung cấp cho bạn một số ý tưởng! : o)
Kaj

1
Chris Crawford có một bài viết mà bạn có thể thấy thú vị. Nó được viết vào đầu những năm 90 nhưng vẫn có liên quan. Cách xây dựng một thế giới
Anthony

Nếu bạn sử dụng bất kỳ hình thức hoặc thuật toán nào sử dụng cùng một trình tạo số ngẫu nhiên (ngoại trừ một dạng nào đó lẻn vào một bất biến như thời gian hệ thống), cùng một hạt giống sẽ tạo ra cùng một mức, thực sự không có cách nào khác.
Kaj

1
Có, nhưng tôi nghĩ rằng mẹo thực sự là sử dụng hạt giống ở nơi đầu tiên để tạo cấp độ từ đó. Tôi đã xây dựng các trình tạo mức ngẫu nhiên trước đây, nhưng chúng không sử dụng một hạt giống nào. Thường thì tôi sẽ chọn điểm ngẫu nhiên, sau đó cho mỗi điểm chọn một tài sản ngẫu nhiên để đặt ở đó. Làm theo cách này sẽ không có MỘT hạt giống thực sự nào sẽ luôn tạo ra cùng một cấp độ, vì có một loạt các thứ tạo ra có các số ngẫu nhiên.
Adam Harte

10
Bạn có chắc bạn biết "hạt giống" nghĩa là gì không? Đây là "vectơ ban đầu" được truyền qua, vd srand(int). Các cuộc gọi tiếp theo rand()sẽ trả về các giá trị tuần tự luôn được tính theo cùng một thứ tự, dựa trên hạt giống này. Bạn đặt hạt giống một lần trong chương trình của bạn. Sau đó, nếu thuật toán chỉ phụ thuộc vào kết quả từ đó rand, bạn sẽ nhận được kết quả tương tự mỗi lần.
Heath Hunnicutt

Câu trả lời:


7

Chìa khóa cho việc này là sử dụng trình tạo số giả ngẫu nhiên tùy chỉnh của riêng bạn mà bạn khởi tạo với giá trị hạt giống đã biết. "Mersenne Twister" là một thuật toán phổ biến, đây là mục Wikipedia và một số nguồn mẫu . Điều này và các thuật toán PRNG khác thực sự tạo ra một chuỗi số cố định (rất dài) mà giá trị hạt giống đóng vai trò là điểm khởi đầu.

Miễn là bạn tuân theo chính xác quy trình tạo thế giới của mình mọi lúc, mỗi giá trị sẽ đại diện cho một thế giới có thể tái tạo duy nhất.


4

Đây là một PRNG (trình tạo số ngẫu nhiên giả) được triển khai trong ActionScript (có sẵn trong AS2 hoặc AS3). Nó nhẹ và nhanh, lý tưởng cho các trò chơi: http : //lab.poly Cross.de 2007/04/21 / a-good-pseudo-brandom-number-generic-prng /

Việc thực hiện trên được dựa trên PRNG Park-Miller-Carta . Trang web này sẽ cung cấp cho bạn một cái nhìn sâu sắc hơn về toán học đằng sau tất cả điều này.

Để xây dựng mức độ giống như giun, tôi có thể sẽ sử dụng chức năng Perlin-Noise . Nếu bạn tạo một hình ảnh nhiễu perlin với chiều cao 1px và chiều rộng của thế giới trò chơi của bạn, thì về cơ bản bạn sẽ có được một bản đồ chiều cao, sẵn sàng để sử dụng. Các hàm nhiễu Perlin cũng luôn tạo ra cùng một bản đồ với cùng một hạt giống.

Sau đó, bạn có thể sử dụng PRNG được đề cập ở trên để xác định vị trí đặt các Đối tượng ngẫu nhiên trên bản đồ hoặc nơi tạo lỗ trên mặt đất. Đối với các lỗ bạn cũng có thể tận dụng tiếng ồn perlin một lần nữa. Chỉ cần tạo một hình ảnh nhiễu perlin với kích thước bản đồ của bạn (x, y), sau đó tạo một lỗ trên bản đồ của bạn trong đó giá trị pixel nằm dưới một ngưỡng nhất định (ví dụ: 0,2).


Tôi sẽ sử dụng nhiễu perlin, nhưng hơi khác một chút, sử dụng nó để tạo bản đồ chiều cao 3D, đặt bản đồ lên một độ dốc và loại bỏ tất cả các pixel thấp hơn ngưỡng của bạn. (nếu pixel.height - (pixel.distanceToBottom * dốcFactor) <tr ngưỡng) pixel = trong suốt)
Niels

2

Về mặt lý thuyết nếu bạn có thể sử dụng trình tạo số giả ngẫu nhiên (như Perlin-Noise hoặc Marsenne Twister) để chia sẻ bản đồ qua

số hạt giống sau đó bạn cũng có thể tạo bản đồ tùy chỉnh và giảm chúng thành hạt giống, giải quyết vấn đề không thể tạo

bản đồ tùy chỉnh khi sử dụng PRNG. Điều này tuy nhiên được xây dựng trên một vài giả định. Cụ thể là các trình tạo số giả ngẫu nhiên là

một quy trình có thể đảo ngược và BẤT K data dữ liệu nào được đưa ngược vào PRNG sẽ tạo ra một hạt giống hợp lệ, chứ đừng nói đến một hạt giống nào 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.