C # - Как объявить 2D-массив во время выполнения - PullRequest
0 голосов
/ 07 мая 2019

В настоящее время я работаю над консольным приложением минного тральщика, в котором генерируется количество мин, и каждый индекс массива должен отображать количество смежных мин.

Пользователь должен определить количество строк и столбцов.

public class Board
{
    private static int row;
    private static int column;
    private static int fields;

    public static int Row { get => row; set => row = value; }
    public static int Column { get => column; set => column = value; }
    public static int Fields { get => fields ; set => fields = value; }

    Random random = new Random();
    public int randomX;
    public int randomY;


    public string[,] boardArr = new string[Row, Column];

    public void EnterBoardDimensions()
    {
        Console.Write("Enter number of rows: ");
        Row = Convert.ToInt32(Console.ReadLine());

        Console.Write("Enter number of columns: ");
        Column = Convert.ToInt32(Console.ReadLine());

        Console.WriteLine();

        Console.Write("Enter number of fields: ");
        Fields = Convert.ToInt32(Console.ReadLine());
    }

    public void DrawBoard()
    {
        for(int fields = 0; fields < Fields; fields++)
        {
            Console.WriteLine("\n\nField #{0}", fields + 1);
            Console.Write("\n" + row + " x " + column);
            for (int r = 0; r < Row; r++)
            {
                Console.WriteLine("");
                for (int c = 0; c < Column; c++)
                {
                    boardArr[r, c] = ".";

                    //randomX = random.Next(0, Row - 1);
                    //randomY = random.Next(0, Column - 1);

                    boardArr[randomX, randomY] = "*";

                    Console.Write(boardArr[r, c]);
                }
            }
        }   
        Console.ReadLine();
    }
}

Ответы [ 3 ]

1 голос
/ 07 мая 2019

Скорее всего, вы можете создать двумерный массив с динамическими значениями, взятыми из пользовательского ввода.Например:

Console.WriteLine("Please enter the number of rows: ");
int rows = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Please enter the number of columns: ");
int cols = Convert.ToInt32(Console.ReadLine());

int[,] board = new int[rows, cols];
1 голос
/ 07 мая 2019

Во время разработки вы объявляете тип и имя массива. Объект массива, имеющий определенный размер, всегда создается во время выполнения.

// Design time
Mine[,] _mineField;

// Run time
_mineField = new Mine[m, n];

Здесь я предполагаю, что вы объявили класс Mine, структуру или enum. Конечно, это может быть любой другой тип (int[,], char[,] и т. Д.).

Кроме того, общий List<T> заменил старый ArrayList в большинстве случаев. Преимущество списков в том, что они могут расти динамически. Но это не требование здесь. После создания объекта массива его размер не должен изменяться. Если вам нужен другой размер в следующем раунде, просто создайте новый массив.

Обратите внимание, что индексы массива имеют нулевую границу. то есть он будет иметь диапазоны

_mineField[0 .. m - 1, 0 .. n - 1]
0 голосов
/ 07 мая 2019

Решено. Я не заметил, что я объявлял границы массива вне кода, и поэтому переменные строки и столбца по умолчанию имели значение 0.

...