영화 <매트릭스>를 비롯한 여러 영화에서 초록색 문자가 빗줄기처럼 화면을 타고 떨어지는 장면을 본 적이 있을 것입니다. 이번 글에서는 C++ 콘솔 프로그램으로 그와 같은 효과를 직접 구현하는 방법을 소개합니다.
이 문제를 해결하려면 다음 세 가지 요소를 고려해야 합니다.
- 화면 너비 정의: 문자가 흐르는 매트릭스 창의 가로 폭을 먼저 정합니다.
- 불규칙한 문자 배치: 인접한 두 문자 사이의 간격이 항상 동일하지 않도록 하여 자연스러운 느낌을 연출합니다.
- 출력 지연 추가: 한 줄을 출력할 때마다 일정 시간의 딜레이를 두어 문자가 실제로 떨어지는 듯한 시각적 효과를 만듭니다.
예제 코드
#include <iostream>
#include <string>
#include <thread>
#include <cstdlib>
#include <ctime>
#include <chrono>
const int wd = 70; // 매트릭스 창의 너비 설정
const int flipsPerLine = 5; // boolean 배열 'alternate'를 뒤집는 횟수
const int sleepTime = 50; // 두 줄 출력 사이의 지연 시간 (밀리초)
using namespace std;
int main() {
int i = 0, x = 0;
srand(time(NULL)); // 실행 시점에 난수 초기화
bool alternate[wd] = {0}; // 해당 반복에서 문자를 출력할지 결정하는 배열
// 출력할 문자 집합
const string ch =
"1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()_+{}|?><`~";
const int l = ch.size();
while (true) {
for (i = 0; i < wd; i += 2) {
if (alternate[i]) // alternate 값이 1이면 문자 출력
cout << ch[rand() % l] << " ";
else // 아니면 공백 출력
cout << " ";
}
for (i = 0; i != flipsPerLine; ++i) {
// boolean 값을 무작위로 뒤집음
x = rand() % wd;
alternate[x] = !alternate[x];
}
cout << endl;
// 더 좋은 시각 효과를 위해 잠시 대기
this_thread::sleep_for(chrono::milliseconds(sleepTime));
}
}
코드 설명
이 프로그램의 핵심은 크게 세 부분으로 나눌 수 있습니다.
1. 난수 기반 문자 선택
숫자, 알파벳 대소문자, 특수문자로 구성된 문자열 ch에서 rand() % l을 사용해 무작위로 문자 하나를 골라 출력합니다. 덕분에 매번 다른 문자 조합이 만들어집니다.
2. alternate 배열로 출력 위치 제어
alternate 배열은 각 열에 문자를 출력할지 공백을 출력할지 결정합니다. 매 반복마다 무작위 위치의 값 5개(flipsPerLine)를 뒤집기 때문에, 문자가 출력되는 열이 계속 바뀌며 불규칙하고 역동적인 패턴이 형성됩니다.
3. sleep_for로 떨어지는 효과 연출
this_thread::sleep_for() 함수를 이용해 한 줄을 출력한 뒤 50밀리초 동안 실행을 멈춥니다. 이 지연 시간을 조절하면 문자가 떨어지는 속도를 자유롭게 변경할 수 있습니다. 값이 작을수록 빠르게, 클수록 느리게 흐릅니다.
참고: 이 프로그램은 무한 루프(while(true))로 동작하므로 실행을 중단하려면 Ctrl + C를 누르면 됩니다.
실행 결과

코드를 컴파일하여 실행하면 위 이미지처럼 무작위 문자들이 화면을 따라 끊임없이 흘러내리는 매트릭스 효과를 확인할 수 있습니다. 너비(wd), 뒤집는 횟수(flipsPerLine), 지연 시간(sleepTime) 상수를 조정해 나만의 스타일로 응용해 보세요.