【C语言/C++程序员编程】一小时做出来的数字雨(一颗开花的树)!
相信大家看過(guò)許許多多的關(guān)于計(jì)算機(jī)黑客、駭客、人工智能、AI方面的電影,每當(dāng)黑客入侵某個(gè)五角大樓,某個(gè)網(wǎng)站時(shí),都會(huì)出現(xiàn)這樣一副畫面:
入侵
或者這樣的:
數(shù)字雨
然后就輕而易舉的成功入侵奪取管理員權(quán)限了,這時(shí)候的我們,心情肯定是激動(dòng)的無(wú)以復(fù)加,心里大喊著:666!!!如果我有這么厲害的技術(shù)就好了!
所以大家想到今天要說(shuō)的是什么了嗎?沒錯(cuò),
(^U^)ノ~YO
和這并沒有太大的關(guān)系,今天我們要講的,是《數(shù)字雨》!
好了,我們來(lái)看下什么是數(shù)字雨。
數(shù)字雨,顧名思義,就是類似于天上下雨一樣,往下掉數(shù)字或者是文字。
如下動(dòng)態(tài)圖:
這樣看起來(lái)是不是感覺我們像是進(jìn)入了一個(gè)科幻的虛擬世界呢?
?
當(dāng)然了程序運(yùn)行后還會(huì)有個(gè)小小的驚喜哦?
/**********************************************************************************
項(xiàng)目名稱:數(shù)字雨《一棵開花的樹》
***********************************************************************************/
#include#include#include#pragma comment(lib, "WINMM.LIB")#define NumOfColumn 25 //顯示列的列數(shù)typedef struct charList{struct charList * prev;TCHAR ch; //放字符struct charList * next;}CharList;typedef struct tagCharColumn{struct charList * head, *cur;int x, y, iShownLen, iStrNum; //顯示字?jǐn)?shù),字符數(shù)}CharQueue;struct showChar{TCHAR myChar[60];int iNum; //字符個(gè)數(shù)}charArr[7] = {//《一顆開花的樹》{ TEXT("如何讓你遇見我,在我最美麗的時(shí)刻"),16 },{ TEXT("為這,我已在佛前求了五百年,求他讓我們結(jié)一段塵緣"),24 },{ TEXT("佛于是把我化作一棵樹,長(zhǎng)在你必經(jīng)的路旁"),19 },{ TEXT("陽(yáng)光下慎重地開滿了花,朵朵都是我前世的盼望"),21 },{ TEXT("當(dāng)你走近,請(qǐng)你細(xì)聽,那顫抖的葉是我等待的熱情"),21 },{ TEXT("而當(dāng)你終于無(wú)視地走過(guò),在你身后落了一地的"), 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("數(shù)字雨");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);Show Window(hwnd, SW_SHOWMAXIMIZED);Update Window(hwnd);Show Cursor(FALSE);srand(time(0));//消息機(jī)制while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}Show Cursor(TRUE);return msg.wParam;}void CreateQueue(CharQueue * cc, int cyScreen, int x){//bug -- 調(diào)用API---寫接口---ctrl+c/ctrl+vCharList * front;int NumTemp = rand() % 6;cc->x = x;cc->y = rand() % 10 ? rand() % cyScreen : 0; //大約9/10的概率從中間開始下落。cc->iShownLen = 1; //一開始就顯示一個(gè)字符,然后慢慢增加,增加到等于歌詞字符數(shù)時(shí)保持不變cc->iStrNum = charArr[NumTemp].iNum; //歌詞字符數(shù)cc->head = cc->cur = front = (CharList *)calloc(cc->iStrNum, sizeof(CharList)); //創(chuàng)建顯示列//生成每個(gè)節(jié)點(diǎn)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;}//最后一個(gè)是標(biāo)點(diǎn)符號(hào)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/*角度設(shè)置*/, 0/*角度設(shè)置*/, FW_BOLD/*黑體*/, 0, 0, 0,/*斜體 下劃線 啊、刪除線*/DEFAULT_CHARSET/*字符集*/, OUT_DEFAULT_PRECIS/*指定輸出精度*/, CLIP_DEFAULT_PRECIS/*指定裁剪精度*/,DRAFT_QUALITY/*指向輸出質(zhì)量*/, FIXED_PITCH | FF_SWISS/*指定字體間距| 字體族*/, TEXT("宋體"));SelectObject(hdcMem, hFont);DeleteObject(hFont);SetBkMode(hdcMem, TRANSPARENT);PlaySound(L"素材.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);//異步循環(huán)播放AllChar = (CharQueue *)calloc(NumOfColumn, sizeof(CharQueue));//自動(dòng)初始化為ofor (i = 0; i{CreateQueue(AllChar + i, cyScreen, 50 * i + 20);}return 0;case WM_TIMER://該函數(shù)使用當(dāng)前選入指定設(shè)備環(huán)境中的刷子繪制給定的矩形區(qū)域。通過(guò)使用給出的光柵操作來(lái)對(duì)該刷子的顏色和表面顏色進(jìn)行組合。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/*字符個(gè)數(shù)*/);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);}看完了今天的效果圖和代碼,細(xì)心的同學(xué)是不是發(fā)現(xiàn)了什么?
學(xué)C/C++不易,此路應(yīng)攜手前行。
歡迎關(guān)注我的編程公眾號(hào)【草莓味貍貓】!?
如果你想跟著小編一起學(xué)編程的話!
可以來(lái)我的C語(yǔ)言C++編程學(xué)習(xí)基地,【點(diǎn)擊進(jìn)入】!
還有(源碼,零基礎(chǔ)教程,項(xiàng)目實(shí)戰(zhàn)教學(xué)視頻)!? ?
總結(jié)
以上是生活随笔為你收集整理的【C语言/C++程序员编程】一小时做出来的数字雨(一颗开花的树)!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 打码_Java基础(一)
- 下一篇: 西门子PLC各类通信协议差异对比