Animazione con effetto Matrix in Python

import pygame
import random

# Set up some constants
WIDTH, HEIGHT = 1080, 1920
FONT_SIZE = 15
FONT = 'freesansbold.ttf'
COLORS = [(0, j, 0) for j in range(50, 255, 5)]
CHARACTERS = '0123456789abcdef'
UPDATE_INTERVAL = 3
FPS = 30

# Initialize Pygame
pygame.init()

# Create a Clock object
clock = pygame.time.Clock()

# Render all possible characters
font = pygame.font.Font(FONT, FONT_SIZE)
characters = {char: font.render(char, True, color) for char in CHARACTERS for color in COLORS}

class CodeRain:
    def __init__(self, x, speed):
        self.x = x
        self.speed = speed
        self.generate_text()
        self.update_counter = 0
        
    def generate_text(self):
        self.text = [random.choice(list(characters.keys())) for _ in range(HEIGHT // FONT_SIZE)]

    def draw(self, screen):
        y = 0
        for char in self.text:
            screen.blit(characters[char], (self.x, y))
            y += FONT_SIZE
    
    def update(self):
        self.update_counter += 1
        if self.update_counter % self.speed == 0:
            self.text = self.text[1:] + [random.choice(list(characters.keys()))]

# Set up our display
screen = pygame.display.set_mode((WIDTH, HEIGHT))

# Create our code rain
rains = [CodeRain(x, random.randint(1, UPDATE_INTERVAL)) for x in range(0, WIDTH, FONT_SIZE)]

# Game loop
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    screen.fill((0, 0, 0))
    for rain in rains:
        rain.draw(screen)
        rain.update()
    pygame.display.flip()

    # Limit the framerate
    clock.tick(FPS)

pygame.quit()