初始化固定长度的class数组并在C#中动态添加值
Initialize array of a class with fixed length and dynamically add values in C#
我想要一个二维游戏板,每个字段都是自定义的 class,其中包含有关该字段的信息和属性。游戏板的大小在实例化时是已知的,属性的值不是。实例化后,我想为每个字段随机设置它们。我最初的想法是创建一个数组,而不是一个列表,因为游戏板的大小总是固定的。
public class GameBoard
{
private int _xValue;
private int _yValue;
private int _bombs;
private int _fields;
public Field[][] gameBoard;
public GameBoard(int x, int y)
{
_xValue = x;
_yValue = y;
_fields = _xValue * _yValue;
gameBoard = new[] { new Field[_xValue], new Field[_yValue] };
//Here I have to initialize every Field
for (int i = 0; i < _xValue; i++)
{
for (int j = 0; j < _yValue; j++)
{
//Set properties of Field
//For example: gameBoard[i][j].IsBomb = RandomBoolean;
//Here I get NullReferenceExceptions
}
}
}
}
我明白为什么这不起作用。我尝试了列表、二维数组,或者像现在这样的锯齿状数组,这是我更喜欢的。我怎样才能以可读、干净的方式解决这个问题?
编辑
领域class:
public class Field
{
public bool IsBomb { get; set; }
public bool IsFlagged { get; set; }
}
我试图在嵌套的 forloop 中添加 gameBoard[i][j] = new Field();
。这会导致 IndexOutOfRangeException。
这是你的数组-属性:
public Field[,] gameBoard;
这是初始化:
public GameBoard(int x, int y)
{
_xValue = x;
_yValue = y;
_fields = _xValue * _yValue;
gameBoard = new Field[_xValue, _yValue];
for (int i = 0; i < _xValue; i++)
{
for (int j = 0; j < _yValue; j++)
{
gameBoard[i, j] = new Field();
}
}
}
这里有很多关于如何使用锯齿状数组的困惑。如果你想使用锯齿状数组,你必须以这种方式设置
//Declare jagged array, I want _xValue arrays
Field[][] gameBoard = new Field[_xValue][];
for (int i = 0; i < _xValue; i++)
{
gameBoard[i] = new Field[_yValue];
for (int j = 0; j < _yValue; j++)
{
gameBoard[i][j] = new Field(){ IsBomb = RandomBoolean};
}
}
多维数组中的等价物是
//Declare multi-dimensional array of size _xValue x _yValue
Field[,] gameBoard2 = new Field[_xValue, _yValue];
for(int i = 0; i < _xValue; i++)
{
for(int j = 0; j < _yValue; j++)
{
// Instantiate the Field object at x,y
gameBoard2[i, j] = new Field { IsBomb = RandomBoolean };
}
}
我想要一个二维游戏板,每个字段都是自定义的 class,其中包含有关该字段的信息和属性。游戏板的大小在实例化时是已知的,属性的值不是。实例化后,我想为每个字段随机设置它们。我最初的想法是创建一个数组,而不是一个列表,因为游戏板的大小总是固定的。
public class GameBoard
{
private int _xValue;
private int _yValue;
private int _bombs;
private int _fields;
public Field[][] gameBoard;
public GameBoard(int x, int y)
{
_xValue = x;
_yValue = y;
_fields = _xValue * _yValue;
gameBoard = new[] { new Field[_xValue], new Field[_yValue] };
//Here I have to initialize every Field
for (int i = 0; i < _xValue; i++)
{
for (int j = 0; j < _yValue; j++)
{
//Set properties of Field
//For example: gameBoard[i][j].IsBomb = RandomBoolean;
//Here I get NullReferenceExceptions
}
}
}
}
我明白为什么这不起作用。我尝试了列表、二维数组,或者像现在这样的锯齿状数组,这是我更喜欢的。我怎样才能以可读、干净的方式解决这个问题?
编辑
领域class:
public class Field
{
public bool IsBomb { get; set; }
public bool IsFlagged { get; set; }
}
我试图在嵌套的 forloop 中添加 gameBoard[i][j] = new Field();
。这会导致 IndexOutOfRangeException。
这是你的数组-属性:
public Field[,] gameBoard;
这是初始化:
public GameBoard(int x, int y)
{
_xValue = x;
_yValue = y;
_fields = _xValue * _yValue;
gameBoard = new Field[_xValue, _yValue];
for (int i = 0; i < _xValue; i++)
{
for (int j = 0; j < _yValue; j++)
{
gameBoard[i, j] = new Field();
}
}
}
这里有很多关于如何使用锯齿状数组的困惑。如果你想使用锯齿状数组,你必须以这种方式设置
//Declare jagged array, I want _xValue arrays
Field[][] gameBoard = new Field[_xValue][];
for (int i = 0; i < _xValue; i++)
{
gameBoard[i] = new Field[_yValue];
for (int j = 0; j < _yValue; j++)
{
gameBoard[i][j] = new Field(){ IsBomb = RandomBoolean};
}
}
多维数组中的等价物是
//Declare multi-dimensional array of size _xValue x _yValue
Field[,] gameBoard2 = new Field[_xValue, _yValue];
for(int i = 0; i < _xValue; i++)
{
for(int j = 0; j < _yValue; j++)
{
// Instantiate the Field object at x,y
gameBoard2[i, j] = new Field { IsBomb = RandomBoolean };
}
}