目录
方法一:控制台输出跳动爱心
思路
在控制台输出跳动的爱心,核心思路是通过不断地输出不同大小的爱心图案,形成跳动的视觉效果。可以先定义爱心的字符图案,然后在一个循环中交替输出不同大小的爱心,并且在每次输出后使用 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();
}
}
}
代码解释
- 定义爱心图案:使用字符串数组
bigHeart
和smallHeart
分别存储大爱心和小爱心的图案。 - 循环输出:在
while (true)
循环中,交替输出大爱心和小爱心。 - 暂停和清屏:使用
Thread.sleep(500)
方法暂停 500 毫秒,以控制跳动的速度。使用换行模拟清屏效果。 - 异常处理:捕获
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);
}
});
}
}
代码解释
- 窗口设置:创建一个
JFrame
窗口,设置窗口的标题、大小、关闭操作等。 - 定时器:使用
javax.swing.Timer
类创建一个定时器,每 100 毫秒触发一次actionPerformed
方法。在该方法中,根据isGrowing
标志改变爱心的缩放比例scale
,并调用repaint()
方法重绘窗口。 - 绘制爱心:在
paint
方法中,使用Graphics2D
对象绘制爱心。通过数学公式计算爱心上的点的坐标,并使用fillPolygon
方法填充爱心。 - 线程安全:使用
SwingUtilities.invokeLater()
方法确保窗口的创建和显示在事件调度线程中进行,保证线程安全。
这两种方法都可以实现跳动的爱心效果,你可以根据自己的需求选择合适的方法。