如何声明对象数组C#

如何声明对象数组C#,c#,arrays,object,C#,Arrays,Object,我正在为一个游戏制作一个2D瓷砖地图。我有一个单元类(tiles)生成具有4个属性的单元对象:TopWall、BottomWall、LeftWall、RightWall。墙可能在那里,也可能不在那里,因此这些属性是布尔值true或false,如果它们为true,将沿着该单元格墙画一条线(不允许玩家通过该单元格)。我想声明一个名为Map1的(二维?如in、row和column)单元格对象数组(因为它们将构成游戏地图)。然后我想将数组的每个成员设置为具有特定的墙属性。以下是我所拥有的: Cell.c

我正在为一个游戏制作一个2D瓷砖地图。我有一个单元类(tiles)生成具有4个属性的单元对象:TopWall、BottomWall、LeftWall、RightWall。墙可能在那里,也可能不在那里,因此这些属性是布尔值true或false,如果它们为true,将沿着该单元格墙画一条线(不允许玩家通过该单元格)。我想声明一个名为Map1的(二维?如in、row和column)单元格对象数组(因为它们将构成游戏地图)。然后我想将数组的每个成员设置为具有特定的墙属性。以下是我所拥有的:

Cell.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Map
{
    public class Cell : PictureBox
    {
        bool LeftWall; 
        bool TopWall; 
        bool RightWall;
        bool BottomWall;

        public Cell(bool TopWall, bool RightWall, bool BottomWall, bool LeftWall)
        {
            this.TopWall = TopWall;
            this.RightWall = RightWall;
            this.BottomWall = BottomWall;
            this.LeftWall = LeftWall;
        }
    }
}
这是我开始尝试创建单元对象数组并设置墙属性的步骤: 表格1.cs

使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Windows.Forms;
名称空间映射
{
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
}
/// 
///瓷砖阵列
/// 
//PictureBox[,]框=新的PictureBox[4,4];
公共图书馆
{
细胞[,]Map1=新细胞[4,4];
用于(int行=0;行<4;行++)
{
for(int列=0;列<4;列++)
{
Map1[行,列]=新单元格();
}
}
Map1[0,0]=新单元格(真、假、假、真);
Map1[0,1]=新单元格(false,false,false,true);
}
/*int[][]墙=新int[][]{
新int[]{0,0},新int[]{1,0,0,1},
新int[]{1,0},新int[]{1,0,1,0},
新int[]{0,1},新int[]{0,0,0,1},
新int[]{1,1},新int[]{1,1,1,0},
新int[]{2,0},新int[]{1,1,0,0},
新int[]{2,1},新int[]{0,0,0,1},
新int[]{3,1},新int[]{1,0,1,0},
新int[]{0,2},新int[]{0,0,1,1},
新int[]{1,2},新int[]{1,0,1,0},
新的int[]{2,2},新的int[]{0,1,1,0}*/
#区域运行时负载
/// 
///在加载窗口时生成地图
/// 
/// 
/// 
私有void Form1\u加载(对象发送方、事件参数e)
{
BuildMap();
}
#端区
#区域构建网格
/// 
///画地图上的每一块瓷砖
/// 
公共void BuildMap()
{
对于(int行=0;行<3;行++)
{
for(int列=0;列<3;列++)
{
绘图单元(行、列);
}
}
//画出退出框
牵引室(1,3);
}
#端区
#区域绘制
/// 
///画一块瓷砖
/// 
/// 
/// 
公共空白绘图单元(int行,int列)
{
Map1[行,列]=新单元格();
Map1[行,列].高度=100;
Map1[行,列].宽度=100;
Map1[行,列].BorderStyle=BorderStyle.FixedSingle;
Map1[行,列].BackColor=Color.BurlyWood;
Map1[行,列]。位置=新点((映射[行,列]。宽度*列),(映射[行,列]。高度*行));
this.Controls.Add(Map1[行,列]);
//System.Drawing.Pen myPen;
//myPen=新的System.Drawing.Pen(System.Drawing.Color.Red);
//System.Drawing.Graphics formGraphics=this.CreateGraphics();
//formGraphics.抽绳(myPen,0,0,200,200);
//myPen.Dispose();
//formGraphics.Dispose();
}
公共空心抽油墙(内行、内列)
{
}
#端区
}
}

它显示了很多错误,我想知道是否有人能看到我的错误。谢谢

首先确保PictureBox实现了非参数化构造函数

第二和第三个
Map1[i]=新单元()
初始化矩阵时,需要两个嵌套循环来遍历整个矩阵,并且需要使用逗号符号
[row,col]
来访问它。在循环中使用行而不是i


第四,在
Map1[0,0]=单元格末尾缺少一个“new”(真、假、假、真)

常见错误<代码>单元格[]【】
单元格[],]
不同

给出16,而不是代码假定的4

如果要使用数组的“长度”信息,应该这样做

    public void initiateArray()
    {
        Cell[,] Map1 = new Cell[4, 4];

        for (int row = 0; row < Map1.GetLength(0); row++)
        {
            for (int column = 0; column < Map1.GetLength(1); column++)
            {
                Map1[row, column] = new Cell();
            }
        }

        Map1[0, 0] = new Cell(true, false, false, true);
        Map1[0, 1] = new Cell(false, false, false, true);
    }

有很多,但我想知道的是,当您将鼠标悬停在Map1上时,它会说“名称空间不能直接包含字段和方法等成员”。在它说Map1被用作一个类型之前,它不是。希望有人能看到代码,看到它显然是错误的,并指明方向。这是关于Map1最重要的问题-您必须将代码放入方法中。它不可能在类级别上。@MarcinJuraszek感谢您刚刚更新了它,但我尝试在创建新方法后立即调用它,但它不允许我这样做。它还说Map1在当前上下文中不存在。StackOverflow颜色可能有点不正确,但对我来说,它看起来像是试图从外部范围访问方法变量。无法从包含方法的上下文外部访问Map1变量。你试过在Form1中把它变成公共财产吗?谢谢for(int row=0;rowint row=0到15之间进行迭代(以混合我的VB/C)。这显然是w
var foo = new Cell[4,4];
Console.WriteLine(foo.Length);
    public void initiateArray()
    {
        Cell[,] Map1 = new Cell[4, 4];

        for (int row = 0; row < Map1.GetLength(0); row++)
        {
            for (int column = 0; column < Map1.GetLength(1); column++)
            {
                Map1[row, column] = new Cell();
            }
        }

        Map1[0, 0] = new Cell(true, false, false, true);
        Map1[0, 1] = new Cell(false, false, false, true);
    }
    public void initiateArray()
    {
        Cell[,] Map1 = new Cell[4, 4];

        foreach(var row in Enumerable.Range(0, Map1.GetLength(0)))
        foreach(var column in Enumerable.Range(0, Map1.GetLength(1)))
        {
                Map1[row, column] = new Cell();         
        }
        Map1[0, 0] = new Cell(true, false, false, true);
        Map1[0, 1] = new Cell(false, false, false, true);
    }