Java二维数组字符检测问题:象棋程序胜负判定功能异常
问题根因与修复方案
核心bug定位
你的get方法里二维数组的下标顺序写反了,这是导致状态判断全部错误的根源:
- Java中
char[][] board的第一个索引是行索引,第二个是列索引 - 你在
get方法的边界判断里已经明确了规则:y是行索引(对应y < board.length),x是列索引(对应x < board[0].length) - 但返回值错误写为
board[x][y],相当于把行列索引互换,绝大多数合法坐标都会触发数组越界,直接返回\0,自然无法匹配到K和S
修复方案
把get方法的返回语句修改即可:
public char get(int x, int y) { if(x < board[0].length && x >= 0 && y < board.length && y >= 0){ // 原错误代码 return board[x][y]; return board[y][x]; } else return '\0'; }
可选优化
decideWinner方法不需要遍历两次棋盘,单次遍历就可以同时检测两个王的存活状态,效率更高:
public int decideWinner(){ boolean kingWhiteIsAlive = false; boolean kingBlackIsAlive = false; for(int y = 0; y < board.length;y++){ for(int x = 0;x < board[0].length;x++){ char c = get(x,y); if(c == 'K'){ kingWhiteIsAlive = true; }else if(c == 'S'){ kingBlackIsAlive = true; } // 两个王都找到可以提前退出遍历,减少不必要的循环 if(kingWhiteIsAlive && kingBlackIsAlive) break; } if(kingWhiteIsAlive && kingBlackIsAlive) break; } if(kingWhiteIsAlive && kingBlackIsAlive){ return 0; }else if(kingWhiteIsAlive){ return 1; }else if(kingBlackIsAlive){ return 2; }else{ return -1; } }
内容的提问来源于stack exchange,提问作者Moorched
相关产品推荐
相关产品推荐

