C#飞行棋(Ludo)开发:For循环触发数组越界(Out of Bound)错误求助
嘿,这个数组越界问题我太熟了!咱们一步步来排查,先搞清楚核心前提:C#里的数组是0基索引的,15×15的二维数组,行和列的合法索引都是从0到14——这是最容易踩坑的点。
你说第一象限正常,第二象限触发错误,大概率是第二象限的循环逻辑里,某个索引超出了0-14的范围。我给你拆解几个常见的坑和排查步骤:
1. 先检查循环的终止条件
最常见的错误就是把循环条件写成<=15而不是<15(或者<=14)。比如你处理第二象限时,如果写了:
// 错误示例:j的终止条件到15,超出了数组最大索引14 for (int i = 0; i <= 7; i++) { for (int j = 8; j <= 15; j++) { board[i, j] = 9; // 当j=15时直接触发越界 } }
改成j <=14或者j <15就能解决这个问题。
2. 输出错误时的索引值,精准定位
在循环里加一行打印,把当前操作的索引打出来,就能立刻看到哪个值越界了:
for (int i = ...; ...) { for (int j = ...; ...) { Console.WriteLine($"当前操作索引:i={i}, j={j}"); board[i, j] = 9; } }
运行后看控制台,最后打印的那个索引就是罪魁祸首——要么是负数,要么大于14。
3. 检查象限坐标的转换逻辑
如果你的棋盘是按「中心原点」划分象限(比如以(7,7)为中心),那第二象限的逻辑坐标转数组索引时,有没有计算错误?比如是不是不小心把逻辑上的负坐标直接当成数组索引用了?举个例子:
// 错误示例:逻辑坐标转数组索引时没加中心偏移,导致负数索引 int centerX = 7, centerY =7; // 第二象限逻辑坐标:x负,y正 for (int logicX = -7; logicX <0; logicX++) { for (int logicY =1; logicY <=7; logicY++) { // 没加中心偏移,i变成负数了! int i = logicX; int j = centerY + logicY; board[i,j] =9; // 这里i是负数,直接触发越界 } }
正确的转换应该是int i = centerX + logicX;,这样索引才会落在0-14的合法范围内。
4. 确认二维数组的索引顺序
C#二维数组的索引是[行,列],如果你搞反了行和列的逻辑(比如把列当成行来遍历),也可能在某些象限触发越界——不过第一象限正常的话这个概率低,但也可以顺手检查一下。
按照上面的步骤排查,很快就能找到问题啦!
内容的提问来源于stack exchange,提问作者hhh
相关产品推荐
相关产品推荐

