Java中用Scanner通过空格分隔输入行列的实现方法(黑白棋场景)
解决黑白棋游戏中Scanner空格分隔行/列输入的问题
核心问题原因
你用sc.nextInt()只能读取单个整数,用户输入的“行 列”是两个用空格分隔的数值,这种方式只会读取第一个数,剩下的第二个数会留在输入缓冲区,后续转字符串拆分的操作自然无效。
两种可行的解决方法
方法1:直接读取两个整数(最简单高效)
Scanner默认会以空格、换行等空白符作为分隔符,直接连续调用两次nextInt()就能分别获取行和列的数值:
System.out.print("Please enter the position of '1' (row col): "); // 分别读取行、列的整数输入 int row = sc.nextInt(); int col = sc.nextInt(); int b = 1; // 黑棋标记
方法2:读取整行后拆分(适合复杂输入场景)
如果需要先读取整行再拆分,要注意:之前调用sc.nextInt()后,输入缓冲区会遗留一个换行符,必须先调用sc.nextLine()消费掉这个换行符,否则会直接读取到空字符串:
// 先处理上一次nextInt留下的换行符 sc.nextLine(); System.out.print("Please enter the position of '1' (row col): "); String input = sc.nextLine(); String[] parts = input.split(" "); // 将拆分后的字符串转为整数 int row = Integer.parseInt(parts[0]); int col = Integer.parseInt(parts[1]); int b = 1;
额外代码优化建议
- 输入校验逻辑修正:原代码固定校验0-5是错误的,应该根据用户输入的棋盘大小
num判断,行和列的合法范围是0 <= row < num和0 <= col < num,避免数组越界。 - 落子逻辑修正:原代码用
bcp同时指代行和列是错误的,必须用分开的row和col操作二维数组,比如reversigame[row][col]。 - 棋盘打印优化:不要用
Arrays.deepToString()打印棋盘,建议写一个单独的打印方法,输出更直观:
public static void printBoard(int[][] board) { for (int[] rowArr : board) { for (int cell : rowArr) { System.out.print(cell + " "); } System.out.println(); } }
修正后的输入处理+基础校验示例
// 假设已完成棋盘初始化逻辑 System.out.print("Please enter the position of '1' (row col): "); int row = sc.nextInt(); int col = sc.nextInt(); int b = 1; // 输入范围合法性校验 if (row < 0 || row >= num || col < 0 || col >= num) { System.out.println("Error - input should be between 0 and " + (num-1) + "!"); } else { // 这里补充落子合法性判断(如是否能翻转对方棋子等) if (/* 合法落子条件 */) { reversigame[row][col] = b; printBoard(reversigame); } else { System.out.println("Error - invalid move"); } }
内容的提问来源于stack exchange,提问作者Cheng Kai Hing Jacky
相关产品推荐
相关产品推荐

