在Java中做一个弹球游戏
时间: 2024-05-02 14:18:57 浏览: 7
以下是一个简单的弹球游戏的 Java 代码,实现了基本的移动、碰撞检测和反弹功能。你可以根据需要进行修改和扩展,添加更多的游戏元素和功能。
```java
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class BallGame extends JPanel implements ActionListener, KeyListener {
private static final int WIDTH = 600;
private static final int HEIGHT = 400;
private static final int BALL_SIZE = 20;
private static final int PADDLE_WIDTH = 80;
private static final int PADDLE_HEIGHT = 10;
private static final int PADDLE_SPEED = 5;
private static final int TIMER_DELAY = 10;
private static final Color BALL_COLOR = Color.RED;
private static final Color PADDLE_COLOR = Color.BLUE;
private static final Color BACKGROUND_COLOR = Color.WHITE;
private static final int MAX_ANGLE = 150;
private static final int MIN_ANGLE = 30;
private static final int MAX_SPEED = 5;
private static final int MIN_SPEED = 1;
private int ballX, ballY, ballSpeedX, ballSpeedY;
private int paddleX, paddleY;
private boolean leftPressed, rightPressed;
private Timer timer;
public BallGame() {
setPreferredSize(new Dimension(WIDTH, HEIGHT));
setBackground(BACKGROUND_COLOR);
addKeyListener(this);
setFocusable(true);
ballX = WIDTH / 2 - BALL_SIZE / 2;
ballY = HEIGHT / 2 - BALL_SIZE / 2;
ballSpeedX = 1;
ballSpeedY = 1;
paddleX = WIDTH / 2 - PADDLE_WIDTH / 2;
paddleY = HEIGHT - PADDLE_HEIGHT - 10;
timer = new Timer(TIMER_DELAY, this);
timer.start();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(BALL_COLOR);
g.fillOval(ballX, ballY, BALL_SIZE, BALL_SIZE);
g.setColor(PADDLE_COLOR);
g.fillRect(paddleX, paddleY, PADDLE_WIDTH, PADDLE_HEIGHT);
}
public void actionPerformed(ActionEvent e) {
moveBall();
movePaddle();
checkCollisions();
repaint();
}
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
leftPressed = true;
} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
rightPressed = true;
}
}
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
leftPressed = false;
} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
rightPressed = false;
}
}
public void keyTyped(KeyEvent e) {
}
private void moveBall() {
ballX += ballSpeedX;
ballY += ballSpeedY;
if (ballX < 0 || ballX > WIDTH - BALL_SIZE) {
ballSpeedX = -ballSpeedX;
}
if (ballY < 0 || ballY > HEIGHT - BALL_SIZE) {
ballSpeedY = -ballSpeedY;
}
}
private void movePaddle() {
if (leftPressed && paddleX > 0) {
paddleX -= PADDLE_SPEED;
}
if (rightPressed && paddleX < WIDTH - PADDLE_WIDTH) {
paddleX += PADDLE_SPEED;
}
}
private void checkCollisions() {
if (ballY + BALL_SIZE >= paddleY && ballX + BALL_SIZE >= paddleX && ballX <= paddleX + PADDLE_WIDTH) {
ballSpeedY = -ballSpeedY;
int angle = (int) (MAX_ANGLE - (MAX_ANGLE - MIN_ANGLE) * ((double) (ballX + BALL_SIZE / 2 - paddleX) / PADDLE_WIDTH));
ballSpeedX = (int) (ballSpeedY * Math.tan(Math.toRadians(angle)));
if (ballSpeedX > MAX_SPEED) {
ballSpeedX = MAX_SPEED;
} else if (ballSpeedX < -MAX_SPEED) {
ballSpeedX = -MAX_SPEED;
}
if (ballSpeedX > 0 && ballSpeedX < MIN_SPEED) {
ballSpeedX = MIN_SPEED;
} else if (ballSpeedX < 0 && ballSpeedX > -MIN_SPEED) {
ballSpeedX = -MIN_SPEED;
}
}
}
public static void main(String[] args) {
JFrame frame = new JFrame("Ball Game");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(new BallGame());
frame.pack();
frame.setVisible(true);
}
}
```