MiniBallGame GUI小游戏

阅读 21

07-16 12:00

import javax.swing.; import java.awt.; import java.awt.event.KeyAdapter; import java.awt.event.ActionListener; import java.util.TimerEvent; import java.util.Timer;

public class MiniBallGame extends JFrame { // 小球属性 private int ballX = 250, ballY = 300; // 初始坐标(窗口中心) private int ballSpeedX = 4, ballSpeedY = 3; // 水平和垂直速度 private final int BALL_SIZE = 20; // 小球直径

// 挡板属性
private int paddleX = 210, paddleY = 450; // 初始位置(窗口底部中间)
private final int PADDLE_WIDTH = 80, PADDLE_HEIGHT = 10;

// 构造函数
public MiniBallGame() {
    setTitle("迷你弹球游戏");
    setSize(500, 500);                      // 窗口尺寸
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);            // 居中显示
    
    // 添加键盘监听器控制挡板
    addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(java.awt.event.KeyEvent e) {
            if (e.getKeyCode() == java.awt.event.KeyEvent.VK_LEFT && paddleX > 0) {
                paddleX -= 10;              // 左移挡板
            } else if (e.getKeyCode() == java.awt.event.KeyEvent.VK_RIGHT && 
                       paddleX < getWidth() - PADDLE_WIDTH) {
                paddleX += 10;              // 右移挡板
            }
        }
    });
    
    // 启动游戏循环
    Timer timer = new Timer(true);
    timer.scheduleAtFixedRate(new GameLoop(), 0, 20); // 每20ms刷新一次
}

// 游戏主循环
class GameLoop extends java.util.TimerTask {
    @Override
    public void run() {
        // 更新小球位置
        ballX += ballSpeedX;
        ballY += ballSpeedY;
        
        // 边界碰撞检测(左右墙壁)
        if (ballX <= 0 || ballX >= getWidth() - BALL_SIZE) 
            ballSpeedX = -ballSpeedX;
        
        // 顶部碰撞检测
        if (ballY <= 0) 
            ballSpeedY = -ballSpeedY;
        
        // 底部碰撞检测(游戏失败条件)
        if (ballY >= getHeight() - BALL_SIZE) {
            ballY = getHeight() - BALL_SIZE;
            ballSpeedY = 0; // 停止运动
        }
        
        // 挡板碰撞检测
        if (ballY + BALL_SIZE >= paddleY && 
            ballX >= paddleX && 
            ballX <= paddleX + PADDLE_WIDTH) {
            ballSpeedY = -ballSpeedY;      // 反弹
            ballSpeedX += (int)Math.round(Math.random()*2-1); // 增加随机性
            ballSpeedY += (int)Math.round(Math.random()*2-1);
        }
        
        repaint(); // 触发界面重绘
    }
}

// 自定义绘制方法
@Override
public void paint(Graphics g) {
    super.paint(g);
    
    // 绘制黑色背景
    g.setColor(Color.BLACK);
    g.fillRect(0, 0, getWidth(), getHeight());
    
    // 绘制白色小球
    g.setColor(Color.WHITE);
    g.fillOval(ballX, ballY, BALL_SIZE, BALL_SIZE);
    
    // 绘制蓝色挡板
    g.setColor(Color.CYAN);
    g.fillRect(paddleX, paddleY, PADDLE_WIDTH, PADDLE_HEIGHT);
    
    // 绘制游戏状态文字
    g.setColor(Color.GREEN);
    if (ballSpeedY == 0) {
        g.drawString("GAME OVER", 190, 200);
    }
}

public static void main(String[] args) {
    // 启动游戏
    SwingUtilities.invokeLater(() -> {
        MiniBallGame game = new MiniBallGame();
        game.setVisible(true);
    });
}

}

精彩评论(0)

0 0 举报