Java-Swing开心超人小游戏
offScreenGraphics.drawString("使用方向键移动开心超人,躲避怪兽,收集星星", WIDTH / 2 - 180, HEIGHT - 30);offScreenGraphics.drawString("开心超人小游戏", WIDTH / 2 - 120, 40);offScreenGraphics.setFont(new Font("宋体", Font.PLAIN, 16
下面是一个简单的开心超人游戏,玩家控制开心超人躲避怪兽并收集星星。
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Random;
public class HappySupermanGame extends JFrame implements KeyListener, Runnable {
private static final int WIDTH = 800;
private static final int HEIGHT = 600;
private static final int PLAYER_SIZE = 60;
private static final int ENEMY_SIZE = 50;
private static final int STAR_SIZE = 30;
private int playerX = WIDTH / 2;
private int playerY = HEIGHT - 100;
private int score = 0;
private int lives = 3;
private ArrayList<Point> enemies = new ArrayList<>();
private ArrayList<Point> stars = new ArrayList<>();
private ArrayList<Point> clouds = new ArrayList<>();
private boolean leftPressed = false;
private boolean rightPressed = false;
private boolean upPressed = false;
private boolean downPressed = false;
private Image playerImage;
private Image enemyImage;
private Image starImage;
private Image cloudImage;
private Image backgroundImage;
private Random random = new Random();
public HappySupermanGame() {
setTitle("开心超人小游戏");
setSize(WIDTH, HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setLocationRelativeTo(null);
addKeyListener(this);
// 加载图像资源
playerImage = new ImageIcon(getClass().getResource("/player.png")).getImage();
enemyImage = new ImageIcon(getClass().getResource("/enemy.png")).getImage();
starImage = new ImageIcon(getClass().getResource("/star.png")).getImage();
cloudImage = new ImageIcon(getClass().getResource("/cloud.png")).getImage();
backgroundImage = new ImageIcon(getClass().getResource("/background.png")).getImage();
// 初始化游戏元素
initializeGameElements();
// 启动游戏线程
new Thread(this).start();
}
private void initializeGameElements() {
// 创建初始敌人
for (int i = 0; i < 5; i++) {
enemies.add(new Point(random.nextInt(WIDTH - ENEMY_SIZE), random.nextInt(HEIGHT / 2)));
}
// 创建初始星星
for (int i = 0; i < 10; i++) {
stars.add(new Point(random.nextInt(WIDTH - STAR_SIZE), random.nextInt(HEIGHT - 100)));
}
// 创建云朵
for (int i = 0; i < 8; i++) {
clouds.add(new Point(random.nextInt(WIDTH), random.nextInt(HEIGHT)));
}
}
private void movePlayer() {
if (leftPressed && playerX > 0) playerX -= 5;
if (rightPressed && playerX < WIDTH - PLAYER_SIZE) playerX += 5;
if (upPressed && playerY > 0) playerY -= 5;
if (downPressed && playerY < HEIGHT - PLAYER_SIZE) playerY += 5;
}
private void moveEnemies() {
for (int i = 0; i < enemies.size(); i++) {
Point enemy = enemies.get(i);
enemy.y += 2;
// 如果敌人移出屏幕,重新生成
if (enemy.y > HEIGHT) {
enemies.set(i, new Point(random.nextInt(WIDTH - ENEMY_SIZE), 0));
}
}
}
private void checkCollisions() {
Rectangle playerRect = new Rectangle(playerX, playerY, PLAYER_SIZE, PLAYER_SIZE);
// 检查与敌人的碰撞
for (int i = 0; i < enemies.size(); i++) {
Point enemy = enemies.get(i);
Rectangle enemyRect = new Rectangle(enemy.x, enemy.y, ENEMY_SIZE, ENEMY_SIZE);
if (playerRect.intersects(enemyRect)) {
lives--;
enemies.set(i, new Point(random.nextInt(WIDTH - ENEMY_SIZE), 0));
if (lives <= 0) {
gameOver();
}
}
}
// 检查与星星的碰撞
for (int i = 0; i < stars.size(); i++) {
Point star = stars.get(i);
Rectangle starRect = new Rectangle(star.x, star.y, STAR_SIZE, STAR_SIZE);
if (playerRect.intersects(starRect)) {
score += 10;
stars.set(i, new Point(random.nextInt(WIDTH - STAR_SIZE), random.nextInt(HEIGHT - 100)));
}
}
}
private void gameOver() {
JOptionPane.showMessageDialog(this, "游戏结束!最终得分: " + score, "游戏结束", JOptionPane.INFORMATION_MESSAGE);
score = 0;
lives = 3;
playerX = WIDTH / 2;
playerY = HEIGHT - 100;
enemies.clear();
stars.clear();
initializeGameElements();
}
@Override
public void run() {
while (true) {
movePlayer();
moveEnemies();
checkCollisions();
// 偶尔生成新敌人
if (random.nextInt(100) < 2) {
enemies.add(new Point(random.nextInt(WIDTH - ENEMY_SIZE), 0));
}
// 偶尔生成新星星
if (random.nextInt(100) < 1 && stars.size() < 15) {
stars.add(new Point(random.nextInt(WIDTH - STAR_SIZE), random.nextInt(HEIGHT - 100)));
}
repaint();
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void paint(Graphics g) {
// 双缓冲
Image offScreenImage = createImage(getWidth(), getHeight());
Graphics offScreenGraphics = offScreenImage.getGraphics();
// 绘制背景
offScreenGraphics.drawImage(backgroundImage, 0, 0, WIDTH, HEIGHT, this);
// 绘制云朵
for (Point cloud : clouds) {
offScreenGraphics.drawImage(cloudImage, cloud.x, cloud.y, 100, 60, this);
}
// 绘制星星
for (Point star : stars) {
offScreenGraphics.drawImage(starImage, star.x, star.y, STAR_SIZE, STAR_SIZE, this);
}
// 绘制敌人
for (Point enemy : enemies) {
offScreenGraphics.drawImage(enemyImage, enemy.x, enemy.y, ENEMY_SIZE, ENEMY_SIZE, this);
}
// 绘制玩家
offScreenGraphics.drawImage(playerImage, playerX, playerY, PLAYER_SIZE, PLAYER_SIZE, this);
// 绘制分数和生命值
offScreenGraphics.setColor(Color.WHITE);
offScreenGraphics.setFont(new Font("Arial", Font.BOLD, 24));
offScreenGraphics.drawString("分数: " + score, 20, 40);
offScreenGraphics.drawString("生命: " + lives, WIDTH - 120, 40);
// 绘制游戏标题
offScreenGraphics.setColor(new Color(255, 215, 0));
offScreenGraphics.setFont(new Font("楷体", Font.BOLD, 36));
offScreenGraphics.drawString("开心超人小游戏", WIDTH / 2 - 120, 40);
// 绘制操作提示
offScreenGraphics.setColor(Color.YELLOW);
offScreenGraphics.setFont(new Font("宋体", Font.PLAIN, 16));
offScreenGraphics.drawString("使用方向键移动开心超人,躲避怪兽,收集星星", WIDTH / 2 - 180, HEIGHT - 30);
// 将缓冲图像绘制到屏幕上
g.drawImage(offScreenImage, 0, 0, this);
}
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT:
leftPressed = true;
break;
case KeyEvent.VK_RIGHT:
rightPressed = true;
break;
case KeyEvent.VK_UP:
upPressed = true;
break;
case KeyEvent.VK_DOWN:
downPressed = true;
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT:
leftPressed = false;
break;
case KeyEvent.VK_RIGHT:
rightPressed = false;
break;
case KeyEvent.VK_UP:
upPressed = false;
break;
case KeyEvent.VK_DOWN:
downPressed = false;
break;
}
}
@Override
public void keyTyped(KeyEvent e) {}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new HappySupermanGame().setVisible(true);
});
}
}
运行要求
1. 需要Java运行环境(JRE)8或更高版本
2. 确保图像资源文件位于正确路径
更多推荐



所有评论(0)