C# 创建并填充表示扫雷舰类型网格的多维数组

C# 创建并填充表示扫雷舰类型网格的多维数组,c#,multidimensional-array,C#,Multidimensional Array,我试图创建一个多维数组,在[x,y]宽度和高度的多维数组中包含笛卡尔坐标x,y的数组 到目前为止,我已经做到了这一点;我变得无可救药的困惑 int[][][] grid = new int[width][][]; for (int x = 0; x < width; x++) { grid[x] = new int[height][]; for (int y = 0; y < height; y++) {

我试图创建一个多维数组,在[x,y]宽度和高度的多维数组中包含笛卡尔坐标x,y的数组

到目前为止,我已经做到了这一点;我变得无可救药的困惑

int[][][] grid = new int[width][][];
    for (int x = 0; x < width; x++)
    {
        grid[x] = new int[height][];
        for (int y = 0; y < height; y++)
        {
           grid[y] = new int[2][];
        }
    }

    foreach (int[][] coordinate in grid)
    {
        //        
    }
等等

我在C中搜索了一个解决方案,我是一个相对OO新手,不熟悉C,C++等,但到目前为止还是空白。 我在创建阵列时所采取的方法是否正确?
任何人都可以提供一些关于如何使用坐标填充数组的提示,如果可能,可以使用循环?

您可以创建一个类来保存坐标和与每个磁贴相关的其他内容,而不是使用多维数组

例如,它可以如下所示:

public class Tile
{
    public int X {get; set;}
    public int Y {get; set;}
    public bool HasMine {get; set;}
    //Etc.
}
List<Tile> tiles = new List<Tile>();

for(int i = 0; i < NB_HORIZONTAL_TILES; i++)
    for (int j = 0; j < NB_VERTICAL_TILES; j++)
        tiles.Add(new Tile { X = i; Y = j });
因此,您可以使用一个简单的列表来保存所有分幅,而不是使用多维数组。要填充该列表,只需为每个磁贴创建一个新的磁贴实例,如下所示:

public class Tile
{
    public int X {get; set;}
    public int Y {get; set;}
    public bool HasMine {get; set;}
    //Etc.
}
List<Tile> tiles = new List<Tile>();

for(int i = 0; i < NB_HORIZONTAL_TILES; i++)
    for (int j = 0; j < NB_VERTICAL_TILES; j++)
        tiles.Add(new Tile { X = i; Y = j });

要对它们进行迭代,只需使用foreach语句或一些LINQ。这将是一种更加面向对象的解决问题的方法。

您可以创建一个类来保存坐标和与每个磁贴相关的其他内容,而不是使用多维数组

例如,它可以如下所示:

public class Tile
{
    public int X {get; set;}
    public int Y {get; set;}
    public bool HasMine {get; set;}
    //Etc.
}
List<Tile> tiles = new List<Tile>();

for(int i = 0; i < NB_HORIZONTAL_TILES; i++)
    for (int j = 0; j < NB_VERTICAL_TILES; j++)
        tiles.Add(new Tile { X = i; Y = j });
因此,您可以使用一个简单的列表来保存所有分幅,而不是使用多维数组。要填充该列表,只需为每个磁贴创建一个新的磁贴实例,如下所示:

public class Tile
{
    public int X {get; set;}
    public int Y {get; set;}
    public bool HasMine {get; set;}
    //Etc.
}
List<Tile> tiles = new List<Tile>();

for(int i = 0; i < NB_HORIZONTAL_TILES; i++)
    for (int j = 0; j < NB_VERTICAL_TILES; j++)
        tiles.Add(new Tile { X = i; Y = j });
要对它们进行迭代,只需使用foreach语句或一些LINQ。这将是一种更为面向对象的解决问题的方法。

假设宽度和高度是宽度和高度的整数:

int[,] grid = new int[width,height];
将创建一个由零填充的宽x高数组,因为这是整数的默认值

数组的坐标是数组的索引,因此不需要为此填充它。您所需要做的就是存储您想要存储的任何数据,无论您想要在哪个位置填充:

grid[2,1] = 5;    // the cell at {2,1} now contains the number 5
假设宽度和高度是宽度和高度的整数:

int[,] grid = new int[width,height];
将创建一个由零填充的宽x高数组,因为这是整数的默认值

数组的坐标是数组的索引,因此不需要为此填充它。您所需要做的就是存储您想要存储的任何数据,无论您想要在哪个位置填充:

grid[2,1] = 5;    // the cell at {2,1} now contains the number 5

为什么需要用坐标填充数组?当然数组的索引就是坐标。谢谢大家。马特,你完全正确;有时候我比消化香蕉还慢。。为什么需要用坐标填充数组?当然数组的索引就是坐标。谢谢大家。马特,你完全正确;有时候我比消化香蕉还慢。你能解释一下这种声明是什么意思吗?@Marek:Patashu给你的链接解释得很好。int[,]声明一个二维矩形数组。这与int[][]相反,int[][]声明了一个锯齿状数组,它可能恰好是矩形的,但不一定是矩形的。你能解释一下这种声明是什么意思吗int[,]grid?@Marek:Patashu给你的链接解释得很好。int[,]声明一个二维矩形数组。这与int[]]相反,int[]]声明了一个锯齿状数组,该数组可能恰好是矩形的,但不一定是矩形的。