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

本文关键字:数组 网格 类型 填充 表示 扫雷 创建 | 更新日期: 2023-09-27 18:17:19

我正在尝试创建一个多维数组,以包含笛卡尔坐标(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)
    {
        //        
    }

例如,我希望一个3 × 4的网格用数组表示,如下所示:

{1, 1}, {2, 1}, {3, 1}
{1, 2}, {2, 2}, {3, 2}
{1, 3}, {2, 3}, {3, 3}
{1, 4}, {2, 4}, {3, 4}

等等……

我已经在网上搜索了c#的解决方案(我是OO的新手,不熟悉C, c++等),但到目前为止还没有找到一个空白。

我在我所采取的方法与创建数组的正确轨道上吗?谁能提供一些关于如何用坐标填充数组的技巧,如果可能的话,使用循环?

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

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

例如,它看起来像这样:

public class Tile
{
    public int X {get; set;}
    public int Y {get; set;}
    public bool HasMine {get; set;}
    //Etc.
}

因此,您可以使用简单的List<Tile>来保存所有的瓷砖,而不是使用多维数组。填充该列表所需要做的就是为每个Tile创建一个新的Tile实例,如下所示:

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语句。这将是一个更面向对象的解决问题的方法。

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

int[,] grid = new int[width,height];

将创建一个width x height数组,里面填充0(因为这是整数的默认值)。

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

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