02、C語言--黑客帝國(數字雨)
阿新 • • 發佈:2021-07-03
數字雨效果
在黑客帝國電影場景中,曾出現大量的數字雨特效。在現實的生活中,雨往往給人一種清新的感覺,而雨後的感覺則是新生。
也許,電影中所表達的意思便是對自我的啟迪乃至新生的過程。
程式碼如下所示:
#include <stdio.h> #include <graphics.h> // 視窗的寬和高 #define WIDTH 960 #define HEIGHT 640 #define STR_SIZE 25 // 數字雨陣列最大儲存 #define STR_NUM 128 // 數字雨的串數 #define STR_WIDTH 15 // 字串寬度 // 雨的結構 struct Rain { int x; int y; int speed; // 下降速度 char str[STR_SIZE]; // 數字雨陣列 }rain[STR_NUM]; char CreateCh() { char temp = 0; int flag = rand() % 3; if (flag == 0) { temp = rand() % 26 + 'a'; } else if (flag == 1) { temp = rand() % 26 + 'A'; } else { temp = rand() % 10 + '0'; } return temp; } void GameInit() { // 初始化基礎資料 for (size_t i = 0; i < STR_NUM; i++) { rain[i].x = i * STR_WIDTH; rain[i].y = rand() % HEIGHT; rain[i].speed = (rand() % 5) + 5; } // 初始化字串 for (size_t i = 0; i < STR_NUM; i++) { for (size_t j = 0; j < STR_SIZE; j++) { rain[i].str[j] = CreateCh(); if (rain[i].y > HEIGHT) { rain[i].y = 0; } } } } void GameDraw() { cleardevice(); for (size_t i = 0; i < STR_NUM; i++) { for (size_t j = 0; j < STR_SIZE; j++) { outtextxy(rain[i].x, rain[i].y - STR_WIDTH * j, rain[i].str[j]); settextcolor(RGB(0, 255 - (13 * j), 0)); } } } void GamePlay() { for (size_t i = 0; i < STR_NUM; i++) { rain[i].y += rain[i].speed; if (rain[i].y - STR_SIZE * STR_WIDTH > WIDTH) { rain[i].y = 0; } } } void ChangeCh() { for (size_t i = 0; i < STR_NUM; i++) { rain[rand() % STR_NUM].str[rand() % STR_SIZE] = CreateCh(); } } int main() { initgraph(WIDTH, HEIGHT); srand(GetTickCount()); DWORD t1, t2; t1 = t2 = GetTickCount(); GameInit(); while (true) { BeginBatchDraw(); GameDraw(); ChangeCh(); if (t2 - t1 > 20) { // 使遊戲下落延時 GamePlay(); t1 = t2; } t2 = GetTickCount(); EndBatchDraw(); // Sleep(20); // 使整個程式延時 } getchar(); closegraph(); return 0; }