2

对于我正在制作的瓷砖游戏,我选择使用 4D 嵌套列表系统。

  • 第一维 - 层(背景和前景,但可能还有其他)
  • 第二和第三维 - 2D 网格,基于瓷砖的经典游戏
  • 第四维度 - 网格中的图块包含的对象(例如,多个项目可以在 rougelike 中的同一块地砖上掉落

我有确切的层数以及地图的高度和宽度。用这些数字初始化前三个维度然后用空对象列表填充每个“图块”(即第四维)的好方法是什么?

这里有一些代码可以更好地说明它:

List<List<List<List<GameObject>>>> Grid;
public readonly int Layers, Height, Width;
4

2 回答 2

3

您可以使用 linq 执行此操作:

List<List<List<List<GameObject>>>> Grid;
Grid = Enumerable.Range(0, Layers).Select(l =>
       Enumerable.Range(0, Height).Select(h =>
       Enumerable.Range(0, Width).Select(w => 
           new List<GameObject>()).ToList()).ToList()).ToList();

相同的代码可用于生成数组数组(或任何更灵活的组合以满足您的需求),即:

List<GameObject>[][][] Grid;
Grid = Enumerable.Range(0, Layers).Select(l =>
       Enumerable.Range(0, Height).Select(h =>
       Enumerable.Range(0, Width).Select(w => 
           new List<GameObject>()).ToArray()).ToArray()).ToArray();
于 2013-04-04T23:07:27.960 回答
2

如果其中三个维度具有固定长度,则可以改用数组:

List<GameObject>[,,] Grid = new List<GameObject>[Layers, Width, Height];
for(var l = 0; l < Layers; l++)
    for(var x = 0; x < Width; x++)
        for(var y = 0; y < Height; y++)
{
    Grid[l, x, y] = new List<GameObject>();
}

如果您真的需要列表(IMO 看起来更糟):

List<List<List<List<GameObject>>>> Grid = new List<List<List<List<GameObject>>>>();
for(var l = 0; l < Layers; l++)
{
    Grid.Add(new List<List<List<GameObject>>>());
    for(var x = 0; x < Width; x++)
    {
        Grid[l].Add(new List<List<GameObject>>());
        for(var y = 0; y < Height; y++)
        {
            Grid[l][x].Add(new List<GameObject>());
        }
    }
}
于 2013-04-04T11:14:19.260 回答