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

如何利用ActionListener实现战舰游戏的回合响应机制?

战舰游戏回合逻辑实现方案

核心问题修正与逻辑整合

现有代码存在新建GUI实例导致操作对象不匹配的问题,先修正这个基础问题,再整合回合触发逻辑:


1. 修正棋盘按钮的ActionListener实现

不要在buttonPress中每次新建OpponentDeckGUI实例,应传入当前已初始化的界面实例,确保操作的是界面上的真实按钮。同时在点击事件中判断是否命中,未命中时触发AI回合:

// 传入当前已初始化的OpponentDeckGUI和PlayerDeckGUI实例
public void buttonPress(OpponentDeckGUI odGUI, PlayerDeckGUI pdGUI, PlayerDeckCreationListener pdcl) {
    ArrayList<JButton> localList = new ArrayList<>();
    for(JButton button : odGUI.getOpponentCommonButtonList()){
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 禁用按钮,防止重复点击
                button.setEnabled(false);
                boolean isHit = odGUI.getOpponentPinkButtonList().contains(button);
                if(isHit){
                    button.setBackground(Color.PINK);
                    // 命中时,玩家继续回合(可根据游戏规则添加胜利判断)
                }else{
                    button.setBackground(Color.CYAN);
                    // 未命中,触发AI的随机攻击回合
                    triggerAIAction(pdGUI, pdcl);
                }
                localList.add(button);
                // 从可点击列表移除,避免重复处理
                odGUI.getOpponentCommonButtonList().remove(button);
            }
        });
    }
    // 统一移除已添加监听的按钮(避免循环内修改列表引发异常)
    odGUI.getOpponentPinkButtonList().removeAll(odGUI.getOpponentCommonButtonList());
}

// 提取AI攻击逻辑为独立方法,复用性更强
private void triggerAIAction(PlayerDeckGUI pdGUI, PlayerDeckCreationListener pdcl) {
    if(pdGUI.getPlayerCommonButtonList().isEmpty()){
        // 玩家棋盘格子已被全部攻击,可判断游戏结束
        return;
    }
    int randomTile = (int) (Math.random() * pdGUI.getPlayerCommonButtonList().size());
    JButton localButton = pdGUI.getPlayerCommonButtonList().get(randomTile);
    localButton.setEnabled(false); // 禁用被攻击的玩家格子
    if(pdcl.getPlayerDeckList().contains(localButton)){
        localButton.setBackground(Color.RED);
        // AI命中,可添加后续逻辑(比如继续攻击?根据规则调整)
    }else{
        localButton.setBackground(Color.CYAN);
        // AI未命中,回合回到玩家
    }
    pdGUI.getPlayerCommonButtonList().remove(localButton);
}

2. 关键优化点说明

  • 避免新建GUI实例:所有操作都基于已初始化并显示在界面上的OpponentDeckGUI、PlayerDeckGUI实例,确保修改的是真实界面元素。
  • 按钮禁用:点击后立即禁用按钮,防止玩家重复点击同一格子,AI攻击后也禁用玩家棋盘的对应格子。
  • 回合逻辑清晰:玩家点击后,命中则继续回合,未命中则触发AI攻击,完成回合切换。
  • 异常避免:修正原代码中循环内修改列表导致的ConcurrentModificationException问题。

3. 调用方式

在初始化界面时,传入已创建的实例:

// 假设已初始化好以下实例
OpponentDeckGUI odGUI = new OpponentDeckGUI();
PlayerDeckGUI pdGUI = new PlayerDeckGUI();
PlayerDeckCreationListener pdcl = new PlayerDeckCreationListener();

// 绑定按钮监听
buttonPress(odGUI, pdGUI, pdcl);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:10:53