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;
}