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

如何在JavaScript井字棋游戏中用return替代System.exit(0)终止程序

嘿,我明白你遇到的问题了!先说说为什么System.exit(0)可能没起作用——对于Swing这类GUI程序来说,它运行在事件调度线程(EDT)上,直接调用System.exit(0)有时候会因为线程调度的问题没立刻生效,而且这也不是处理游戏结束的优雅方式,毕竟你可能还想让用户重新开局而不是直接关掉整个程序。

用return来控制游戏流程是个更好的思路,核心是通过一个状态变量来标记游戏是否结束,然后在按钮点击的逻辑里先判断这个状态,一旦游戏结束就直接return,不执行后续的标记操作。下面是具体的实现思路和代码示例:

实现步骤与代码示例

1. 定义游戏状态变量

在你的类里添加两个类级别的变量,用来跟踪游戏状态和当前玩家:

private boolean isGameOver = false;
private char currentPlayer = 'X';
// 把9个按钮存入数组,方便后续检查获胜组合
private JButton[] buttons = new JButton[9];

2. 按钮点击事件逻辑

给每个按钮添加监听器时,先判断游戏是否已结束,若结束则直接return跳过后续操作:

// 初始化按钮并绑定监听器
for (int i = 0; i < buttons.length; i++) {
    JButton btn = new JButton();
    btn.setFont(new Font("Arial", Font.PLAIN, 40));
    int index = i;
    btn.addActionListener(e -> {
        // 游戏已结束,直接return,不处理任何点击
        if (isGameOver) {
            return;
        }
        JButton clickedBtn = (JButton) e.getSource();
        // 避免重复点击已标记的按钮
        if (clickedBtn.getText().isEmpty()) {
            // 设置当前玩家的标记
            clickedBtn.setText(String.valueOf(currentPlayer));
            // 更改标记颜色,比如X用红色,O用蓝色
            clickedBtn.setForeground(currentPlayer == 'X' ? Color.RED : Color.BLUE);
            
            // 检查是否获胜
            if (checkIsWinner(currentPlayer)) {
                JOptionPane.showMessageDialog(null, "玩家 " + currentPlayer + " 获胜!");
                // 标记游戏结束
                isGameOver = true;
                // 退出当前监听器方法,不再执行玩家切换逻辑
                return;
            }
            
            // 未获胜则切换玩家
            currentPlayer = currentPlayer == 'X' ? 'O' : 'X';
        }
    });
    buttons[i] = btn;
}

3. 完善checkIsWinner函数

利用按钮数组遍历所有可能的获胜组合:

private boolean checkIsWinner(char player) {
    // 定义井字棋所有获胜组合的按钮索引
    int[][] winningCombinations = {
        {0, 1, 2}, {3, 4, 5}, {6, 7, 8}, // 横向行
        {0, 3, 6}, {1, 4, 7}, {2, 5, 8}, // 纵向列
        {0, 4, 8}, {2, 4, 6}             // 对角线
    };
    
    // 检查每个组合是否匹配当前玩家的标记
    for (int[] combo : winningCombinations) {
        JButton btn1 = buttons[combo[0]];
        JButton btn2 = buttons[combo[1]];
        JButton btn3 = buttons[combo[2]];
        
        if (player == btn1.getText().charAt(0) &&
            player == btn2.getText().charAt(0) &&
            player == btn3.getText().charAt(0)) {
            return true;
        }
    }
    return false;
}

额外优化:关闭窗口替代终止JVM

如果你确实想在获胜后直接关闭整个程序窗口,可以在设置isGameOver = true后添加:

// 假设你的主窗口是JFrame实例,变量名为frame
frame.dispose();

这比System.exit(0)更优雅,它会正常关闭窗口并释放资源,若这是程序的最后一个窗口,JVM也会自动退出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:38:14