用Java写坦克大战先产生一个窗口添加关闭窗口的事件处理不允许窗口的大小改动画出代表坦克的实心圆让坦克运动起来使用双缓冲消除闪烁现象代码重构让坦克听从我们的指挥
以下是用Java实现的坦克大战游戏的代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankGame extends JFrame {
    private static final int FRAME_WIDTH = 800;
    private static final int FRAME_HEIGHT = 600;
    private static final int TANK_SIZE = 50;
    private static final int TANK_SPEED = 5;
    private int tankX;
    private int tankY;
    private boolean tankMovingUp;
    private boolean tankMovingDown;
    private boolean tankMovingLeft;
    private boolean tankMovingRight;
    private Image offScreenImage;
    public TankGame() {
        setTitle("Tank Game");
        setSize(FRAME_WIDTH, FRAME_HEIGHT);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        addKeyListener(new TankKeyListener());
        setVisible(true);
        tankX = FRAME_WIDTH / 2 - TANK_SIZE / 2;
        tankY = FRAME_HEIGHT / 2 - TANK_SIZE / 2;
        while (true) {
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (tankMovingUp) {
                tankY -= TANK_SPEED;
            } else if (tankMovingDown) {
                tankY += TANK_SPEED;
            } else if (tankMovingLeft) {
                tankX -= TANK_SPEED;
            } else if (tankMovingRight) {
                tankX += TANK_SPEED;
            }
            repaint();
        }
    }
    @Override
    public void paint(Graphics g) {
        if (offScreenImage == null) {
            offScreenImage = this.createImage(FRAME_WIDTH, FRAME_HEIGHT);
        }
        Graphics offScreenGraphics = offScreenImage.getGraphics();
        Color c = offScreenGraphics.getColor();
        offScreenGraphics.setColor(Color.BLACK);
        offScreenGraphics.fillRect(0, 0, FRAME_WIDTH, FRAME_HEIGHT);
        offScreenGraphics.setColor(c);
        drawTank(offScreenGraphics);
        g.drawImage(offScreenImage, 0, 0, null);
    }
    private void drawTank(Graphics g) {
        g.setColor(Color.RED);
        g.fillOval(tankX, tankY, TANK_SIZE, TANK_SIZE);
    }
    private class TankKeyListener extends KeyAdapter {
        @Override
        public void keyPressed(KeyEvent e) {
            switch (e.getKeyCode()) {
                case KeyEvent.VK_UP:
                    tankMovingUp = true;
                    break;
                case KeyEvent.VK_DOWN:
                    tankMovingDown = true;
                    break;
                case KeyEvent.VK_LEFT:
                    tankMovingLeft = true;
                    break;
                case KeyEvent.VK_RIGHT:
                    tankMovingRight = true;
                    break;
            }
        }
        @Override
        public void keyReleased(KeyEvent e) {
            switch (e.getKeyCode()) {
                case KeyEvent.VK_UP:
                    tankMovingUp = false;
                    break;
                case KeyEvent.VK_DOWN:
                    tankMovingDown = false;
                    break;
                case KeyEvent.VK_LEFT:
                    tankMovingLeft = false;
                    break;
                case KeyEvent.VK_RIGHT:
                    tankMovingRight = false;
                    break;
            }
        }
    }
    public static void main(String[] args) {
        new TankGame();
    }
}
这段代码创建了一个继承自JFrame的TankGame类,实现了一个简单的坦克大战游戏。在窗口中画出了一个代表坦克的实心圆,并且通过键盘事件监听器实现了坦克的移动。双缓冲技术被用于消除闪烁现象。
在main方法中创建了一个TankGame对象,即可运行这个坦克大战游戏。
原文地址: https://www.cveoy.top/t/topic/iaLZ 著作权归作者所有。请勿转载和采集!