Hiệu ứng "Ma trận rơi" (như trong phim The Matrix) có thể mô phỏng bằng C++ sử dụng ký tự ngẫu nhiên, mảng boolean điều khiển hiển thị và độ trễ giữa các khung hình.
Ý tưởng cài đặt
- Định nghĩa chiều rộng màn hình (số cột)
- Sử dụng mảng boolean để quyết định cột nào hiển thị ký tự tại mỗi khung hình
- Lật ngẫu nhiên một số giá trị boolean mỗi khung hình để tạo hiệu ứng "rơi"
- Thêm độ trễ giữa các khung hình
Mã nguồn hoàn chỉnh
#include <iostream>
#include <string>
#include <thread>
#include <cstdlib>
#include <ctime>
#include <chrono>
const int WIDTH = 70; // Chiều rộng cửa sổ
const int FLIPS_PER_LINE = 5; // Số lần lật boolean mỗi dòng
const int SLEEP_MS = 50; // Độ trễ giữa các dòng (ms)
using namespace std;
int main() {
int i = 0, x = 0;
srand(time(nullptr)); // Khởi tạo seed cho rand()
bool alternate[WIDTH] = {false}; // Mảng điều khiển hiển thị
// Tập ký tự dùng để hiển thị
const string chars =
"1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz!@#$%^&*()_+{}|?><`~";
const int charCount = chars.size();
while (true) {
// In một dòng
for (i = 0; i < WIDTH; i += 2) {
if (alternate[i]) {
cout << chars[rand() % charCount] << " ";
} else {
cout << " ";
}
}
// Lật ngẫu nhiên FLIPS_PER_LINE vị trí trong mảng boolean
for (i = 0; i != FLIPS_PER_LINE; ++i) {
x = rand() % WIDTH;
alternate[x] = !alternate[x];
}
cout << endl;
this_thread::sleep_for(chrono::milliseconds(SLEEP_MS));
}
}
Giải thích các thành phần chính
alternate[]: Mảng boolean,true= in ký tự,false= in khoảng trắngFLIPS_PER_LINE: Số cột thay đổi trạng thái mỗi khung hình (tạo cảm giác rơi)sleep_for: Tạo độ trễ để mắt kịp quan sát hiệu ứng- Vòng lặp
while(true): Chạy vô hạn cho đến khi người dùng dừng chương trình
Kết quả
Chương trình hiển thị luồng ký tự ngẫu nhiên rơi xuống màn hình liên tục, tạo hiệu ứng trực quan giống "Ma trận".
Mở rộng gợi ý
- Thêm màu sắc với ANSI escape codes (Linux/macOS) hoặc Windows API
- Thay đổi mật độ, tốc độ, tập ký tự
- Thêm ký tự đặc biệt tiếng Nhật (Katakana) để giống phim hơn