仿写愤怒的小鸟——》逃跑的粽子

本文介绍了一个基于愤怒的小鸟修改的游戏,游戏中主角换成了粽子,玩家需要操控粽子通过障碍物,包括地面和移动的筷子。游戏包含开始、运行和结束三种状态,同时有碰撞检测和分数计算功能。游戏画面由背景、地面、柱子和粽子组成,通过不断移动和重绘实现动画效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为本游戏实在愤怒的小鸟上进行的修改
大体上的类名延续着小鸟
粽子类(Bird.java)

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
/**
 * 粽子
 */
public class Bird {
    //图片
    BufferedImage image;
    //位置
    int x,y;
    //宽高
    int width,height;
    //大小(用于碰撞检测)
    int size;
    //重力加速度
    double g;
    //位移的间隔时间
    double t;
    //最初上抛速度
    double v0;
    //当前上抛速度
    double speed;
    //经过时间t之后的位移
    double s;
    //粽子的倾角(弧度)
    double alpha;
    //一组图片,记录粽子的动画帧
    BufferedImage[] images;
    //动画帧数组的下标
    int index;
    //初始化粽子
    public Bird() throws Exception{
        //初始化基本参数
        image =ImageIO.read(getClass().getResource("/0.png"));
        width=image.getWidth();
        height=image.getHeight();
        x=132;
        y=280;
        size=40;
        //初始化位移参数
        g=4;
        v0=20;
        t=0.25;
        speed=v0;
        s=0;
        alpha=0;
        //初始化动画帧参数
        images=new BufferedImage[8];
        for(int i=0;i<8;i++) {
            images[i]=ImageIO.read(getClass().getResource("/"+i+".png"));

        }
        index=0;
    }
    //飞行动作
    public void fly() {
        index++;
        image=images[(index/12)%8];
    }
    //移动一步
    public void step() {
        double v0=speed;
        //计算上抛运动位移
        s=v0*t+g*t*t/2;
        //计算鸟的坐标位置
        y=y-(int)s;
        //计算下次移动速度
        double v=v0-g*t;
        speed=v;
        //计算倾角(反正切函数)
        alpha=Math.atan(s/8);
    }
    //向上飞行
    public void flappy() {
        //重置速度
        speed=v0;
    }
    //检测粽子是否碰撞到筷子上
    public boolean hit(Ground ground) {
        boolean hit=y+size/2>ground.y;
        if(hit) {
            y=ground.y-size/2;
            alpha=-3.14159265358979323/2;
        }
        return hit;
    }
    //检测粽子是否撞到筷子上
    public boolean hit(Column column) {
        //先检测是否在柱子的范围内
        if(x>column.x-column.width/2-size/2
                &&x<column.x+column.width/2+size/2) {
            //再检测是否在柱子的缝隙中
            if(y>column.y-column.gap/2-size/2
                    &&y<column.y+column.gap/2-size/2) {
                return false;
            }
            return true;
        }
        return false;
    }

}


制作一个会动的背景(Ground.class)

import java.awt.image.BufferedImage;

import javax.imageio.ImageIO;

/**
 *地面
 */
public class Ground {
    //图片
    BufferedImage image;
    //位置
    int x,y;
    //宽高
    int width,height;
    //初始化地面
    public Ground() throws Exception{
        image=ImageIO.read(getClass().getResource("/ground.png"));
        width=image.getWidth();
        height=image.getHeight();
        x=0;
        y=500;
    }
    //向左移动一步
    public void step() {
        x--;
        if(x==-109) {
            x=0;
        }
    }
}


游戏里面的对应参数(BirdGame.class)

```java

/**
 * 游戏界面
 */
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.net.URL;

public class BirdGame extends JPanel {
    // 背景图片
    BufferedImage background;
    // 开始图片
    BufferedImage startImage;
    // 结束图片
    BufferedImage gameOverImage;
    // 地面
    Ground ground;
    // 柱子
    Column column1, column2;
    // 小鸟
    Bird bird;
    // 游戏分数
    int score;
    // 游戏状态
    int state;
    // 状态常量
    public static final int START = 0;// 开始
    public static final int RUNNING = 1;// 运行
    public static final int GAME_OVER = 2;// 结束

    /**
     * 初始化游戏
     */
    public BirdGame() throws Exception {
        // 初始化背景图片
        URL img = getClass().getResource("/bg.png");
        System.out.println("是否为空:"+img);
        background = ImageIO.read(getClass().getResource("/bg.png"));
        // 初始化开始、结束图片
        startImage = ImageIO.read(getClass().getResource("/start.png"));
        gameOverImage = ImageIO.read(getClass().getResource("/gameover.png"));
        // 初始化地面、柱子、小鸟
        ground = new Ground();
        column1 = new Column(1);
        column2 = new Column(2);
        bird = new Bird();

        // 初始化分数
        score = 0;

        // 初始化状态
        state = START;

    }

    /**
     * 绘制界面
     */
    public void paint(Graphics g) {
        // 绘制背景
        g.drawImage(background, 0, 0, null);
        // 绘制地面
        g.drawImage(ground.image, ground.x, ground.y, null);

        // 绘制柱子
        g.drawImage(column1.image, column1.x - column1.width / 2, column1.y - column1.height / 2, null);
        g.drawImage(column2.image, column2.x - column2.width / 2, column2.y - column2.height / 2, null);

        // 绘制小鸟(旋转坐标系)
        Graphics2D g2 = (Graphics2D) g;
        g2.rotate(-bird.alpha, bird.x, bird.y);
        g.drawImage(bird.image, bird.x - bird.width / 2, bird.y - bird.height / 2, null);
        g2.rotate(bird.alpha, bird.x, bird.y);

        // 绘制分数
        Font f = new Font(Font.SANS_SERIF, Font.BOLD, 40);
        g.setFont(f);
        g.drawString("" + score, 40, 60);
        g.setColor(Color.WHITE);
        g.drawString("" + score, 40 - 3, 60 - 3);

        // 绘制开始与结束界面
        switch (state) {
            case START:
                g.drawImage(startImage, 0, 0, null);
                break;
            case GAME_OVER:
                g.drawImage(gameOverImage, 0, 0, null);
                break;
        }
    }

    // 开始游戏
    public void action() throws Exception {
        MouseListener l = new MouseAdapter() {
            // 鼠标按下事件
            public void mousePressed(MouseEvent e) {
                try {
                    switch (state) {
                        case START:
                            // 在开始状态,按下鼠标则转为运行状态。
                            state = RUNNING;
                            break;
                        case RUNNING:
                            // 在运行状态,按下鼠标则小鸟向上飞行。
                            bird.flappy();
                            break;
                        case GAME_OVER:
                            // 在结束状态,按下鼠标则重置数据,再次转为开始态。
                            column1 = new Column(1);
                            column2 = new Column(2);
                            bird = new Bird();
                            score = 0;
                            state = START;
                            break;
                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        };

        // 将***添加到当前的面板上
        addMouseListener(l);
        // 不断的移动与重绘
        while (true) {
            switch (state) {
                case START:
                    // 小鸟做出飞行动作
                    bird.fly();
                    // 地面向左移动一步
                    ground.step();
                    break;
                case RUNNING:
                    // 地面向左移动一步
                    ground.step();
                    // 柱子向左移动一步
                    column1.step();
                    column2.step();
                    // 小鸟做出飞行动作
                    bird.fly();
                    // 小鸟上下移动一步
                    bird.step();
                    // 计算分数
                    if (bird.x == column1.x || bird.x == column2.x) {
                        score++;
                    }
                    // 检测是否发生碰撞
                    if (bird.hit(ground) || bird.hit(column1) || bird.hit(column2)) {
                        state = GAME_OVER;
                    }
                    break;
            }
            // 重新绘制界面
            repaint();
            // 休眠 1000/60 毫秒
            Thread.sleep(1000 / 60);
        }

    }


}


游戏里面筷子的移动(Column.class)

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.util.Random;
public class Column {
    //图片
    BufferedImage image;
    //位置
    int x,y;
    //宽高
    int width,height;
    //筷子之间的缝隙
    int gap;
    //筷子之间的距离
    int distance;
    //随机数工具
    Random random=new Random();
    /**
     * 初始化第N个筷子
     */
    public Column(int n) throws Exception{
        image=ImageIO.read(getClass().getResource("/column.png"));
        width=image.getWidth();
        height=image.getHeight();
        gap=144;
        distance=245;
        x=550+(n-1)*distance;
        y=random.nextInt(218)+123;
    }
    //向左移动一步
    public void step() {
        x--;
        if(x==-width/2) {
            y=distance*2-width/2;
            y=random.nextInt(218)+132;
            x=550;
        }
    }
}


游戏开始(main.class)

import javax.swing.*;

public class Main {
    /**
     * 启动方法
     */
    public static void main(String[] args) throws Exception {
        JFrame frame = new JFrame();
        BirdGame game = new BirdGame();
        frame.add(game);
        frame.setSize(440, 670);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        game.action();

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值