4

我有一个数组,用于存储我正在开发的游戏的地图数据。

MyMapType[,,] map; 

我使用固定数组而不是 Collection 的原因是固定数组的工作速度非常快。

现在我的问题是,我想在游戏中支持负 z 水平。所以我希望能够访问负索引。

如果这是不可能的,我想到了一对其他的解决方案。

我正在考虑将地平面设置为任意数字(例如 10)作为可能的解决方案,任何小于 10 的都可以被视为负数。但是,如果不使用,这不会使阵列变大 10 倍吗?

我考虑的另一个解决方案是“滚动我自己的”,你有一个二维数组字典,列表中的 Z 级别作为索引。但这是更多的工作,我不确定它是否慢。

所以总结一下 - 创建支持负索引的数组的任何方式?如果没有 - 是否有一种干净的方式来“模拟”这种行为而不会牺牲过多的 CPU 时间或 RAM - 注意这些游戏地图最终可能会很大并且需要不断访问。

4

5 回答 5

9

用一个类替换你的数组:

class MyArray {
    private MyMapType[] myArray = new myMapType[size]
    MyMapType this[index] {
       get{return myArray[index + offset];}
    }

}

您可以在构造函数中设置大小和偏移量,甚至可以随意更改它。

在此示例的基础上构建了另一个版本:

class MyArray {
    private MyMapType[] positives = new myMapType[size]
    private MyMapType[] negatives = new myMapType[size-1]
    MyMapType this[index] {
       get{return index >= 0 ? positives[index] : negateves[1-index];}
    }

}

它不会改变您需要为它们设置大小的事实。老实说我更喜欢第一个

于 2013-03-31T14:30:32.287 回答
4

如果你想要“负”索引,C# 8 现在支持它。

var words = new string[]
{
                // index from start    index from end
    "The",      // 0                   ^9
    "quick",    // 1                   ^8
    "brown",    // 2                   ^7
    "fox",      // 3                   ^6
    "jumped",   // 4                   ^5
    "over",     // 5                   ^4
    "the",      // 6                   ^3
    "lazy",     // 7                   ^2
    "dog"       // 8                   ^1
};              // 9 (or words.Length) ^0

所以调用负数会是这样的

words[^1]

看到这个链接

所以在你的情况下,中间元素可能是零 Z

于 2020-01-28T15:14:44.310 回答
1

您能否尝试将 MyMapTime[,] 列表存储在两个列表中:

  • 1 表示 z 值大于或等于 0
  • 和第二个负 z 值。

表的索引将是 z 的值。这样做可以让您快速访问特定 z 水平的 xy 值。当然,问题是:你的 z 值是多少?有稀疏的还是密集的。即使对于稀疏值,您最终也会得到一个包含 [,] 的空值的数组。

于 2013-03-31T14:31:38.427 回答
1

使用 Dictionary 类,因为您可以为键或值分配所需的任何值。虽然我不确定这对于您上面显示的 3 维数组如何工作,但我可以展示如果这是一个 1 维数组,这将如何工作,并且您可以推断如何最好地利用它:

MyMapType[] map;

//map is filled with w/e data

Dictionary<int, MyMapType> x = new Dictionary<int, MyMapType>();

x[-1] = //(map data for whatever value is for the negative value);
x[0] = map[0]
//(etc...)
于 2015-09-20T00:48:08.103 回答
-1

我想在这里指出,字典允许负索引,而 2D 字典也可以解决此类问题,只需考虑数据结构以及是否可以使用字典

请注意,字典和列表用于不同的场景。它们的速度取决于它们使用的功能

于 2016-03-15T12:34:45.797 回答