Java扫雷程序无法统计右侧炸弹问题求助
扫雷邻雷计数问题排查与修复
我看到你在实现扫雷的邻雷计数逻辑时,遇到了右侧炸弹无法被统计的问题,咱们来一步步拆解问题并修复:
核心问题:边界判断依赖固定变量而非数组实际长度
你的代码里用btnAmt-1来判断数组边界,但如果background二维数组的实际行列数和btnAmt不一致(比如初始化时数组大小写错,或者btnAmt值被误改),就会导致边界判断错误——要么漏掉可统计的右侧方块,要么出现数组越界。
正确的做法是依赖数组自身的长度做边界判断,而不是固定的btnAmt变量:
- x方向的边界用
background.length - 1(总行数-1) - y方向的边界用
background[x].length - 1(当前行的总列数-1)
额外漏洞:遗漏正下方炸弹的计数
仔细看你的代码,发现你漏掉了当前方块**正下方(x, y+1)**的炸弹判断,这会导致正下方的炸弹也无法被统计进去。
修正后的完整计数代码
// Count neighbouring mines for(int x = 0; x < background.length; x++){ for(int y = 0; y < background[x].length; y++){ int nCount = 0; if(background[x][y] != MINE){ // Up Left if((x > 0) && (y > 0) && (background[x-1][y-1] == MINE)){ nCount++; } // Up if(y > 0 && background[x][y-1] == MINE){ nCount++; } // Up Right if(x < background.length - 1 && y > 0 && background[x+1][y-1] == MINE){ nCount++; } // Left if(x > 0 && background[x-1][y] == MINE){ nCount++; } // Down Left if(x > 0 && y < background[x].length - 1 && background[x-1][y+1] == MINE){ nCount++; } // Down if(y < background[x].length - 1 && background[x][y+1] == MINE){ nCount++; } // Down Right if(x < background.length - 1 && y < background[x].length - 1 && background[x+1][y+1] == MINE){ nCount++; } // Right if(x < background.length - 1 && background[x+1][y] == MINE){ nCount++; } background[x][y] = nCount; } } }
后续排查建议
如果修改后问题仍存在,可以检查以下几点:
- 确认
background数组的初始化逻辑,确保炸弹的MINE标记和计数判断中的MINE是同一个值(比如是否是同一个常量定义) - 验证
btnAmt是否确实等于background数组的行列数,避免变量和实际数组大小不匹配 - 可以打印
background数组的初始状态和计数后的状态,对比某个右侧有炸弹的方块,看计数是否正确
内容的提问来源于stack exchange,提问作者Jek Jek
相关产品推荐
相关产品推荐

