Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 设置无数据重复的多维阵列_C#_Unity3d_Multidimensional Array - Fatal编程技术网

C# 设置无数据重复的多维阵列

C# 设置无数据重复的多维阵列,c#,unity3d,multidimensional-array,C#,Unity3d,Multidimensional Array,我很难弄清楚如何正确设置阵列 我的数组grid[,]设置了一个基本的平铺数组,效果很好 现在我正在尝试在网格之间为我的边创建一个数组,以便我可以放置墙 所以我有这样一个:walls[,][,],其中每个[,]是一个网格位置,因此每面墙分隔两个网格位置 这里的最终目标是我想要一个有两个网格点的墙阵列,比如说a和B,这样我就可以: Wall-wallObject=墙[A.x,A.y][B.x,B.y] 希望这是有道理的。我试过这样做: " 现在,由于每个1瓷砖可以有4面墙,我尝试像这样设置我的墙阵列

我很难弄清楚如何正确设置阵列

我的数组
grid[,]
设置了一个基本的平铺数组,效果很好

现在我正在尝试在网格之间为我的边创建一个数组,以便我可以放置墙

所以我有这样一个:
walls[,][,]
,其中每个
[,]
是一个网格位置,因此每面墙分隔两个网格位置

这里的最终目标是我想要一个有两个网格点的墙阵列,比如说
a
B
,这样我就可以:

Wall-wallObject=墙[A.x,A.y][B.x,B.y]

希望这是有道理的。我试过这样做:

" 现在,由于每个1瓷砖可以有4面墙,我尝试像这样设置我的墙阵列,但无法正确计算语法:

grids = new Tile[x,y];
walls = new Wall[grids.GetLength(0), grids.GetLength(1)][walls.GetLength(0) * 4, walls.GetLength(1) * 4]; // invalid rank specifier ERROR

for(int i = 0; i < x; i++) {
for(int j = 0; j < y; j++) {

   grids[i, j] = new Tile(new Vector3(i, 0, j));
   foreach (Vector3 gridNeighbour in AdjacentTiles(new Vector3(i, 0, j))) //4 directions
   {
      if (!InGrid(gridNeighbour)) continue;    
      walls[i, j][(int)gridNeighbour.x, (int)gridNeighbour.z] = new Wall(grid[i,j],grid[(int)gridNeighbour.x,(int)gridNeighbour.z]);
   }

}}
grids=new-Tile[x,y];
墙=新墙[grids.GetLength(0),grids.GetLength(1)][walls.GetLength(0)*4,walls.GetLength(1)*4];//无效的秩说明符错误
对于(int i=0;i
我在第二行遇到了一个错误,我不知道该如何写。
我也相当肯定我的逻辑是错误的,因为我认为这种数据设置会为我的墙提供双重数据,这样我会得到
wall[gridA][gridB]
wall[gridB][gridA]
,我想避免,但我不知道如何做。

直接回答你的问题,基本问题是,您并不是真的试图创建一个四维数组。相反,您正在尝试创建二维数组的二维数组

如果要这样做,需要首先分配顶级二维数组,然后用其他二维数组元素填充它:

walls = new Wall[grids.GetLength(0), grids.GetLength(1)][,];

for (int i = 0; i < grids.GetLength(0); i++)
for (int j = 0; j < grids.GetLength(1); j++)
{
    walls[I, j] = new Wall[grids.GetLength(0) * 4, grids.GetLength(1) * 4];
}
也就是说,这两种方法对我来说都是极其浪费的。这些阵列中的绝大多数元素都是未使用的。你只关心每一块瓷砖有四面墙,那么为什么不每一块瓷砖只存储四面墙呢?例如:

Wall[,,] walls = new Wall[x, y, 4];
struct WallAddress
{
    public int X0 { get; }
    public int Y0 { get; }
    public int X1 { get; }
    public int Y1 { get; }

    public WallAddress(int x0, int y0, int x1, int y1)
    {
        // Optional, not shown here:
        // Validate addresses to make sure they represent adjacent tiles

        if (x1 < x0 || (x1 == x0 && y1 < y0))
        {
            int xT = x0, yT = y0;

            x0 = x1;
            x1 = xT;
            y0 = y1;
            y1 = yT;
        }

        X0 = x0;
        Y0 = y0;
        X1 = x1;
        Y1 = y1;
    }
}

Dictionary<WallAddress, Wall> walls = new Dictionary<WallAddress, Wall>();
(我没有使用
GetLength()
,而是重用了
x
y
变量,这些变量在原始代码中似乎定义了网格的维度。)

然后编写一个helper方法,给定两个不同单元格的x/y位置,该方法将返回相关墙的索引。这里有一种方法:

private static readonly int[,] directions =
{
    { 0, -1 },
    { 1,  0 },
    { 0,  1 },
    {-1,  0 }
};

int GetWallIndex(int x0, int y0, int x1, int y1)
{
    int dx = x0 - x1, dy = y0 -y1;

    for (int i = 0; i < 4; i++)
    {
        if (directions[i, 0] == dx && directions[i, 1] == dy)
        {
            return i;
        }
    }

    return -1;
}

然后,您只需为每个
Wall
对象的一对tile创建
WallAddress
值并填写字典。

与Java不同,在Java中,您可以执行以下操作:

walls = new Wall[x][y][x2][y2];
C#不会让你这样初始化的。有一种方法可以使
Wall[,][,]
工作,但只制作一个
Wall[,,]
的四维数组要容易得多

然而,这甚至不起作用,因为如果你真的想用[reallybignumber]维数组(我不确定这是最好的方法,但让我们就这么做吧),你需要一个
Wall[,,,]
数组来存储x1,y1,x2,y2和墙方向


虽然这样做只会花费一点点的速度(可能?我实际上不知道C#中多维数组对性能的影响),但如果你像Peter Duniho的回答那样使用字典和结构,你将节省大量内存(和理智)。

我真的认为你不需要四维数组来实现这一点,假设我对你的理解是正确的。如果我不是,你能更好地解释一下为什么你需要一个四维数组吗?一个给定的墙将两个瓷砖分开
a
B
,所以如果我想找到一个将两个特定瓷砖分开的墙,我的想法是像
墙[a.x,a.y][B.x,B.y]
那样从数组中获取它,希望这是有意义的。我想我需要这种数组结构来完成它。
walls = new Wall[x][y][x2][y2];