如何利用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
相关产品推荐
相关产品推荐

