0
点赞
收藏
分享

微信扫一扫

MiniBallGame GUI小游戏

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 条评论