C语言项目:黑客帝国之数字雨
編輯
? ? ? ? 相信大家看過許許多多的關于計算機黑客、駭客、人工智能、AI方面的電影,每當黑客入侵某個五角大樓,某個網站時,都會出現這樣一幅畫面:
編輯
????????然后就輕而易舉的成功入侵奪取管理員權限了,這時候的我們,心情肯定是激動的無以復加,心里大喊著:666!!!,如果我有這么厲害的技術就好了!所以大家想到今天要說的是什么了嗎?
編輯
? ? ? ? O(∩_∩)O和這并沒有太大的關系,今天我們要講的是《數字雨》!
好了,我們來看下什么是數字雨:
編輯
????????數字雨,顧名思義,就是類似于填上下雨一樣,往下掉數字或者是文字。如下動態圖:
編輯
????????這樣看起來是不是感覺我們像是進入了一個科幻的虛擬世界呢?當然了程序運行后會有有個小小的驚喜哦?
#include?<Windows.h>
#include?<time.h>
#include?<mmsystem.h>
#pragma comment(lib, "WINMM.LIB")
#define NumOfColumn 25 //顯示列的列數
typedef struct charList
{
struct charList * prev;
TCHAR ch; //放字符
struct charList * next;
}CharList;
typedef struct tagCharColumn
{
struct charList * head, *cur;
int x, y, iShownLen, iStrNum; //顯示字數,字符數
}CharQueue;
struct showChar
{
TCHAR myChar[60];
int iNum; //字符個數
}charArr[7] = {//《一顆開花的樹》-席慕容
{ TEXT("如何讓你遇見我,在我最美麗的時刻"),16 },
{ TEXT("為這,我已在佛前求了五百年,求他讓我們結一段塵緣"),24 },
{ TEXT("佛于是把我化作一棵樹,長在你必經的路旁"),19 },
{ TEXT("陽光下慎重地開滿了花,朵朵都是我前世的盼望"),21 },
{ TEXT("當你走進,請你細聽,那顫抖的葉是我等待的熱情"),21 },
{ TEXT("而當你終于無視地走過,在你身后落了一地的"), 20 },
{ TEXT("朋友啊,那不是花瓣,是我凋零的心"),16 }
};
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
TCHAR szClassName[] = TEXT("數字雨");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = NULL;
wndclass.hCursor = NULL;
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szClassName;
if (!RegisterClass(&wndclass))
{
return 0;
}
hwnd = CreateWindow(szClassName, NULL, WS_DLGFRAME | WS_THICKFRAME | WS_POPUP, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, SW_SHOWMAXIMIZED);
UpdateWindow(hwnd);
ShowCursor(FALSE);
srand(time(0));
//消息機制
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
ShowCursor(TRUE);
return msg.wParam;
}
void CreateQueue(CharQueue * cc, int cyScreen, int x)
{
//bug -- 調用API---寫接口---ctrl+c/ctrl+v
CharList * front;
int NumTemp = rand() % 6;
cc->x = x;
cc->y = rand() % 10 ? rand() % cyScreen : 0; //大約9/10的概率從中間開始下落。
cc->iShownLen = 1; //一開始就顯示一個字符,然后慢慢增加,增加到等于歌詞字符數時保持不變
cc->iStrNum = charArr[NumTemp].iNum; //歌詞字符數
cc->head = cc->cur = front = (CharList *)calloc(cc->iStrNum, sizeof(CharList)); //創建顯示列
//生成每個節點
int i;
for (i = 0; iiStrNum - 1; i++)
{
cc->cur->prev = front;
cc->cur->ch = charArr[NumTemp].myChar[i];
front = cc->cur++;
front->next = cc->cur;
}
//最后一個是標點符號
cc->cur->prev = front;
cc->cur->ch = charArr[NumTemp].myChar[i];
cc->cur->next = cc->head;
cc->head->prev = cc->cur;
cc->cur = cc->head;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
static HDC hdcMem;
static HBITMAP hBitmap;
static CharQueue * AllChar;
HFONT hFont;
static int cxScreen, cyScreen;
static int iFontWidth = 20, iFontHeight = 20;
int i, j, y, greenToblack;
CharQueue * ccElem;
CharList * temp;
switch (message)
{
case WM_CREATE:
cxScreen = GetSystemMetrics(SM_CXSCREEN);
cyScreen = GetSystemMetrics(SM_CYSCREEN);
SetTimer(hwnd, 1, 70, NULL);
hdc = GetDC(hwnd);
hdcMem = CreateCompatibleDC(hdc);
hBitmap = CreateCompatibleBitmap(hdc, cxScreen, cyScreen);
SelectObject(hdcMem, hBitmap);
ReleaseDC(hwnd, hdc);
hFont = CreateFont(iFontHeight, iFontWidth, 0/*角度設置*/, 0/*角度設置*/, FW_BOLD/*黑體*/, 0, 0, 0,/*斜體 下劃線 啊、刪除線*/
DEFAULT_CHARSET/*字符集*/, OUT_DEFAULT_PRECIS/*指定輸出精度*/, CLIP_DEFAULT_PRECIS/*指定裁剪精度*/,
DRAFT_QUALITY/*指向輸出質量*/, FIXED_PITCH | FF_SWISS/*指定字體間距| 字體族*/, TEXT("宋體"));
SelectObject(hdcMem, hFont);
DeleteObject(hFont);
SetBkMode(hdcMem, TRANSPARENT);
PlaySound(L"素材.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);//異步循環播放
AllChar = (CharQueue *)calloc(NumOfColumn, sizeof(CharQueue));//自動初始化為o
for (i = 0; i
{
CreateQueue(AllChar + i, cyScreen, 50 * i + 20);
}
return 0;
case WM_TIMER:
//該函數使用當前選入指定設備環境中的刷子繪制給定的矩形區域。通過使用給出的光柵操作來對該刷子的顏色和表面顏色進行組合。
PatBlt(hdcMem, 0, 0, cxScreen, cyScreen, BLACKNESS);
for (i = 0; i
{
ccElem = AllChar + i;
temp = ccElem->head;
SetTextColor(hdcMem, RGB(255, 255, 255));
TextOut(hdcMem, ccElem->x, ccElem->y, &temp->ch, 1/*字符個數*/);
y = ccElem->y;
greenToblack = 0;
ccElem->head = ccElem->head->next;
temp = temp->prev;
for (j = 1; jiShownLen; j++)
{
SetTextColor(hdcMem, RGB(/*greenToblack*5%255*/0, 255 - 255 * (greenToblack++) / (ccElem->iStrNum), 0));
TextOut(hdcMem, ccElem->x, y -= iFontHeight, &temp->ch, 1);
temp = temp->prev;
}
if (ccElem->iShownLeniStrNum)
{
ccElem->iShownLen++;
}
ccElem->y += iFontHeight;
if (ccElem->y - ccElem->iStrNum*iFontHeight>cyScreen)
{
free(ccElem->cur);
CreateQueue(ccElem, cyScreen, 128 * i + 17);
}
}
hdc = GetDC(hwnd);
BitBlt(hdc, 0, 0, cxScreen, cyScreen, hdcMem, 0, 0, SRCCOPY);
ReleaseDC(hwnd, hdc);
return 0;
case WM_RBUTTONDOWN:
KillTimer(hwnd, 1);
return 0;
case WM_RBUTTONUP:
SetTimer(hwnd, 1, 70, NULL);
return 0;
//case WM_LBUTTONDOWN:
case WM_KEYDOWN:
case WM_DESTROY:
KillTimer(hwnd, 1);
for (i = 0; i
{
ccElem = AllChar + i;
free(ccElem->cur);
}
free(AllChar);
DeleteObject(hBitmap);
DeleteDC(hdcMem);
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
????????看完了今天的效果圖和代碼,細心的大家是不是發現了什么?沒錯
編輯
????????這回不忽悠大家了,代碼中引用的詩歌,貌似是一首關于情感方面的的現代詩!當然了,這個程序你用到什么方面就不管我的事情了,正好里面也會調用音樂,氛圍也不錯,一打開就是滿滿的驚喜。今天的程序就到這里了,喜歡的小伙伴多多轉發關注哦!
同時也可以關注我們的公眾號:【輕松學C語言】
總結
以上是生活随笔為你收集整理的C语言项目:黑客帝国之数字雨的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑显卡怎么看数据信息(如何查看显卡数据
- 下一篇: iPhone14 如何抠出有趣的图片并用