1999 年上映的電影駭客任務(Matrix)於明年要推出第四集了。這部電影不論在哲學觀以及拍攝效果,在當年的影史上都是一個突破。
其中這部電影中最著名的電腦執行畫面深植在多少技術愛好者的心中:
本篇文章記錄我如何用 C++ 實作這種電影 matrix 文字下雨(raining)效果,這種文字效果有很多種作法,可以做得很精緻,我採取比較簡單的一種實現方法:
首先程式的邏輯從如何刷新 M x N 的文字 random 陣列開始。
假設有一個 M x N 的 random 文字陣列,我們可以從第 0 個 row 開始刷新每個字元。
假設現在正在處理第 0 個 row,我們走訪每個字元,然後隨機挑選某幾個文字更新,更新的方法有將當前字元用空白字元替換,或用任意非空白字元替換兩種情況。
當第 0 個 row 更新完之後,就刷新螢幕,然後繼續更新下一條 row,也就是更新第 1 個 row。
重點來了。
刷新螢幕的方法,順序為:
原始碼如下:
其中這部電影中最著名的電腦執行畫面深植在多少技術愛好者的心中:
本篇文章記錄我如何用 C++ 實作這種電影 matrix 文字下雨(raining)效果,這種文字效果有很多種作法,可以做得很精緻,我採取比較簡單的一種實現方法:
首先程式的邏輯從如何刷新 M x N 的文字 random 陣列開始。
假設有一個 M x N 的 random 文字陣列,我們可以從第 0 個 row 開始刷新每個字元。
假設現在正在處理第 0 個 row,我們走訪每個字元,然後隨機挑選某幾個文字更新,更新的方法有將當前字元用空白字元替換,或用任意非空白字元替換兩種情況。
當第 0 個 row 更新完之後,就刷新螢幕,然後繼續更新下一條 row,也就是更新第 1 個 row。
重點來了。
刷新螢幕的方法,順序為:
- 先清空螢幕
- 先顯示最新刷新的 row。
- 依序顯示之前刷新的 row。
原始碼如下:
// C++ program for implementation of falling matrix effect #include<iostream> #include<string> #include<thread> #include<cstdlib> #include<ctime> #include<chrono> const int cols = 60; const int rows = 30; const int switch_num = 5; const int delay = 90; char screen[rows][cols]; using namespace std; int main(int argc, char** argv) { srand(time(NULL)); bool status[cols] = {0}; // screen initialization for(int i=0; i<rows; i++) { for(int j=0; j<cols; j++) { screen[i][j] = (rand() % 95) + 32; // 32 <= ascii_code <= 126 } } int line_counter = 0; while (true) { for (int i=0; i<cols; i++) { if (status[i] & screen[line_counter][i] == ' ') screen[line_counter][i] = (rand() % 95) + 32; else screen[line_counter][i] = ' '; } // update status: for (int i=0; i < switch_num; i++) { int pos = rand() % cols; status[pos] = !status[pos]; } // show screen: for(int i=line_counter+rows; i!=line_counter; i--) { for(int j=0; j< cols; j++) { cout << " "; cout << screen[i%rows][j]; } cout << endl; } this_thread::sleep_for(chrono::milliseconds(delay)); cout << "\033[2J\033[1;1H"; // clear screen. line_counter++; line_counter = line_counter % rows; } return 0; }
留言
張貼留言