【问题标题】:How am I able to instantiate multiple Objects in a 2D array of 1D arrays in C#我如何能够在 C# 中实例化一维数组的二维数组中的多个对象
【发布时间】:2018-05-22 15:11:45
【问题描述】:

所以我试图拥有一个二维数组的数组(所以 [,][])

尽管出于某种原因,它们最终都返回 Null(很可能是由于没有分配给数组)

Edit1:代码中的错误已修复。谢谢。 Edit2:固定标题,因为它实际上是一维数组的二维数组。

例子:

public Environment()
{
    _grid2D = new Object[20, 20][];
}

我稍后也会尝试在我的代码中为它们分配对象:

public GenerateGrid() 
{
    Random rand = new Random();
    for (int i = 0; i < 10; i++ ) 
    {
        obj = new InsertObject(rand.Next(0,19), rand.next(0,19));
        _grid2D[InsertObject.XPos, InsertObject.YPos][0] = obj;
    }
}

我正在尝试使用这种数组,因为我需要看似多个 2D 平面,它们相互堆叠在一起。这样,多个游戏对象在技术上可以存在于同一个空间中,因为 2D 数组是一个包含位置的数组(X 和 Y 属性已经在别处定义)

这可能有点令人费解,因为可能有更好的方法。

我需要一个 20x20 的网格,该网格有多个平面。

随机决定位置是一种设计选择,当同一位置有多个对象时,我会检查这一点并防止/重新分配位置(再次兰特)。

【问题讨论】:

  • 这不是二维数组。它是一维数组的二维数组。这也是其他事情,但这是一个面向家庭的网站。
  • 我觉得这是一个 XY 问题。你想用这个 2D/1D 阵列的大杂烩来完成什么?为什么不直接使用 3D 数组?
  • “很可能是因为没有分配给数组”——没错。您需要一个循环,将new object[2] 或其他内容分配给_grid2D 中的每个插槽。最里面的数组需要多大?您只尝试分配给其中的第二个项目。
  • 您将遇到的下一个问题是您正在创建带有超出范围索引的InsertObjects:大小为 20 的数组具有从零 (0) 到十九 (19) 的有效索引,不是 1..20。您只在内部数组中使用[1] 索引,这表明您认为这是该数组中的第一项。它不是。 [0] 是该数组中的第一项。
  • 之后的下一个问题是您似乎在随机位置创建InsertObjects,因此根据球的反弹方式,您有时最终会在给定位置放置一个,然后随机稍后在循环中用另一个替换它。

标签: c# arrays object


【解决方案1】:

我在猜测,但我认为您正在尝试做的是在 2D 数组的每个单元格中允许任意数量的“InsertObject”对象。我猜,根据您在将每个对象添加到网格时随机选择 x,y 坐标的访问模式。

如果是这种情况,则在网格的每个单元格中使用一个列表。如果需要,您可以在添加第一个项目时分配每个列表,并将其保持稀疏(因此您不会为其中包含 0 个对象的单元格创建列表。)或者您可以在填充所有单元格的地方进行第一次传递具有空列表的二维数组。您采用的策略取决于您对效率的关注程度,以及您期望人口稀少还是密集。

List<Object>[,] _grid2D = new List<Object>[20, 20];
Random rand = new Random();
for (int i = 0; i < 10; i++)
{
    int x = rand.Next(1, 20);
    int y = rand.Next(1, 19);
    Object obj = new object(); // Replace with your InsertObject here.
    if (_grid2D[x, y] == null) // If this cell's list doesn't exist yet...
    {
        _grid2D[x, y] = new List<Object>(); /// ... then make one.
    }
    _grid2D[x, y].Add(obj); // Add the object to the list.
}

如果您使用这种稀疏技术,请在访问网格时要小心,因为如果某些网格单元有 0 个对象(_grid2D[x,y] 可能为空),则它们可能没有创建列表。


如果您希望每个网格单元允许多个对象,那么您只需要一个 InsertObject 对象的二维数组。 InsertObject[,] _grid2D = new InsertObject[20,20];

【讨论】:

    【解决方案2】:

    两种不同的实现,一种是 3D 数组,另一种是 2D 数组的列表

        static void Main(string[] args)
        {
            int numberOfPanes = 50;
            var myGrid1 = GenerateGrid1(20, 20, numberOfPanes);
            var myGrid2 = GenerateGrid2(20, 20, numberOfPanes);
    
    
        }
    
        public static Object[,,] GenerateGrid1(int x, int y, int numberOfPanes)
        {
            var grid = new Object[x, y, numberOfPanes];            
    
            Random rand = new Random(Guid.NewGuid().GetHashCode());
    
            for (int k = 0; k < numberOfPanes; k++)
            {
                for (int i = 0; i < x; i++)
                {
                    for (int j = 0; j < y; j++)
                    {
                        grid[i, j, k] = rand.Next(1, 20);
                    }
                }
            }
    
            return grid;
        }
    
    
        public static List<int[,]> GenerateGrid2(int x, int y, int numberOfPanes)
        {
            var grid = new int[x, y];
            var multiPanes = new List<int[,]>();
    
            Random rand = new Random(Guid.NewGuid().GetHashCode());
    
            for (int k = 0; k < numberOfPanes; k++)
            {
                for (int i = 0; i < x; i++)
                {
                    for (int j = 0; j < y; j++)
                    {
                        grid[i, j] = rand.Next(1, 20);
                    }
                }
    
                multiPanes.Add(grid);
            }
    
            return multiPanes;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-09
      • 1970-01-01
      • 1970-01-01
      • 2019-04-13
      相关资源
      最近更新 更多