C# 超出范围的扫雷艇例外
我正在尝试创建一个类来检查被检查瓷砖周围的地雷数量。但问题是我的范围设置为1-max height。如果PosY和posX是1和1,检查左上角的平铺,它将检入到Board数组,例如Board[0,0],但它超出范围,但由于我们没有任何平铺可以检查它的左、上和斜左,它将给出一个例外,即它超出范围C# 超出范围的扫雷艇例外,c#,C#,我正在尝试创建一个类来检查被检查瓷砖周围的地雷数量。但问题是我的范围设置为1-max height。如果PosY和posX是1和1,检查左上角的平铺,它将检入到Board数组,例如Board[0,0],但它超出范围,但由于我们没有任何平铺可以检查它的左、上和斜左,它将给出一个例外,即它超出范围 public int GetMineCount(int posY, int posX) { int count = 0; if (Board
public int GetMineCount(int posY, int posX)
{
int count = 0;
if (Board[posY-1, posX-1] == CellState.Mine)
count++;
if (Board[posY, posX-1] == CellState.Mine)
count++;
if (Board[posY + 1, posX - 1] == CellState.Mine)
count++;
if (Board[posY + 1, posX] == CellState.Mine)
count++;
if (Board[posY + 1, posX + 1] == CellState.Mine)
count++;
if (Board[posY, posX+1] == CellState.Mine)
count++;
if (Board[posY-1, posX+1] == CellState.Mine)
count++;
if (Board[posY-1, posX] == CellState.Mine)
count++;
return count;
}
是否有一个好的做法,如果数组是我们的范围,它将不计算它。如果输入是0,0,这一行:
if (Board[posY-1, posX-1] == CellState.Mine)
将尝试访问索引-1,-1。根据定义,Wich永远不可能在范围内
你面临着一个由来已久的问题:制作一个游戏板,看着所有的邻居,而不是酸溜溜地看着游戏板外面。我只能想出几个办法来解决这个问题:
添加一层1 elemet厚的边界空间,该边界空间不显示。正确地标记它。用代码解释它。但在输出过程中忽略它。
使函数访问每个方向。然后,该函数将处理不正确的索引。然而,这是大量的写作工作。而且抄袭会让人难以阅读。
我想到了第三条路。一个单独的函数,其唯一目的是验证索引是否有效。这两个索引必须>=0,但在此维度中public CellState GetCellState(int posY, int posX)
{
if (posX < 0) return CellState.Invalid;
if (posY < 0) return CellState.Invalid;
if (posX >= MaxX) return CellState.Invalid;
if (posY >= MaxY) return CellState.Invalid;
return Board[posY, posX];
}
现在,单个函数将检查每个单元格是否在正确的范围内。这四个if语句可以合并为一个,但我这样写是为了清晰。不过,您的CellState枚举现在需要包含无效值。
不过,这仍然不是我喜欢的方法。但我正在考虑的解决方案解释起来有点复杂,而且不涉及数组。。。当我放置地雷时,我会计算地雷数量,而不是之后…为什么板[0,0]会超出范围?我知道你看错地方了。您是否在调试器中签入了发生错误时的值。最好的做法是事先检查位置的值,以便防止异常发生。但正如塞廷所说,0,0不应该被认为是在一个数组中的可能的重复范围之外
public int GetMineCount(int posY, int posX)
{
int count = 0;
if (GetCellState(posY-1, posX-1) == CellState.Mine)
count++;
if (GetCellState(posY-1, posX) == CellState.Mine)
count++;
if (GetCellState(posY-1, posX+1) == CellState.Mine)
count++;
if (GetCellState(posY, posX-1) == CellState.Mine)
count++;
if (GetCellState(posY, posX+1) == CellState.Mine)
count++;
if (GetCellState(posY+1, posX-1) == CellState.Mine)
count++;
if (GetCellState(posY+1, posX) == CellState.Mine)
count++;
if (GetCellState(posY+1, posX+1) == CellState.Mine)
count++;
return count;
}