python写一段代码打印一个爱心动画出来

119 阅读2分钟

这个程序创建了一个会动的粉红色爱心,具有以下特点:

  1. 使用数学参数方程绘制标准爱心形状
  2. 爱心会在窗口内左右移动并带有重力效果
  3. 碰到窗口边缘会反弹,增加动画的真实感
  4. 爱心颜色设置为粉红色 (#FF69B4)

你可以通过修改代码中的参数来调整效果:

  • 改变size值调整爱心大小

  • 修改dx值改变水平移动速度

  • 调整gravitybounce参数改变物理效果

  • 更改color参数可以设置不同的粉红色色调

运行程序后,会看到一个在窗口内自然移动、碰到边缘会反弹的粉红色爱心。

import tkinter as tk
import math

class AnimatedHeart:
    def __init__(self, root):
        self.root = root
        self.root.title("跳动的爱心")
        self.root.geometry("600x500")
        self.root.config(bg="white")
        
        # 创建画布
        self.canvas = tk.Canvas(self.root, width=600, height=500, bg="white", highlightthickness=0)
        self.canvas.pack()
        
        # 爱心初始位置和移动参数
        self.x = 100
        self.y = 250
        self.size = 30
        self.dx = 2  # x方向移动速度
        self.dy = 0  # y方向初始移动速度
        self.gravity = 0.1  # 重力效果
        self.bounce = -0.7  # 反弹系数
        
        # 开始动画
        self.animate()
    
    def draw_heart(self, x, y, size, color="#FF69B4"):
        """绘制爱心形状"""
        # 清除之前的爱心
        self.canvas.delete("heart")
        
        # 爱心的参数方程
        points = []
        for t in range(0, 360, 5):
            angle = math.radians(t)
            # 爱心参数方程
            x_point = 16 * math.sin(angle)**3
            y_point = 13 * math.cos(angle) - 5 * math.cos(2*angle) - 2 * math.cos(3*angle) - math.cos(4*angle)
            
            # 缩放并移动爱心
            points.append(x + x_point * size / 10)
            points.append(y - y_point * size / 10)  # 减号是因为y轴向下为正
        
        # 绘制爱心并填充粉红色
        self.canvas.create_polygon(points, outline=color, fill=color, tags="heart")
    
    def animate(self):
        """动画循环"""
        # 更新位置
        self.x += self.dx
        self.y += self.dy
        self.dy += self.gravity  # 应用重力
        
        # 边界检测 - 左右边界反弹
        if self.x + self.size * 1.5 > 600 or self.x - self.size * 1.5 < 0:
            self.dx = -self.dx
        
        # 边界检测 - 下边界反弹
        if self.y + self.size * 1.5 > 500:
            self.y = 500 - self.size * 1.5
            self.dy = self.dy * self.bounce
        
        # 绘制爱心
        self.draw_heart(self.x, self.y, self.size)
        
        # 循环动画
        self.root.after(20, self.animate)

if __name__ == "__main__":
    root = tk.Tk()
    app = AnimatedHeart(root)
    root.mainloop()