You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中非矩形网格适配的多向链表数据结构选型咨询

关于非矩形网格的四向邻接结构的C#实现建议

首先明确你提到的这种带top/down/left/right指针的结构,标准术语一般称为四向连通网格节点结构,本质上是图数据结构中无向图节点的特定实现(每个节点固定关联4个邻接节点),在游戏开发场景里也常被叫做网格图节点(Grid Graph Node)。

C#有没有适配的内置结构?

很遗憾,.NET标准库(包括C#)并没有专门针对这种四向邻接网格的内置结构。因为这种结构是高度场景化的(主要用于游戏寻路、动态网格计算等),通用类库不会提供这么细分的实现——毕竟不同场景对网格节点的附加属性(比如可通行性、移动成本)需求差异很大。

从零构建自定义结构还是扩展现有结构?

我的建议是优先从零构建自定义结构,原因如下:

  • 扩展现有结构(比如LinkedListNode<T>)会非常别扭:LinkedList本身是双向链表,要扩展成四向需要额外维护四个指针,不仅代码冗余,还会暴露很多不需要的双向链表方法,增加维护成本。
  • 自定义结构可以完全贴合你的需求:你可以直接把笛卡尔坐标、邻接指针、游戏开发需要的属性(比如IsWalkable、移动成本)都封装到一个类里,逻辑更清晰,后续扩展A*寻路、半径查询也更方便。

给你一个极简的自定义结构示例,你可以根据需求扩展:

public class GridNode
{
    // 笛卡尔坐标
    public int X { get; set; }
    public int Y { get; set; }
    
    // 四向邻接节点指针
    public GridNode Top { get; set; }
    public GridNode Down { get; set; }
    public GridNode Left { get; set; }
    public GridNode Right { get; set; }
    
    // 游戏开发常用属性示例
    public bool IsWalkable { get; set; }
    public float MovementCost { get; set; }
    public object GridData { get; set; } // 存储节点关联的自定义数据
    
    public GridNode(int x, int y, bool isWalkable = true)
    {
        X = x;
        Y = y;
        IsWalkable = isWalkable;
        MovementCost = 1.0f; // 默认移动成本
    }
}

如果需要全局管理网格(比如动态增删节点、快速通过坐标查找节点),可以再封装一个GridManager类,用Dictionary<(int X, int Y), GridNode>来维护坐标到节点的映射,同时在增删节点时自动更新相邻节点的指针,比如:

public class GridManager
{
    private readonly Dictionary<(int X, int Y), GridNode> _nodes = new();
    
    public void AddNode(GridNode node)
    {
        _nodes[(node.X, node.Y)] = node;
        // 更新上下左右节点的邻接指针
        if (_nodes.TryGetValue((node.X, node.Y + 1), out var topNode))
        {
            node.Top = topNode;
            topNode.Down = node;
        }
        // 同理处理down/left/right的指针关联
    }
    
    public GridNode GetNode(int x, int y)
    {
        _nodes.TryGetValue((x, y), out var node);
        return node;
    }
}

额外补充

这种结构天生适合你提到的游戏开发需求:

  • A*寻路:可以直接通过节点的四向指针遍历邻接节点,结合每个节点的MovementCost计算路径成本。
  • 半径内查询:用广度优先搜索(BFS)从目标节点出发,遍历指定层数的邻接节点即可。
  • 动态增删改:通过GridManager维护节点关系,增删节点时只需要更新相邻节点的指针,比二维数组灵活太多。

内容的提问来源于stack exchange,提问作者Xrs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:49:15