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
相关产品推荐
相关产品推荐

