You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

扫雷游戏相邻地雷计数异常及数组越界规避问题求助

扫雷游戏相邻地雷统计问题分析与修复

代码中的核心错误

  1. 变量名拼写混乱:声明了统计变量contador,但后续统计时误用了未定义的counter++,导致统计结果完全错误。
  2. 行列索引颠倒:遍历相邻单元格时,错误地将列索引作为行下标(board[l][m]),实际应该是行在前、列在后(board[row][col]),这直接导致取到的不是目标单元格的相邻区域,数值自然不符合预期。
  3. 未排除当前单元格:扫雷规则中,相邻地雷数不包含当前单元格本身,原代码会把当前单元格(如果是地雷)也计入统计,导致数值偏大。
  4. 边界处理冗余且易出错:手动赋值边界的方式逻辑繁琐,不如直接用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:50:27