import javax.swing.*;import java.awt.*;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.util.ArrayList;import java.util.HashSet;import java.util.Random;import java.util.Set;public class GamePanel extends JPanel implements KeyListener {//GamePanel类是游戏的核心控制器,负责管理游戏循环、输入处理和游戏状态更新。 private TankA tankA; private TankB tankB; private final Set pressedKeys = new HashSet(); private final Timer gameTimer; private final Random ran = new Random(); private final BattleMaps map; private final scorePanel sPanel; private final ArrayList bullets = new ArrayList(); private boolean gameOver = false; private String winner = \"\"; public GamePanel() { map = new BattleMaps(); sPanel = new scorePanel(); // 生成坦克A的合法位置 tankA = generatePositionA(45, 35); tankB = generatePositionB(45, 35); // 生成坦克B的合法位置(且不与A重叠) // 初始化游戏定时器(每16ms≈60FPS) //使用游戏循环(Timer)来定期处理按键状态,更新坦克位置。 gameTimer = new Timer(7, e -> { processInput();// 处理输入 updateGame();// 更新游戏状态 SwingUtilities.invokeLater(this::repaint);// 请求重绘 }); gameTimer.start(); setFocusable(true); addKeyListener(this); } private TankA generatePositionA(int width, int height) { Random ran = new Random(); Rectangle tempRect; int x, y; do { x = 120 + ran.nextInt(900); y = 60 + ran.nextInt(750); tempRect = new Rectangle(x, y, width, height); } while (map.isCollidingWithWall(tempRect)); // 确保不生成在墙上 return new TankA(x, y); // 或 TankB } private TankB generatePositionB(int width, int height) { Random ran = new Random(); Rectangle tempRect; int x, y; do { x = 120 + ran.nextInt(900); y = 60 + ran.nextInt(750); tempRect = new Rectangle(x, y, width, height); } while (map.isCollidingWithWall(tempRect)); // 确保不生成在墙上 return new TankB(x, y); // 或 TankB } private void processInput() { // 游戏结束时忽略所有输入 if (gameOver) return; // 处理坦克A // 每次循环先重置速度 tankA.setSpeedX(0); tankA.setSpeedY(0); // 根据当前按下的键设置速度 if (pressedKeys.contains(KeyEvent.VK_A)) { tankA.setDirection(0); tankA.setSpeedX(-4); } if (pressedKeys.contains(KeyEvent.VK_D)) { tankA.setDirection(2); tankA.setSpeedX(4); } if (pressedKeys.contains(KeyEvent.VK_W)) { tankA.setDirection(1); tankA.setSpeedY(-4); } if (pressedKeys.contains(KeyEvent.VK_S)) { tankA.setDirection(3); tankA.setSpeedY(4); } // 处理坦克B tankB.setSpeedX(0); tankB.setSpeedY(0); if (pressedKeys.contains(KeyEvent.VK_LEFT)) { tankB.setDirection(0); tankB.setSpeedX(-4); } if (pressedKeys.contains(KeyEvent.VK_RIGHT)) { tankB.setDirection(2); tankB.setSpeedX(4); } if (pressedKeys.contains(KeyEvent.VK_UP)) { tankB.setDirection(1); tankB.setSpeedY(-4); } if (pressedKeys.contains(KeyEvent.VK_DOWN)) { tankB.setDirection(3); tankB.setSpeedY(4); } } private void updateGame() { if (gameOver) { return; } handleTankMovement(tankA); handleTankMovement(tankB); //更新子弹位置 for (Bullet bullet : new ArrayList(bullets)) { bullet.move(); //检测子弹与墙壁的碰撞 if (map.isCollidingWithWall(bullet.getBounds())) { bullet.setActive(false); } //检测子弹与坦克碰撞 if (bullet.isActive()) {