Java实现3-10人井字棋玩家回合轮转逻辑问题修复
3-10人多玩家井字棋回合逻辑修复
原有代码问题
- 嵌套两层玩家遍历逻辑完全错误:每次点击按钮会遍历所有玩家组合,重复执行落子逻辑,直接导致落子标识错乱、回合跳转异常,当j遍历到玩家数组末尾时
pIcon[j+1]还会触发数组越界报错 - 回合标记思路冗余:双人版本里的
pTurn布尔值本质就是记录2个玩家的轮转状态,扩展到多人不需要布尔数组,用单个整数记录当前玩家下标即可,逻辑更简单不容易出错 - 字符串判断写法错误:Java中用
==比较字符串是对比对象内存地址不是内容,判断按钮文本为空必须用equals()方法,否则会出现空值判断失效的问题 - 所有玩家落子统一用蓝色,没法区分不同玩家的棋子
修复方案
直接删掉原有的players[]布尔数组和两层玩家遍历逻辑,参考双人版本的状态记录思路,用单个整数变量记录当前轮到的玩家下标,落子后通过取模运算实现循环轮转:
- 先在类中定义全局成员变量:
// 当前回合玩家下标,初始为0代表第一个玩家先手 private int currentPlayer = 0; // 玩家落子标识数组,长度匹配玩家总人数,支持3-10人自定义 private String[] pIcon; // 玩家棋子对应颜色数组,每个玩家分配独立颜色方便区分 private Color[] pColor; // 玩家总人数(替换原有语义模糊的col_row变量) private int playerCount;
- 初始化游戏时,根据选择的玩家人数给
pIcon、pColor、playerCount赋值即可,比如3人局就给两个数组塞3个对应元素。 - 替换按钮监听逻辑为如下代码:
buttons[i].addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { for(int i = 0; i < buttons.length; i++) { if(e.getSource() == buttons[i]) { // 用equals判断按钮是否为空,避免字符串引用比较的坑 if("".equals(buttons[i].getText())) { // 给当前回合玩家落子 buttons[i].setForeground(pColor[currentPlayer]); buttons[i].setText(pIcon[currentPlayer]); // 轮转到下一位玩家,对总人数取模实现末尾玩家之后自动回到第一位 currentPlayer = (currentPlayer + 1) % playerCount; // 更新顶部回合提示 txt.setText(pIcon[currentPlayer] + " turn"); // 校验胜负/平局状态 checkCondition(); } break; // 匹配到点击的按钮后直接跳出循环,减少无效遍历 } } } });
额外注意
- 原有的
checkCondition()胜负判断逻辑也要同步修改,把原来固定判断X、O获胜的逻辑,改成遍历所有玩家的落子标识,判断是否有玩家凑成获胜连线即可 - 游戏重置时记得把
currentPlayer重置为0,保证每局都是第一个玩家先手
运行效果示意:
内容的提问来源于stack exchange,提问作者TeachMeTWz
相关产品推荐
相关产品推荐

