Giả sử bạn có n
tổng số hexmap của các ô và p
người chơi, ở đó p <= n
, cách tốt nhất để giải quyết vấn đề này là phân phối vòng tròn thông qua automata di động (CA).
Khởi tạo
Ngẫu nhiên (và / hoặc sử dụng một số hoặc heuristic khác, chẳng hạn như khoảng cách từ trung tâm bản đồ) chọn một ô bắt đầu cho mỗi người chơi. Vì p <= n
, đây không phải là một vấn đề.
Automata di động
Bạn yêu cầu kết nối đầy đủ giữa các ô hex của bạn. Tôi muốn đề xuất một mảng 6 hàng xóm cho mỗi ô:
class Cell
{
//... other members...
Cell[6] neighbours = new Cell[6];
}
Việc sử dụng các mảng kích thước cố định cho phép tồn tại khái niệm hướng địa hình giữa các ô, điều mà một danh sách hoặc vectơ sẽ không có. Tôi khuyên bạn nên điều này, vì nó có thể làm cho ops điều hướng nhất định dễ dàng hơn.
Bạn cũng có thể lưu trữ hexmap của mình trong một mảng 2D, với độ lệch trên mỗi hàng. Tuy nhiên, điều này có thể hơi ít trực quan hơn so với việc lưu trữ một mảng lân cận trên mỗi ô, chỉ vì phần bù hình học trên mỗi hàng khác.
Hãy chắc chắn rằng mọi tế bào được kết nối với tất cả mọi thứ là hàng xóm. Bạn có thể thực hiện hàng này theo từng hàng, từng ô khi bạn tạo hexmap đầy đủ. PS Nếu cuối cùng bạn muốn có một hình lục giác giới hạn không phải hình chữ nhật, thì bạn có thể chỉ cần loại bỏ các ô riêng lẻ và tham chiếu đến các ô đó, để tạo thành các không gian âm, cho phép bạn tạo một phác thảo bản đồ hữu cơ.
Phân phối vòng tròn
Mã giả:
count number of neutral cells in entire map, minus those starting cells taken by players
while neutral cells remain (or while true)
for each player
if player has not yet reached expected territory size in cells
for each cell already constituting this player's territory
if territory can grow by one cell into a neutral neighbour
grow into neighbour
reduce neutral cell count for entire map by one
if no more neutral cells remain in map
break out of outermost while loop immediately
else
continue to next player immediately
begin game
Thuật toán này sẽ cung cấp cho mỗi người chơi một cơ hội để phát triển lãnh thổ của mình, theo kiểu vòng tròn, với điều kiện là lãnh thổ của người chơi vẫn có không gian phát triển hợp lệ. Nếu người chơi nào đó bị chặn từ phát triển hơn nữa, thuật toán sẽ bất chấp điều này tiếp tục phát triển các vùng lãnh thổ của người chơi làm vẫn có không gian phát triển hợp lệ. Bạn có thể dễ dàng giới hạn mọi người chơi trong cùng một số ô ngay khi một trong số họ đạt đến giới hạn, nhưng điều đó đủ dễ để bạn tìm ra, nếu muốn.
Điều này sẽ cung cấp "lãnh thổ nhà" có kích thước tối đa cho mỗi người chơi. Ngoài ra, nếu bạn muốn có các lãnh thổ "đảo", để hoàn thành chỉ tiêu số lượng tế bào cho người chơi đó, thì một khi người chơi hết không gian cục bộ để phát triển, bạn có thể chọn một ô bắt đầu mới từ danh sách các ô trung tính và tiến hành quá trình "tăng trưởng" tương tự, từ đó. Bằng cách này, bạn sẽ kết thúc với các nhóm đảo kết hợp, có kích thước độc đáo cho mỗi người chơi, thay vì tiếng ồn ngẫu nhiên.