下面是一个简单的开心超人游戏,玩家控制开心超人躲避怪兽并收集星星。

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. 确保图像资源文件位于正确路径

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐