基本图形数据结构

时间:2015-06-13 00:25:44

标签: c# database data-structures unity3d

我正在尝试在Unity中编写一个简单的基于文本的游戏,其中玩家必须从他们的床上导航,让我们说,“A'''到了出口,' G'通过移动节点'这是直接附加的。以下是我试图优雅捕获的信息示例:

A直接连接到B,C和D. B直接连接到A和C. C直接连接到A和B. D直接连接到A和E. E直接连接到F和G. F直接连接到任何东西(让我们说游戏结束?) G直接连接到E

所以我需要能够做到以下几点: 1)存储一组节点 2)存储可能是单向的节点之间的连接 3)跟踪当前位置 4)(锦上添花)改变这些连接就像游戏中发生的那样

我可以创建的任何实现都不能很好地扩展到,比方说,1000个节点。我应该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您可以查看各种图表数据结构。我建议你看看这个帖子中关于高效图数据结构的信息性讨论:

https://softwareengineering.stackexchange.com/questions/148313/what-is-the-most-space-efficient-way-to-implement-a-graph-data-structure

它可能适合您的游戏目的的高效图形数据结构之一是使用邻接矩阵 https://en.wikipedia.org/wiki/Adjacency_matrix因为您可能会发现在两个单元格之间移动您的角色或对象会经常发生赌博。因此,邻接矩阵可以帮助您快速找到特定单元格的兄弟单元格。但是,这种方法需要一些内存来存储图中任意两个兄弟单元格之间的所有可能的邻接关系。

但是,如果您的图表肯定是有向图,其中任意两个节点之间的所有连接都是单向的。您可能需要查看邻接列表 https://en.wikipedia.org/wiki/Adjacency_list,其中存储每个单元格中的邻接节点列表。因此,查找特定细胞的兄弟姐妹需要更少的时间。

答案 1 :(得分:0)

你的问题非常类似于公路网:

class Crossroad {
   List<Road> roadList = new List<Road>();
}

class Road {
   Crossroad start;
   Crossroad end;
   bool isOneWay;
}

class RoadNetwork {
   List<Crossroad> crossroadList = new List<Crossroad>();
   List<Road> roadList = new List<Road>();
   Crossroad currentCrossroad;
}

1)存储一组节点:RoadNetwork.crossroadList

2)存储可能是单向的节点之间的连接:class Road

3)跟踪当前位置:RoadNetwork.currentCrossroad

4)(锦上添花)在游戏中发生的事情改变了这些联系:你总是可以改变crossroadList和roadList。