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

Java Swing开发国际象棋时mousePressed无法正常移动棋子问题求助

问题修复方案

核心问题根源

你的mousePressed方法逻辑存在两处核心错误,导致只能完成一次移动:

  • 两个if判断为并行关系:第一次点击时,foi被设为true后会立刻触发第二个if的逻辑,相当于你用同一次点击的坐标同时作为起点和终点执行移动,第一次移动能生效实际是第二次点击时foi已经为true,用了第一次点击存的起点和第二次点击的终点完成了移动
  • 移动完成后没有重置foi状态:第一次移动完成后foi一直为true,后续所有点击都不会再更新起点坐标,且第一次移动完成后原起点位置已经变为空位,移动逻辑判断不通过,自然不会触发新的移动
    另外你在paintComponent方法末尾调用repaint()会触发无限循环重绘,严重消耗性能,也需要修复。

修复代码

1. 修复mousePressed逻辑

@Override
public void mousePressed(MouseEvent me) {
    int clickX = me.getX() / 100;
    int clickY = me.getY() / 100;
    if (!foi) {
        // 第一次点击,校验点击位置是否有棋子,无棋子则不记录起点
        if (board[clickY][clickX].equals("V")) {
            return;
        }
        // 记录起点坐标
        posxmouse = clickX;
        posymouse = clickY;
        foi = true;
    } else {
        // 第二次点击,记录终点坐标并执行移动
        posx1mouse = clickX;
        posy1mouse = clickY;
        board = moves.MajorMovePawn(board, posymouse, posxmouse, posy1mouse, posx1mouse);
        // 移动完成后主动重绘棋盘
        repaint();
        // 重置状态,准备下一轮移动
        foi = false;
    }
}

2. 修复paintComponent无限重绘问题

删除paintComponent方法最后一行的repaint()调用,改为移动完成后主动调用重绘即可。

后续优化建议

  • 目前MajorMovePawn仅支持白兵的移动逻辑,后续可扩展其他棋子的走子规则、吃子逻辑
  • 可增加回合判断,限制白方黑方交替走子
  • 增加走子合法性校验,避免棋子违规移动

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:45:04