日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【C语言/C++程序员编程】一小时做出来的数字雨(一颗开花的树)!

發布時間:2023/12/20 c/c++ 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C语言/C++程序员编程】一小时做出来的数字雨(一颗开花的树)! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

相信大家看過許許多多的關于計算機黑客、駭客、人工智能、AI方面的電影,每當黑客入侵某個五角大樓,某個網站時,都會出現這樣一副畫面:

入侵

或者這樣的:

數字雨

然后就輕而易舉的成功入侵奪取管理員權限了,這時候的我們,心情肯定是激動的無以復加,心里大喊著:666!!!如果我有這么厲害的技術就好了!

所以大家想到今天要說的是什么了嗎?沒錯,

(^U^)ノ~YO

和這并沒有太大的關系,今天我們要講的,是《數字雨》!

好了,我們來看下什么是數字雨。

數字雨,顧名思義,就是類似于天上下雨一樣,往下掉數字或者是文字。

如下動態圖:

這樣看起來是不是感覺我們像是進入了一個科幻的虛擬世界呢?

?

當然了程序運行后還會有個小小的驚喜哦?

/**********************************************************************************

項目名稱:數字雨《一棵開花的樹》

***********************************************************************************/

#include#include#include#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);Show Window(hwnd, SW_SHOWMAXIMIZED);Update Window(hwnd);Show Cursor(FALSE);srand(time(0));//消息機制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 -- 調用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; //一開始就顯示一個字符,然后慢慢增加,增加到等于歌詞字符數時保持不變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));//自動初始化為ofor (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++不易,此路應攜手前行。

歡迎關注我的編程公眾號【草莓味貍貓】!?

如果你想跟著小編一起學編程的話!

可以來我的C語言C++編程學習基地,【點擊進入】!

還有(源碼,零基礎教程,項目實戰教學視頻)!? ?

總結

以上是生活随笔為你收集整理的【C语言/C++程序员编程】一小时做出来的数字雨(一颗开花的树)!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。