C/C++實現代碼雨效果
目錄
說明
-
最近整理電腦資料,翻出了以前寫的代碼,順便整理一下到博客上,當做一次備份記錄
-
先看看靜態效果
-
需要分為以下步驟實現
- 生成代碼串
- 把代碼串繪制到窗口中
- 使用雙緩沖機制避免屏幕閃爍
- 讓代碼串往下移動
- 隨機選擇代碼串中的隨機字符位置做隨機修改
使用的庫說明
- 使用easyX圖形庫實現,庫安裝包路徑:https://easyx.cn/downloads/
測試代碼
#include <stdio.h> #include <time.h> #include <Windows.h> #include <graphics.h> #define WIDTH 960 #define HEIGHT 640 #define STR_SIZE 20 #define STR_NUM 128 #define STR_WIDTH 15 typedef struct Rain { int x; int y; int speed; TCHAR str[STR_SIZE]; }Rain; Rain rain[STR_NUM]; // 隨機生成一個字符 char CreateCh() { char ch = 0; int flag = rand() % 3; // 0~2 if (flag == 0) ch = rand() % 26 + 'a'; // 產生小寫字母a~z else if (flag == 1) ch = rand() % 26 + 'A'; // 產生大寫字母A~Z else ch = rand() % 10 + '0'; // 產生數字0~9 return ch; } // 初始化結構體成員 void InitRain() { // 初始化字符的位置和速度 for (int i = 0; i < STR_NUM; ++i) { rain[i].x = i*STR_WIDTH; rain[i].y = rand() % HEIGHT; rain[i].speed = rand() % 5 + 5; } // 獲取隨機字符填充進數組 for (int i = 0; i < STR_NUM; i++) { for (int j = 0; j < STR_SIZE; j++) { rain[i].str[j] = CreateCh(); } } } // 輸出到窗口中 void DrawRain() { cleardevice(); for (int i = 0; i < STR_NUM; i++) { for (int j = 0; j < STR_SIZE; j++) { outtextxy(rain[i].x, rain[i].y-STR_WIDTH*j, rain[i].str[j]); settextcolor(RGB(0, 255-j*13, 0)); } } } // 移動字符 void MoveRain() { for (int i = 0; i < STR_NUM; i++) { rain[i].y += rain[i].speed; if (rain[i].y- STR_WIDTH*STR_SIZE > HEIGHT) { rain[i].y = 0; } } } // 隨機改變字符 void ChangeCh() { for (int i = 0; i < STR_NUM; i++) { rain[rand() % STR_NUM].str[rand() % STR_SIZE] = CreateCh(); } } int main() { srand((unsigned int)time(NULL)); // 初始化隨機數種子 initgraph(WIDTH, HEIGHT); InitRain(); DWORD t1, t2; t1 = GetTickCount(); t2 = t1; while (1) { BeginBatchDraw(); // 雙緩沖機制 DrawRain(); ChangeCh(); if (t2 - t1 > 20) { MoveRain(); t1 = t2; } t2 = GetTickCount(); EndBatchDraw(); } getchar(); closegraph(); return 0; }
效果圖
Posted By veis