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

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();
    }
}

改动说明:

  1. 把重复的提示逻辑抽成printInvalidMessage方法,不管是无效输入还是位置被占用,都可以调用这个方法输出提示,避免代码重复。
  2. 去掉了冗余的Switch分支,改用字符串分割+解析的方式处理坐标输入,代码更简洁,后续扩展也更方便。
  3. 加入了位置占用检查:解析出有效坐标后,判断该位置是否为空格,如果不是,就提示用户重新输入,不会直接放置棋子。
  4. 增加了输入格式合法性检查(比如输入不是"数字,数字"的情况),以及行列范围检查(必须是1-3)。

内容的提问来源于stack exchange,提问作者negbi2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:55:21