Java实现跳动的爱心

目录

方法一:控制台输出跳动爱心

思路

代码示例

代码解释

方法二:使用 Java Swing 库创建窗口显示跳动爱心

思路

代码示例

代码解释


方法一:控制台输出跳动爱心

思路

在控制台输出跳动的爱心,核心思路是通过不断地输出不同大小的爱心图案,形成跳动的视觉效果。可以先定义爱心的字符图案,然后在一个循环中交替输出不同大小的爱心,并且在每次输出后使用 Thread.sleep() 方法暂停一段时间,从而实现跳动的效果。

代码示例
public class ConsoleBeatingHeart {
    public static void main(String[] args) {
        // 定义大爱心图案
        String[] bigHeart = {
                "  **      **  ",
                " ****    **** ",
                "******  ******",
                " ************ ",
                "  **********  ",
                "   ********   ",
                "    ******    ",
                "     ****     ",
                "      **      "
        };
        // 定义小爱心图案
        String[] smallHeart = {
                "  *    *  ",
                " ***  *** ",
                " ******* ",
                "  *****  ",
                "   ***   ",
                "    *    "
        };

        try {
            while (true) {
                // 输出大爱心
                for (String line : bigHeart) {
                    System.out.println(line);
                }
                // 暂停一段时间
                Thread.sleep(500);
                // 清屏(在不同系统中清屏方式不同,这里简单用换行模拟)
                for (int i = 0; i < 20; i++) {
                    System.out.println();
                }
                // 输出小爱心
                for (String line : smallHeart) {
                    System.out.println(line);
                }
                // 暂停一段时间
                Thread.sleep(500);
                // 清屏
                for (int i = 0; i < 20; i++) {
                    System.out.println();
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
代码解释
  1. 定义爱心图案:使用字符串数组 bigHeart 和 smallHeart 分别存储大爱心和小爱心的图案。
  2. 循环输出:在 while (true) 循环中,交替输出大爱心和小爱心。
  3. 暂停和清屏:使用 Thread.sleep(500) 方法暂停 500 毫秒,以控制跳动的速度。使用换行模拟清屏效果。
  4. 异常处理:捕获 InterruptedException 异常,确保程序在被中断时能正确处理。

方法二:使用 Java Swing 库创建窗口显示跳动爱心

思路

使用 Java Swing 库创建一个窗口,在窗口中绘制爱心图案。通过不断地改变爱心的大小,并重绘窗口,实现跳动的效果。可以使用 javax.swing.Timer 类来定时触发重绘操作。

代码示例
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class BeatingHeart extends JFrame {
    private static final int WIDTH = 400;
    private static final int HEIGHT = 400;
    private double scale = 1.0;
    private boolean isGrowing = true;

    public BeatingHeart() {
        setTitle("Beating Heart");
        setSize(WIDTH, HEIGHT);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        // 创建一个定时器,每 100 毫秒触发一次重绘操作
        Timer timer = new Timer(100, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (isGrowing) {
                    scale += 0.1;
                    if (scale >= 1.5) {
                        isGrowing = false;
                    }
                } else {
                    scale -= 0.1;
                    if (scale <= 1.0) {
                        isGrowing = true;
                    }
                }
                repaint();
            }
        });
        timer.start();
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setColor(Color.RED);

        int centerX = WIDTH / 2;
        int centerY = HEIGHT / 2;
        int size = (int) (50 * scale);

        // 绘制爱心
        int[] xPoints = new int[100];
        int[] yPoints = new int[100];
        for (int i = 0; i < 100; i++) {
            double t = i * 2 * Math.PI / 100;
            double x = 16 * Math.pow(Math.sin(t), 3);
            double y = -(13 * Math.cos(t) - 5 * Math.cos(2 * t) - 2 * Math.cos(3 * t) - Math.cos(4 * t));
            xPoints[i] = (int) (x * size + centerX);
            yPoints[i] = (int) (y * size + centerY);
        }
        g2d.fillPolygon(xPoints, yPoints, 100);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                BeatingHeart heart = new BeatingHeart();
                heart.setVisible(true);
            }
        });
    }
}
代码解释
  1. 窗口设置:创建一个 JFrame 窗口,设置窗口的标题、大小、关闭操作等。
  2. 定时器:使用 javax.swing.Timer 类创建一个定时器,每 100 毫秒触发一次 actionPerformed 方法。在该方法中,根据 isGrowing 标志改变爱心的缩放比例 scale,并调用 repaint() 方法重绘窗口。
  3. 绘制爱心:在 paint 方法中,使用 Graphics2D 对象绘制爱心。通过数学公式计算爱心上的点的坐标,并使用 fillPolygon 方法填充爱心。
  4. 线程安全:使用 SwingUtilities.invokeLater() 方法确保窗口的创建和显示在事件调度线程中进行,保证线程安全。

这两种方法都可以实现跳动的爱心效果,你可以根据自己的需求选择合适的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪九天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值