首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java Swing 實現坦克大戰雛形:鍵盤控制上下左右移動與繪製邏輯

     編輯:Java 綜合教學

Java Swing 實現坦克大戰雛形:鍵盤控制上下左右移動與繪製邏輯

本文通過繼承 JPanel 重寫 paint、實現 KeyListener、使用 Graphics 繪製四方向坦克,實現簡易鍵盤控制移動演示。

類結構

  • MytankGame2 extends JFrame:主窗口,添加面板、註冊鍵盤監聽。
  • MyPanel extends JPanel implements KeyListener:繪製邏輯、鍵盤事件處理、持有 Mytank 實例。
  • Mytank:封裝坦克座標 x,y、方向 direct(0上 1下 2右 3左)及移動方法。

核心代碼

主窗口

public class MytankGame2 extends JFrame {
    MyPanel mp;
    public static void main(String[] args) { new MytankGame2(); }
    public MytankGame2() {
        mp = new MyPanel();
        this.add(mp);
        this.addKeyListener(mp);
        this.setSize(270, 500);
        this.setLocation(200, 200);
        this.setVisible(true);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
}

繪製面板與鍵盤處理

class MyPanel extends JPanel implements KeyListener {
    Mytank mt = new Mytank(10, 10);

    public void paint(Graphics g) {
        super.paint(g);
        g.fillRect(0, 0, 300, 400); // 清屏背景
        drawTank(mt.getX(), mt.getY(), 0, mt.getDirect(), g);
    }

    void drawTank(int x, int y, int type, int direct, Graphics g) {
        g.setColor(type == 0 ? Color.ORANGE : Color.BLUE);
        switch (direct) {
            case 0: // 上
                g.fillRect(x, y, 5, 30);          // 左履帶
                g.fillRect(x+5, y+5, 20, 20);     // 車身
                g.fillRect(x+25, y, 5, 30);       // 右履帶
                g.setColor(Color.RED); g.drawLine(x+15, y-5, x+15, y+5); // 炮管
                g.setColor(Color.GREEN); g.fillOval(x+7, y+7, 16, 16);   // 炮塔
                break;
            case 1: // 下
                g.fillRect(x, y, 5, 30);
                g.fillRect(x+5, y+5, 20, 20);
                g.fillRect(x+25, y, 5, 30);
                g.setColor(Color.RED); g.drawLine(x+15, y+15, x+15, y+35);
                g.setColor(Color.GREEN); g.fillOval(x+7, y+7, 16, 16);
                break;
            case 2: // 右
                g.fillRect(x, y, 30, 5);
                g.fillRect(x+5, y+5, 20, 20);
                g.fillRect(x, y+25, 30, 5);
                g.setColor(Color.RED); g.drawLine(x-5, y+15, x+15, y+15);
                g.setColor(Color.GREEN); g.fillOval(x+7, y+7, 16, 16);
                break;
            case 3: // 左
                g.fillRect(x, y, 30, 5);
                g.fillRect(x+5, y+5, 20, 20);
                g.fillRect(x, y+25, 30, 5);
                g.setColor(Color.RED); g.drawLine(x+15, y+15, x+35, y+15);
                g.setColor(Color.GREEN); g.fillOval(x+7, y+7, 16, 16);
                break;
        }
    }

    public void keyPressed(KeyEvent e) {
        switch (e.getKeyCode()) {
            case KeyEvent.VK_W: mt.setDirect(0); mt.moveUp(); break;
            case KeyEvent.VK_S: mt.setDirect(1); mt.moveDown(); break;
            case KeyEvent.VK_D: mt.setDirect(2); mt.moveRight(); break;
            case KeyEvent.VK_A: mt.setDirect(3); mt.moveLeft(); break;
        }
        repaint(); // 觸發 paint 重繪
    }
    public void keyTyped(KeyEvent e) {}
    public void keyReleased(KeyEvent e) {}
}

坦克實體類

class Mytank {
    private int x, y, direct;
    public Mytank(int x, int y) { this.x = x; this.y = y; }
    public void moveUp() { y -= 5; }
    public void moveDown() { y += 5; }
    public void moveLeft() { x -= 5; }
    public void moveRight() { x += 5; }
    // getter/setter 省略
}

擴展方向

  • 邊界檢測:防止坦克移出可視區域。
  • 子彈發射:空格鍵創建 Bullet 線程,碰撞檢測。
  • 敵人坦克:AI 隨機移動、自動射擊。
  • 雙緩衝:覆寫 update 使用 BufferStrategy 消除閃爍。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved