Как я могу создать несколько объектов в двумерном массиве одномерных массивов в C # - PullRequest
0 голосов
/ 22 мая 2018

Поэтому я пытаюсь получить массив двумерных массивов (например, [,] [])

Они все возвращают 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 с несколькими плоскостями этой сетки.

Случайное решение о местоположении - это выбор дизайна, и когда придет время, когда вв том же месте, я проверю это и предотвратим / переназначу местоположение (снова произнесу).

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Я предполагаю, но я думаю, что вы пытаетесь разрешить любое количество объектов «InsertObject» в каждой ячейке 2D-массива.Я предполагаю, основываясь на вашем шаблоне доступа случайного выбора координат x, y для каждого объекта, когда вы добавляете их в сетку.

Если это так, то используйте List в каждой ячейке сетки,При желании вы можете выделить каждый список при добавлении первого элемента и оставить его разреженным (чтобы не создавать списки для ячеек с 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] может быть нулевым).


И если вы не хотите разрешить несколько объектовна ячейку сетки, тогда вам просто нужен двумерный массив объектов InsertObject.InsertObject[,] _grid2D = new InsertObject[20,20];

0 голосов
/ 22 мая 2018

Две разные реализации, одна с трехмерным массивом, а другая - список двумерных массивов

    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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...