相信大家看过许许多多的关于计算机黑客、骇客、人工智能、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++程序员编程】一小时做出来的数字雨(一颗开花的树)!相关推荐

  1. 程序员面试金典 - 面试题 10.10. 数字流的秩(map/树状数组)

    文章目录 1. 题目 2. 解题 2.1 map 2.2 树状数组 1. 题目 假设你正在读取一串整数.每隔一段时间,你希望能找出数字 x 的秩(小于或等于 x 的值的个数). 请实现数据结构和算法来 ...

  2. c语言 指针不能赋值吗,程序员编程C语言指针答疑:指针赋值没那么简单

    C语言指针,纸老虎 一.程序员编程C语言答疑合集 更多C语言学习答疑文章,请参阅:程序员编程C语言答疑文章合集 也可以加入下方我的"C语言答疑课堂"圈子,第一时间看到我给大家带来的 ...

  3. C语言编程拼错的纸条,程序员编程C语言指针答疑:小心scanf函数给指针输错值...

    一.程序员编程C语言答疑合集 https://m.toutiaocdn.com/group/6718545102257521166/?app=news_article&timestamp=15 ...

  4. C语言/C++程序员大神打造纯C的电子时钟(加图形库+源码)

    C语言/C++程序员大神打造纯C的电子时钟,每天看时间再也不麻烦了 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进 ...

  5. 漫谈程序员(五)20年资深程序员编程经验分享

    20年资深程序员编程经验分享 原文作者乔纳森·丹尼可(Jonathan Danylko)是一位自由职业的web架构师和程序员,编程经验已超过20年,涉足领域有电子商务.生物技术.房地产.医疗.保险和公 ...

  6. 程序员编程艺术:第三章、寻找最小的k个数

    程序员编程艺术:第三章.寻找最小的k个数 作者:July. 时间:二零一一年四月二十八日. 致谢:litaoye, strugglever,yansha,luuillu,Sorehead,及狂想曲创作 ...

  7. 2022年各国程序员编程水平排行榜出炉,排名第一的国家没听说过

    哪个地方的程序员编程水平最高?相信很多人对这个问题感兴趣,今天就来聊一聊这个话题. Pentalog 是一个全球数字服务平台,主要帮助企业寻找世界上一流的IT人才,每年都会发布一份全球IT行业报告,今 ...

  8. [置顶] 程序员编程生产力相差10倍意味着什么?

    在软件工程研究中,被验证得最多的结论就是对于同等经验的两个不同程序员,在效率和质量上可能会有10倍的差距.研究人员还发现,这种差距也适用于团队级别上,也就是说在同一行业内的不同的团队也是如此. 软件开 ...

  9. 有人说中文编辑是解决中国程序员编程效率的秘密武器,请问他是一个银弹吗?...

    一."银弹" 首先在这里解释一下"银弹"的概念,顾名思义就是银质的子弹(Silver Bullet),是古老的欧洲民间传说中能杀死狼人的利器.当然现实中是没有狼 ...

最新文章

  1. 命名实体识别视频51cto
  2. spring中Converter如何注入的
  3. idea getset的快捷键
  4. ssh客户端_Mobaxterm-不止是一款好用的SSH客户端软件
  5. Spring注入方法
  6. tornado上传图片
  7. FreeNOS的启动
  8. java in action,java 7 in action
  9. js正则替换字符串中的变量为变量的值
  10. 【重点】程序员面试金典——番外篇之数组中的逆序对
  11. Directx教程(28) 简单的光照模型(7)
  12. 药一点进销存管理软件_gsp管理规范_财务管理软件
  13. Vue使用JsBarcode生成条形码
  14. python爬虫数据(中国人口信息)存入MYSQL数据库
  15. Dialog中显示倒计时,到时自己主动关闭
  16. python3的txt文件读写
  17. vscode 代码格式化及快捷键
  18. 操作系统c语言实现进程同步与互斥代码
  19. javac -d,-cp是什么意思
  20. CodeTON Round 1 (Div. 1 + Div. 2, Rated, Prizes)

热门文章

  1. 超详细!使用HTML、CSS、JavaScript实现倒计时。附加功能——点击页面出现小心心
  2. html怎么转换为txt,html怎么转换成txt
  3. 教师资格证计算机科目有哪些内容,初中教师资格证考试科目及内容有哪些?
  4. 新唐 M451系列APROM与LDROM间跳转
  5. SpringBoot理解
  6. MEMS硅麦和ECM驻极体麦
  7. 多线程 (进阶+初阶)
  8. 锁定计算机好在下游戏吗,求一款能让电脑在某一时段锁定不能玩游戏的软件
  9. 【Python技能树共建】Python爬虫模拟登录
  10. python读取邮件标题_Python连载57- 邮件头和主题、解析邮件