扫雷游戏相邻地雷计数异常及数组越界规避问题求助
扫雷游戏相邻地雷统计问题分析与修复
代码中的核心错误
- 变量名拼写混乱:声明了统计变量
contador,但后续统计时误用了未定义的counter++,导致统计结果完全错误。 - 行列索引颠倒:遍历相邻单元格时,错误地将列索引作为行下标(
board[l][m]),实际应该是行在前、列在后(board[row][col]),这直接导致取到的不是目标单元格的相邻区域,数值自然不符合预期。 - 未排除当前单元格:扫雷规则中,相邻地雷数不包含当前单元格本身,原代码会把当前单元格(如果是地雷)也计入统计,导致数值偏大。
- 边界处理冗余且易出错:手动赋值边界的方式逻辑繁琐,不如直接用
max/min函数限制范围清晰。
修正后的代码
fun counterMines() { val rows = board.size if (rows == 0) return val cols = board[0].size for (i in 0 until rows) { for (j in 0 until cols) { var mineCount = 0 // 计算相邻区域的安全边界,自动避免数组越界 val startRow = max(0, i - 1) val endRow = min(rows - 1, i + 1) val startCol = max(0, j - 1) val endCol = min(cols - 1, j + 1) // 遍历所有相邻单元格 for (row in startRow..endRow) { for (col in startCol..endCol) { // 跳过当前单元格本身 if (row == i && col == j) continue if (board[row][col].getIsMine()) { mineCount++ } } } board[i][j].setMines(mineCount) } } }
如何避免数组越界
- 用边界函数限制范围:通过
max(0, i-1)确保起始行不会小于0,min(rows-1, i+1)确保结束行不会超过矩阵最后一行的索引;列的边界处理同理,从根源上杜绝越界可能。 - 先判断矩阵合法性:遍历前先检查矩阵是否为空(
rows == 0),避免空矩阵操作导致的异常。 - 直接遍历安全范围:基于计算出的安全边界进行循环,不需要额外的变量存储边界值,逻辑更简洁不易出错。
针对你提到的错误坐标的修复说明
- (行:0/列:4):修正后会正确遍历其相邻的(0,3)、(1,3)、(1,4)三个单元格,统计其中的地雷数量,不会再出现错误的0值。
- (行:1/列:4):会准确遍历(0,3)、(0,4)、(1,3)、(2,3)、(2,4)这些相邻单元格,得到正确的统计值。
- (行:4/列:0):会遍历(3,0)、(3,1)、(4,1)三个相邻单元格,统计结果符合预期。
内容的提问来源于stack exchange,提问作者Daniel Requena
相关产品推荐
相关产品推荐

