簡體   English   中英

我如何在C#中的1D數組的2D數組中實例化多個對象

[英]How am I able to instantiate multiple Objects in a 2D array of 1D arrays in C#

所以我試圖有一個二維數組的數組(所以[,] [])

盡管由於某種原因,它們最終都返回Null(很可能是由於未分配給數組)

編輯1:錯誤已在代碼中修復。 謝謝。 Edit2:固定標題,因為它實際上是1D數組的2D數組。

例:

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的網格,該網格具有多個平面。

隨機確定位置是設計選擇,當同一位置有多個對象時,我將檢查並防止/重新分配位置(再次為rand)。

我正在猜測,但是我認為您要嘗試做的是在2D數組的每個單元格中允許任意數量的“ InsertObject”對象。 我猜,根據您將每個對象添加到網格時為每個對象隨機選擇x,y坐標的訪問模式。

如果是這種情況,請在網格的每個單元格中使用一個列表。 如果需要,可以在添加第一個項目時分配每個列表,並使它保持稀疏狀態(這樣就不會為其中包含0個對象的單元格創建列表。)或者可以進行第一遍操作,在其中填充所有單元格帶有空列表的2D數組。 采取的策略取決於您對效率的重視程度,以及期望的人口稀少還是人口稠密。

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]可能為null),則可能沒有創建列表。


如果你不想讓每個網格單元的多個對象,那么你只需要InsertObject對象的二維數組。 InsertObject[,] _grid2D = new InsertObject[20,20];

兩種不同的實現方式,一種是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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM