-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMatrix.py
More file actions
83 lines (69 loc) · 4.1 KB
/
Copy pathMatrix.py
File metadata and controls
83 lines (69 loc) · 4.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import random
import os
import time
import shutil
# --- КОНСТАНТИ ---
# Набір символів, що імітує код з "Матриці"
LATIN_AND_NUMS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
HALF_WIDTH_KATAKANA = "ハミヒーウシナモニサワツオリアホテマケメエカキムユラセネスタヌヘヲイクコソチトノフヤヨルレロン"
KATAKANA = "アァカサタナハマヤャラワガザダバパイィキシチニヒミリヰギジヂビピウゥクスツヌフムユュルグズヅブプエェケセテネヘメメレヱゲゼデベペオォコソトノホモヨョロヲゴゾドボポヴッン"
CHARS = LATIN_AND_NUMS + KATAKANA + HALF_WIDTH_KATAKANA
# ANSI коди кольорів
COLOR_BRIGHT_WHITE = "\033[97m"
COLOR_GREEN = "\033[32m"
COLOR_DARK_GREEN = "\033[90m" # Яскраво-чорний, виглядає як темний
COLOR_RESET = "\033[0m"
def matrix_effect():
# # Отримуємо розмір терміналу (автоматично)
# columns, rows = shutil.get_terminal_size()
# Встановлюємо фіксований розмір (наприклад, 120 стовпців, 40 рядків)
columns, rows = 120, 40
# Для кожного стовпця відстежуємо позицію "краплі" та її довжину
# -1 означає, що крапля неактивна
drops = [{'y': -1, 'len': 0} for _ in range(columns)]
# Очищуємо термінал перед початком
os.system('cls' if os.name == 'nt' else 'clear')
# Сховати курсор
print("\033[?25l", end="")
# Створюємо початковий порожній екран
screen = [[' ' for _ in range(columns)] for _ in range(rows)]
try:
while True:
# 1. Згасання існуючих символів
for y in range(rows):
for x in range(columns):
if screen[y][x] != ' ':
# Змінюємо колір або робимо пробілом для ефекту згасання
if screen[y][x].startswith(COLOR_BRIGHT_WHITE):
char = screen[y][x][-len(COLOR_RESET)-1]
screen[y][x] = f"{COLOR_GREEN}{char}{COLOR_RESET}"
elif screen[y][x].startswith(COLOR_GREEN):
char = screen[y][x][-len(COLOR_RESET)-1]
screen[y][x] = f"{COLOR_DARK_GREEN}{char}{COLOR_RESET}"
else:
screen[y][x] = ' '
# 2. Рух та створення нових крапель
for x in range(columns):
if drops[x]['y'] == -1: # Якщо крапля неактивна
if random.random() > 0.975: # Створюємо нову з певною ймовірністю
drops[x]['y'] = 0
drops[x]['len'] = random.randint(5, rows - 5)
else:
y = drops[x]['y']
if y < rows:
screen[y][x] = f"{COLOR_BRIGHT_WHITE}{random.choice(CHARS)}{COLOR_RESET}"
drops[x]['y'] += 1
# Якщо крапля пройшла свою довжину, робимо її неактивною
if drops[x]['y'] >= drops[x]['len']:
drops[x] = {'y': -1, 'len': 0}
# 3. Виводимо кадр на екран
output = "\033[H" + "\n".join("".join(row) for row in screen)
print(output, end="")
time.sleep(0.3)
except KeyboardInterrupt:
# Скидання налаштувань терміналу при виході
os.system('cls' if os.name == 'nt' else 'clear') # Очищуємо термінал
print(f"\033[?25h{COLOR_RESET}", end="") # Повертаємо курсор і скидаємо колір
print("\nПрограму зупинено.")
if __name__ == "__main__":
matrix_effect()