两种方式实现《The Matrix》中炫酷的代码雨

文章目录

一、使用HTML编辑代码雨

1.效果图:

2.完整代码:

二、用Python实现代码雨

1.效果图:

2.分步介绍:

1)主要用到pygame模块,需要提前安装好

2)定义窗口的宽度、高度和字体大小:

3)初始化Pygame模块并创建窗口:

4)定义字体类型和大小:

5)创建背景表面并填充半透明黑色背景:

6)设置窗口背景颜色为黑色:

7)定义字母列表:

8)创建字母表面:

9)计算出可以容纳多少列字母:

10)定义一个列表来存储每列字母的下落距离:

11)进入主循环,处理事件和绘制字母:

三.完整代码:

四、结语:记得点赞关注+收藏哦!

一、使用HTML编辑代码雨

代码比较简单,主要用到一个下雨的函数,可以自己新建一个txt的文本,复制完整代码保存后,更改后缀名为html,打开网址就能看到效果,可以让浏览器全屏,非常震撼哦!赶紧试试吧!

1.效果图:

2.完整代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Code</title>
    <style>
        body{
            margin: 0;
            overflow: hidden;
        }
    </style>
</head>

<body>
<canvas id="myCanvas"></canvas>
<script>
    const width = document.getElementById("myCanvas").width = screen.availWidth;
    const height = document.getElementById("myCanvas").height = screen.availHeight;
    const ctx = document.getElementById("myCanvas").getContext("2d");
    const arr = Array(Math.ceil(width / 10)).fill(0);
    const str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".split("");

function rain() {
    ctx.fillStyle = "rgba(0,0,0,0.05)";
    ctx.fillRect(0, 0, width, height);
    ctx.fillStyle = "#0f0";
    arr.forEach(function (value, index) {
        ctx.fillText(str[Math.floor(Math.random() * str.length)], index * 10, value + 10);
        arr[index] = value >= height || value > 8888 * Math.random() ? 0 : value + 10;
    });
}

setInterval(rain, 30);
</script>
</body>
</html>

二、用Python实现代码雨

1.效果图:

2.分步介绍:

1)主要用到pygame模块,需要提前安装好

import random
import pygame

2)定义窗口的宽度、高度和字体大小:

PANEL_width = 1800
PANEL_hight = 800
FONT_PX = 15

3)初始化Pygame模块并创建窗口:

# 初始化pygame模块
pygame.init()
# 创建窗口并设置大小
winSur = pygame.display.set_mode((PANEL_width, PANEL_hight))

4)定义字体类型和大小:

请注意,这里使用的字体名称是"123.ttf",你需要将其替换为你自己的字体文件路径或字体名称。

font = pygame.font.SysFont("123.ttf", 25)

5)创建背景表面并填充半透明黑色背景:

# 创建背景表面
bg_suface = pygame.Surface((PANEL_width, PANEL_hight), flags=pygame.SRCALPHA)
pygame.Surface.convert(bg_suface)
bg_suface.fill(pygame.Color(0, 0, 0, 28))   # 设置半透明黑色背景

6)设置窗口背景颜色为黑色:

winSur.fill((0, 0, 0))   # 设置窗口背景颜色为黑色

7)定义字母列表:

letter = ['y', 'a', 'n', 'y', 'i', 'n', 'g', 'j', 'i', 'e', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'z', 'x', 'c',
          'v', 'b', 'n', 'm']

8)创建字母表面:

texts = [
    font.render(str(letter[i]), True, (0, 255, 0)) for i in range(26)
]

9)计算出可以容纳多少列字母:

# 计算出可以容纳多少列字母
column = int(PANEL_width / FONT_PX)

10)定义一个列表来存储每列字母的下落距离:

# 定义一个列表来存储每列字母的下落距离
drops = [0 for i in range(column)]

11)进入主循环,处理事件和绘制字母:

在主循环中,代码首先处理窗口关闭事件和按键事件。然后,通过延时控制字母下落的速度,并将背景表面绘制到窗口上。接下来,遍历每一列字母,随机选择一个字母表面并将其绘制到窗口上,同时更新该列字母的下落距离。如果下落距离超过窗口高度或者随机数大于0.95,则将下落距离重置为0,实现字母连续下落的效果。最后,刷新窗口显示内容。

while True:
    # 从事件队列中获取事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:   # 如果事件类型是退出则退出程序
            exit()
        elif event.type == pygame.KEYDOWN:   # 如果事件类型是按键按下
            chang = pygame.key.get_pressed()
            if (chang[32]):   # 如果按下的是空格键则退出程序
                exit()
    pygame.time.delay(30)   # 延时,控制下落速度
    winSur.blit(bg_suface, (0, 0))   # 绘制背景表面
    # 遍历每一列字母
    for i in range(len(drops)):
        text = random.choice(texts)   # 随机选择一个字母表面
        winSur.blit(text, (i * FONT_PX, drops[i] * FONT_PX))   # 绘制字母表面到窗口上
        drops[i] += 1   # 将当前列的下落距离加1
        # 如果当前列的下落距离超过了窗口高度或者随机数大于0.95,则将下落距离重置为0,达到字母连续下落的效果
        if drops[i] * 10 > PANEL_hight or random.random() > 0.95:
            drops[i] = 0
    pygame.display.flip()   # 刷新窗口显示内容

三.完整代码:

import random
import pygame
# 定义面板宽度和高度,字体大小
PANEL_width = 1800
PANEL_hight = 800
FONT_PX = 15
# 初始化pygame模块
pygame.init()
# 创建窗口并设置大小
winSur = pygame.display.set_mode((PANEL_width, PANEL_hight))
# 定义字体类型和大小
font = pygame.font.SysFont("123.ttf", 25)
# 创建背景表面
bg_suface = pygame.Surface((PANEL_width, PANEL_hight), flags=pygame.SRCALPHA)
pygame.Surface.convert(bg_suface)
bg_suface.fill(pygame.Color(0, 0, 0, 28))   # 设置半透明黑色背景
winSur.fill((0, 0, 0))   # 设置窗口背景颜色为黑色

# 定义字母列表
letter = ['y', 'a', 'n', 'y', 'i', 'n', 'g', 'j', 'i', 'e', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'z', 'x', 'c',
          'v', 'b', 'n', 'm']
# 创建字母表面
texts = [
    font.render(str(letter[i]), True, (0, 255, 0)) for i in range(26)
]
# 计算出可以容纳多少列字母
column = int(PANEL_width / FONT_PX)
# 定义一个列表来存储每列字母的下落距离
drops = [0 for i in range(column)]
while True:
    # 从事件队列中获取事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:   # 如果事件类型是退出则退出程序
            exit()
        elif event.type == pygame.KEYDOWN:   # 如果事件类型是按键按下
            chang = pygame.key.get_pressed()
            if (chang[32]):   # 如果按下的是空格键则退出程序
                exit()
    pygame.time.delay(30)   # 延时,控制下落速度
    winSur.blit(bg_suface, (0, 0))   # 绘制背景表面
    # 遍历每一列字母
    for i in range(len(drops)):
        text = random.choice(texts)   # 随机选择一个字母表面
        winSur.blit(text, (i * FONT_PX, drops[i] * FONT_PX))   # 绘制字母表面到窗口上
        drops[i] += 1   # 将当前列的下落距离加1
        # 如果当前列的下落距离超过了窗口高度或者随机数大于0.95,则将下落距离重置为0,达到字母连续下落的效果
        if drops[i] * 10 > PANEL_hight or random.random() > 0.95:
            drops[i] = 0
    pygame.display.flip()   # 刷新窗口显示内容

四、结语:记得点赞关注+收藏哦!

代码全部免费共享!大家一起学习交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

穿梭的编织者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值