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语言项目:黑客帝国之数字雨相关推荐
- GitHub开源:4行代码实现《黑客帝国》数字雨特效
黑客帝国可是经久不衰的科幻热血巨作,近期GitHub一位大神开源了科技感十足的模拟<黑客帝国>数字雨效果特效.使用终端256色支持的十个级别的"绿色",通过添加随机的亮 ...
- 【炫酷秀】仅用4行代码再现《黑客帝国》数字雨,可立即在终端实现!
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 提到<黑客帝国>,字符雨可谓是让人印象深刻. 这种科技感爆棚的特效,你 ...
- 4行代码再现《黑客帝国》数字雨,在终端实现的那种
十三 发自 凹非寺 量子位 报道 | 公众号 QbitAI 提到<黑客帝国>,字符雨可谓是让人印象深刻. 这种科技感爆棚的特效,你是否也想来一套? 这个,可以有. 最近,名叫akinomy ...
- 【C语言/C++程序员编程】一小时做出来的数字雨(一颗开花的树)!
相信大家看过许许多多的关于计算机黑客.骇客.人工智能.AI方面的电影,每当黑客入侵某个五角大楼,某个网站时,都会出现这样一副画面: 入侵 或者这样的: 数字雨 然后就轻而易举的成功入侵夺取管理员权限了 ...
- 【C/C++源码】黑客帝国数字雨
今天分享一个用C语言画黑客帝国数字雨的源码~ 用到的是easyx图形库绘图功能,所以需要下载安装easyx图形库,直接官网搜索下载即可,devC++用不了,需要另外配置哦!适用于Visual C++与 ...
- 【黑客帝国数字雨屏保】基于Win32的黑客帝国数字雨屏幕保护程序(附VS工程代码文件和可执行文件)
运行效果 代码结构 //黑客帝国数字雨 花心胡萝卜 #包含 <windows.h> #包含 <stdlib.h>#define 时钟编号 1 #define 最大长度 25 / ...
- 实现黑客帝国数字雨效果
今日闲得慌,折腾了一个黑客帝国数字雨效果,还蛮不错的. 操作:新建一个文本文档,输入 以下代码,再将扩展名修改为 Bat,运行即可. 命令提示符代码:(0-1) @echo off title 黑客帝 ...
- 【C语言】第一个C语言项目——“猜数字”游戏(内附源码)
君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello米娜桑,这里是君兮_,今天又抽空为大家更新我们的主线0基础C语言啦!鉴于最近讲解了非常多的选择语句与循环语句,咱们今天就来讲讲 ...
- python命令数字雨_用Python实现黑客帝国代码雨效果(3种方式)
说起电影<黑客帝国>,相信大部分人都看过或听说过,影片中有一个场景数字雨,如果你看过电影的话,应该对这个经典场景印象深刻,本文我们利用 Python 以数字.字母.图片三种形式来实现这一效 ...
最新文章
- 在Homebrew 发布程序
- 【数据挖掘】关联规则挖掘 Apriori 算法 ( 关联规则简介 | 数据集 与 事物 Transaction 概念 | 项 Item 概念 | 项集 Item Set | 频繁项集 | 示例解析 )
- 【Servlet】Java Serlvet Listener 监听器
- spring boot actuator工作原理之http服务暴露源码分析
- Java基础day22
- Bootstrap组件_进度条
- MSChart BarChart
- Unreal的控制台命令参数合集
- ​炸裂!万字长文拿下 HTTP 我在字节跳动等你!
- OpenCasCade中一个V3d_Viewer对应多个示例窗口V3d_View
- 如何通过广西税务12366缴纳城乡居民医保费用及下载缴费凭证?
- Python排序算法(四)——插入排序
- 计算机论文读书报告怎么写,论文读书报告范文(共6篇).doc
- android studio中Option + Enter选择了disable 'introduce local variable'
- 佐治亚州立大学计算机科学,佐治亚州立大学计算机科学研究生语言及申请要求-费用-课程设置...
- Vue安装element ui踩坑
- ALK8266WIFI解决方案支持常见普通单片机实现WIFI高速传输和许多实用功能,实测速度超过M字节每秒
- android自定义秒表,Android实现的秒表计时器示例
- 云呼HTML自适应官网源码
- MySQL知识点详解
热门文章
- 反应式服务中的线程本地状态可用性
- JDK 9:NotNullOrElse方法已添加到Objects类
- jta atomikos_带有Atomikos示例的Tomcat中的Spring JTA多个资源事务
- 功能Java示例 第1部分–从命令式到声明式
- Picocli 2.0:类固醇上的Groovy脚本
- 使用Spring创建用于JUnit测试的JNDI资源
- java 生成器 设计模式_Java中的生成器设计模式
- 如何将云持久存储添加到JBoss Cool Store
- jasperreports_JasperReports JSF插件用例系列
- 进阶– Java EE 7前端5强