如何避免索引超出数组范围?
How to avoid index outside of bound of the array?
我正在制作一个 Othello/Reversi 游戏,我在其中使用二维数组来保存棋盘上每个 space 的内存。
为了检查有效的移动,我使用了一个 if 语句,其中我使用 r+1 来检查同一行上的下一个 space。然而,由于数组只有 [8, 8] 大,当我遇到 r 为 8 的情况时,我得到一个错误,因为它正在尝试检查数组中的第 9 个元素。这给了我一个索引越界错误。
想知道解决此问题的最佳方法是什么?我想也许可以换成一个列表,但我不确定这是否也适用于二维数组?
public box[,] grid = new box[8, 8];
if ((grid[r + 1, c].value == currentPlayer)
{
return true;
}
您只需检查 r + 1
是否为合法索引。拥有一个列表无济于事,因为您仍然会在列表范围之外进行检查。所以你只需要:
if (r + 1 > 7) return false;
你知道数组的大小。但是,为了避免 "magic numbers" 你最好获取数组第一维的上限:
if (r + 1 > grid.GetUpperBound(0)) return false;
您可以执行相同的操作来检查 c
是否在范围内:
if (c < 0 || c > grid.GetUpperBound(1)) return false;
我正在制作一个 Othello/Reversi 游戏,我在其中使用二维数组来保存棋盘上每个 space 的内存。
为了检查有效的移动,我使用了一个 if 语句,其中我使用 r+1 来检查同一行上的下一个 space。然而,由于数组只有 [8, 8] 大,当我遇到 r 为 8 的情况时,我得到一个错误,因为它正在尝试检查数组中的第 9 个元素。这给了我一个索引越界错误。
想知道解决此问题的最佳方法是什么?我想也许可以换成一个列表,但我不确定这是否也适用于二维数组?
public box[,] grid = new box[8, 8];
if ((grid[r + 1, c].value == currentPlayer)
{
return true;
}
您只需检查 r + 1
是否为合法索引。拥有一个列表无济于事,因为您仍然会在列表范围之外进行检查。所以你只需要:
if (r + 1 > 7) return false;
你知道数组的大小。但是,为了避免 "magic numbers" 你最好获取数组第一维的上限:
if (r + 1 > grid.GetUpperBound(0)) return false;
您可以执行相同的操作来检查 c
是否在范围内:
if (c < 0 || c > grid.GetUpperBound(1)) return false;