Tạo bản đồ ngẫu nhiên - các chiến lược để phân tán / phân cụm các nút ngẫu nhiên


10

Tôi đang thực hiện một trò chơi chiến lược 4X đơn giản trong không gian nơi mỗi nút là một điểm ưa thích (một hành tinh, một tiểu hành tinh, v.v.).

Để tạo ngẫu nhiên bản đồ, tôi sẽ làm theo các bước dưới đây

  1. Quyết định có bao nhiêu loại của mỗi nút mà bản đồ sẽ có (có thể là 5 hành tinh giống Trái đất, 10 hành tinh cằn cỗi, v.v.)

  2. Đặt từng loại nút trên bản đồ.

Đối với bước 2 tôi muốn có một mức chênh lệch đồng đều của từng loại nút. Vì vậy, ví dụ, tôi sẽ bắt đầu bằng cách đặt tất cả các hành tinh giống như trái đất. Nếu tôi chỉ đơn giản thực hiện một rand (map. Thong, map.height) để xác định vị trí, tôi có thể kết thúc tất cả các hành tinh giống như trái đất tụ lại với nhau, điều này sẽ tạo lợi thế cho người chơi bắt đầu ở khu vực đó.

Có phương pháp nào không, chẳng hạn như sử dụng các hàm đồ thị hoặc hàm nhiễu khác nhau, có thể tạo ra một chuỗi các tọa độ (x, y) được trải ra từ nhau. Tương tự như vậy, có cách nào để tạo tọa độ gần nhau không?


1
Vui lòng đánh dấu một câu trả lời là được chấp nhận, cho dù đó là của tôi hay của người khác. Cảm ơn.
Kỹ sư

Câu trả lời:


8

Vấn đề bạn gặp phải là lựa chọn ngẫu nhiên không phân biệt đối xử và điều đó có thể có nghĩa là nó không phù hợp với lý tưởng cho những gì bạn cần làm. Nhưng, có ít nhất một cách dễ dàng để giải quyết vấn đề này:

  1. Chia không gian của bạn thành các khu vực (ví dụ: nếu bạn có diện tích 100 x 100 và bạn cần tạo ra 100 hệ mặt trời này, sau đó chia khu vực của bạn thành một lưới 10 đến 10 ngành)

  2. Lặp lại qua từng Khu vực và lặp lại bước 3 (lần lượt sẽ lặp lại bước 4 nhiều lần)

  3. Xác định ngẫu nhiên số lượng hành tinh cho hệ mặt trời hiện tại (ví dụ: trong phạm vi từ 3 đến 7 hành tinh, chỉ cần lấy số ngẫu nhiên từ 0 đến 4 và thêm 3) trong Khu vực hiện tại (nếu bạn có nhiều hơn một mặt trời hệ thống trong một khu vực, đây là nơi bạn thiết lập một vòng lặp khác)

  4. Chỉ định ngẫu nhiên các hành tinh của bạn trong Hệ mặt trời hiện tại được xác định bởi vòng lặp của bạn (bạn cũng có thể sử dụng các số ngẫu nhiên để tăng khoảng cách tối thiểu giữa các hành tinh); đây là nơi bạn quyết định các loại hành tinh, cũng có thể được xác định ngẫu nhiên với nhiều loại trọng lượng hoặc bất kỳ phương pháp nào bạn muốn sử dụng

Bạn cũng có thể muốn xác định khu vực "ngoài giới hạn" xung quanh rìa của mỗi khu vực để ngăn các hành tinh từ các khu vực lân cận tiếp xúc trực tiếp với nhau (chỉ trong trường hợp chúng nằm cạnh nhau một cách hiệu quả), hoặc. ..

Một giải pháp khác có thể là tại thời điểm quyết định vị trí của từng hệ mặt trời và / hoặc mỗi hành tinh, chỉ cần chạy kiểm tra độ gần nhanh với các khu vực lân cận và điều chỉnh cho phù hợp (ví dụ: di chuyển ra khỏi rìa một khoảng cách tối thiểu cộng với khoảng cách ngẫu nhiên ).


Không có gì! Và +1 để đăng một số theo dõi về những gì đã giải quyết vấn đề của bạn. =)
Randolf Richardson

8

Cách tốt nhất để đảm bảo phân phối đồng đều là coi mỗi nút là một loại hạt vật lý. Đầu tiên thực hiện phân phối ngẫu nhiên trên một mặt phẳng xy liên tục (điểm nổi). Bằng cách áp dụng lực đẩy giữa mỗi cặp hạt riêng biệt trên mặt phẳng, bạn sẽ thấy chúng từ từ lan rộng ra. Theo một nghĩa nào đó, nó giống như giải quyết va chạm, chỉ có điều không có liên hệ thực sự để nói đến. Sau đó, một vấn đề đơn giản là chuyển đổi mặt phẳng đó ("rasterize" nó) trở lại thành một lưới được lập chỉ mục số nguyên. Bạn có thể chỉ cần thực hiện việc này từ lưới được lập chỉ mục số nguyên để bắt đầu, nhưng có thể khó khăn hơn một chút để có được những thứ "tốt đẹp" - điều này phụ thuộc vào độ phân giải của lưới của bạn cao ... càng cao, càng tốt , trong trường hợp này.

Rõ ràng bạn cũng có thể muốn áp dụng một số loại lực từ các cạnh của mặt phẳng hình vuông, hoặc nếu không bạn có thể tìm thấy rất nhiều hạt "rửa sạch trên bờ". Ngoài ra, bạn có thể tạo một trường lớn hơn nhiều so với mức bạn cần, sau đó chụp ảnh nhanh một khu vực nhỏ - điều này tránh được vấn đề đã nói ở trên.

Khi bạn muốn đảm bảo điều ngược lại, tức là phân nhóm nào xảy ra, sau đó nhìn vào "tiêu chuẩn" hoặc "gaussian" phân phối. Đây là lý do tại sao các ngôi sao được tạo ngẫu nhiên thường trông giả tạo; họ sử dụng phân phối ngẫu nhiên thuần túy hơn là một mô hình phân phối tự nhiên hơn.


1
Bạn cũng có thể có hành vi phân cụm từ mô hình "vật lý", bạn sẽ chỉ phải sử dụng một quy tắc khác, có thể sử dụng hỗn hợp thu hút và lực đẩy. Các tùy chọn là vô tận, tất cả những gì phải làm là tìm đúng mô hình.
aaaaaaaaaaaa

6

Bạn có thể sử dụng thuật toán phân phối đĩa Poisson đơn giản để có được phân phối "nhiễu xanh". Điều này dẫn đến các điểm trong mặt phẳng cách nhau gần nhau. Điều này hoạt động không chỉ trong ví dụ 2D của bạn mà cả 3D, và cả trong các không gian phi Euclide, nhưng các tính toán có thể nhanh chóng trở nên khó sử dụng.

Ý tưởng cơ bản của các thuật toán đó là bạn bắt đầu với điểm "hạt giống" đầu tiên, sau đó tự mình làm việc ra ngoài để thêm các điểm ngẫu nhiên hoặc giả ngẫu nhiên trong phạm vi giữa khoảng cách tối đa và tối thiểu bạn muốn có từ điểm trở đi và loại bỏ những người nằm quá gần nhau. Thuật toán của bạn sau đó hoạt động ra bên ngoài theo cách như vậy, cho đến khi số lượng điểm cần thiết được thêm vào (cung cấp cho bạn một đám mây điểm tròn gần đúng) hoặc không gian có sẵn được lấp đầy.

Một thuật toán thay thế nhanh và thanh lịch để tạo ra tiếng ồn 2D như vậy, cũng như một cuộc thảo luận ngắn về các tính chất của chúng, có thể được tìm thấy trong " Cấu trúc dữ liệu không gian cho thế hệ mẫu đĩa nhanh " của Daniel Dunbar và Greg Humphreys của Đại học Virginia.


2
Chưa bao giờ nghe nói về phân phối đĩa Poisson - liên kết tốt!
tenpn
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.