
本文介绍在java中使用泛洪填充(flood fill)算法,将离散分布的资源(如树木)自动聚类为逻辑连通的resourcefield对象,适用于100×100等规模的地图初始化。
本文介绍在java中使用泛洪填充(flood fill)算法,将离散分布的资源(如树木)自动聚类为逻辑连通的resourcefield对象,适用于100×100等规模的地图初始化。
在基于瓦片的RTS游戏开发中,将地图上零散分布的资源(如木材、矿石)组织为语义清晰的“资源场”(ResourceField),是实现高效采集调度、AI寻路与区域管理的关键前提。直接遍历所有资源并手动判断邻接关系极易陷入重复处理或遗漏,而递归式泛洪填充算法恰好能优雅解决这一连通分量识别问题。
核心思路是:不以资源列表为起点,而是以地图瓦片为单位扫描;对每个未归属任何资源场且含资源的瓦片,启动一次深度优先探索,将其连通的所有同类资源瓦片统一纳入一个ResourceField实例中。
以下为可直接落地的Java实现示例:
import java.util.*;
public class ResourceFieldBuilder {
private final List<ResourceField> resourceFields = new ArrayList<>();
public List<ResourceField> buildFields(Tile[][] map, int width, int height) {
resourceFields.clear();
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
Tile tile = map[y][x];
// 关键条件:有资源 + 尚未被任何ResourceField占用
if (tile.hasResource() && !tile.isPartOfResourceField()) {
ResourceField field = new ResourceField();
explore(tile, field);
resourceFields.add(field);
}
}
}
return resourceFields;
}
private void explore(Tile tile, ResourceField field) {
// 终止条件:无资源 或 已归属其他场
if (!tile.hasResource() || tile.isPartOfResourceField()) {
return;
}
// 标记为已处理,并加入当前场
tile.setPartOfResourceField(true);
field.add(tile);
// 向四邻域(或八邻域)递归探索
for (Tile neighbor : tile.getNeighbors()) {
explore(neighbor, field);
}
}
}⚠️ 关键注意事项:
-
Tile类需维护isPartOfResourceField()和setPartOfResourceField(boolean)状态标记,避免重复访问; -
getNeighbors()应返回合法边界内的相邻瓦片(建议预计算或使用方向数组优化,避免每次新建List); - 若资源类型需区分(如仅合并同种资源),应在
explore()中增加tile.getResourceType().equals(field.getResourceType())判断; - 对于超大地图(如1000×1000),递归可能导致栈溢出,此时应改用显式栈的迭代版DFS或BFS实现。
最终生成的 List<resourcefield></resourcefield> 即为所有逻辑资源场集合,每个 ResourceField 封装了空间连通、类型一致的资源瓦片集合,可进一步支持范围查询、中心点计算、容量统计等高级功能。该方案时间复杂度为 O(N),其中 N 为地图总瓦片数,兼顾效率与可维护性,是Tile-Based RTS资源建模的推荐实践。


















