Java中Switch Case能否引用Default?井字棋CLI开发疑问
井字棋:Switch逻辑复用与位置占用检查实现
关于Switch分支复用逻辑的问题
你没法直接在case分支里引用default的逻辑,但完全不用把代码复制到每个case里——把重复的逻辑抽成一个独立方法就行。比如把默认分支的提示代码做成一个小方法,不管是default还是case里需要用到的时候,直接调用这个方法就好。
实现位置占用检查+优化冗余的Switch代码
你的Switch写了9个case太啰嗦了,其实可以直接解析用户输入的坐标字符串,转换成棋盘数组的索引,既简洁又好维护。另外,要实现位置占用检查,只需要在解析出有效坐标后,判断该位置是不是空格就行,如果已经有棋子,就提示用户重新输入,不要让循环结束。
下面是修改后的完整代码,关键改动都加了注释:
import java.util.Scanner; public class TickTack { String[][] tickTackToe = { {" ", "|", " ", "|", " "}, {"-", "-", "-", "-", "-"}, {" ", "|", " ", "|", " "}, {"-", "-", "-", "-", "-"}, {" ", "|", " ", "|", " "} }; int xCoor = 0, yCoor = 0, counter = 1; // 暂时忽略这些变量 int rOne = 0, rTwo = 0, rThree = 0; int cOne = 0, cTwo = 0, cThree = 0; int dOne = 0, dTwo = 0; String input = ""; Scanner in = new Scanner(System.in); // 抽出来的通用提示方法,复用逻辑 private void printInvalidMessage(String message) { System.out.println(message); } public void play() { while (!input.equals("win")) { // 打印棋盘 for (int fila = 0; fila < 5; fila++) { for (int columna = 0; columna < 5; columna++) { System.out.print(tickTackToe[fila][columna]); } System.out.println(); } boolean isValidInput = false; while (!isValidInput) { input = in.next(); // 处理退出条件 if (input.equals("win")) { isValidInput = true; continue; } // 解析坐标,替代冗余的Switch String[] coords = input.split(","); if (coords.length != 2) { printInvalidMessage("that is not a valid option"); continue; } try { int row = Integer.parseInt(coords[0]); int col = Integer.parseInt(coords[1]); // 检查行和列是否在1-3范围内 if (row < 1 || row > 3 || col < 1 || col > 3) { printInvalidMessage("that is not a valid option"); continue; } // 转换成棋盘数组的索引(棋盘有分隔符,行/列索引为2*(输入值-1)) xCoor = 2 * (row - 1); yCoor = 2 * (col - 1); // 检查目标位置是否已有棋子 if (!tickTackToe[xCoor][yCoor].equals(" ")) { printInvalidMessage("this position is already taken, choose another"); continue; } // 所有检查通过,标记输入有效 isValidInput = true; } catch (NumberFormatException e) { // 输入不是数字的情况 printInvalidMessage("that is not a valid option"); } } // 处理棋子放置(排除退出指令) if (!input.equals("win")) { counter++; tickTackToe[xCoor][yCoor] = counter % 2 == 0 ? "x" : "o"; } } } public static void main(String[] args) { new TickTack().play(); } }
改动说明:
- 把重复的提示逻辑抽成
printInvalidMessage方法,不管是无效输入还是位置被占用,都可以调用这个方法输出提示,避免代码重复。 - 去掉了冗余的Switch分支,改用字符串分割+解析的方式处理坐标输入,代码更简洁,后续扩展也更方便。
- 加入了位置占用检查:解析出有效坐标后,判断该位置是否为空格,如果不是,就提示用户重新输入,不会直接放置棋子。
- 增加了输入格式合法性检查(比如输入不是"数字,数字"的情况),以及行列范围检查(必须是1-3)。
内容的提问来源于stack exchange,提问作者negbi2
相关产品推荐
相关产品推荐

