黑客帝国大家应该都看过吧 ! 其实也没有什么吸引我的 出了里面的数字雨 很漂亮也很经典

一直深深的吸引着我 !  下面 我们用  VC 来实现

#include <windows.h>

#define ID_TIMER    1 
#define STRMAXLEN  25 //一个显示列的最大长度 
#define STRMINLEN  8  //一个显示列的最小长度

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; 
// 
// 
typedef struct tagCharChain //整个当作屏幕的一个显示列,这是个双向列表 

        struct tagCharChain *prev; //链表的前个元素 
        TCHAR  ch;                  //一个显示列中的一个字符 
        struct tagCharChain *next; //链表的后个元素 
}CharChain, *pCharChain;

typedef struct tagCharColumn 

        CharChain *head, *current, *point; 
        int x, y, iStrLen; //显示列的开始显示的x,y坐标,iStrLen是这个列的长度 
        int iStopTimes, iMustStopTimes; //已经停滞的次数和必须停滞的次数,必须停滞的次数是随机的 
}CharColumn, *pCharColumn;

int main(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                    PSTR szCmdLine, int iCmdShow) 

        static TCHAR szAppName[] = TEXT ("matrix") ; 
        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                = LoadIcon (NULL, IDI_APPLICATION) ; 
        wndclass.hCursor        = LoadCursor (NULL, IDC_ARROW) ; 
        wndclass.hbrBackground        = (HBRUSH) GetStockObject (BLACK_BRUSH) ; 
        wndclass.lpszMenuName        = NULL ; 
        wndclass.lpszClassName        = szAppName ;

if(!RegisterClass (&wndclass)) 
        { 
            MessageBox (NULL, TEXT ("此程序必须运行在NT下!"), szAppName, MB_ICONERROR) ; 
            return 0; 
        }

hwnd = CreateWindow (szAppName, 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 ((int) GetCurrentTime ()) ; //初始化随机数发生器 
        while (GetMessage (&msg, NULL, 0, 0)) 
  { 
            TranslateMessage (&msg) ; 
            DispatchMessage (&msg) ; 
        } 
        ShowCursor(TRUE); //显示鼠标光标 
        return msg.wParam ; 
}

TCHAR randomChar() //随机字符产生函数 

        return (TCHAR)(rand()%(126-33)+33); //33到126之间 
}

int init(CharColumn *cc, int cyScreen, int x) //初始化 

        int j; 
        cc->iStrLen = rand()%(STRMAXLEN-STRMINLEN) + STRMINLEN; //显示列的长度 
        cc->x = x+3 ;        //显示列的开始显示的x坐标 
        cc->y =rand()%3?rand()%cyScreen:0; //显示列的开始显示的y坐标 
        cc->iMustStopTimes = rand()%6 ; 
        cc->iStopTimes    = 0 ; 
        cc->head = cc->current = 
                        (pCharChain)calloc(cc->iStrLen, sizeof(CharChain)); //生成显示列 
        for(j=0; j<cc->iStrLen-1; j++) 
        { 
                cc->current->prev = cc->point; //cc->point一个显示列的前个元素 
                cc->current->ch  = '\0'; 
                cc->current->next = cc->current+1; //cc->current+1一个显示列的后个元素 
                cc->point          = cc->current++; //cc->point = cc->current; cc->current++; 
        } 
        cc->current->prev = cc->point; //最后一个节点 
        cc->current->ch  = '\0'; 
        cc->current->next = cc->head; 
  cc->head->prev    = cc->current; //头节点的前一个为此链的最后一个元素

cc->current = cc->point = cc->head; //free掉申请的内存要用current当参数 
        cc->head->ch = randomChar(); // 对链表头的 元素填充 
        return 0; 
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 

      HDC          hdc ; 
      //ctn 用来确定一个显示链是否 向下前进,如果等待次数超过必须等待的次数,ctn就代表要向下前进 
      int i, j, temp, ctn; //j为一个显示链中除链表头外的在屏幕上显示的y坐标,temp绿色过度到黑色之用 
      static  HDC hdcMem; 
      HFONT    hFont; 
      static  HBITMAP hBitmap; 
      static  int cxScreen, cyScreen; //屏幕的宽度 高度. 
      static  int iFontWidth=10, iFontHeight=15, iColumnCount; //字体的宽度 高度, 列数 
      static  CharColumn *ccChain;

switch (message) 
      { 
        case WM_CREATE: 
            cxScreen = GetSystemMetrics(SM_CXSCREEN) ; //屏幕宽度 
            cyScreen = GetSystemMetrics(SM_CYSCREEN) ; 
            SetTimer (hwnd, ID_TIMER, 10, NULL) ;

hdc = GetDC(hwnd); 
            hdcMem = CreateCompatibleDC(hdc); 
            hBitmap = CreateCompatibleBitmap(hdc, cxScreen, cyScreen); 
            SelectObject(hdcMem, hBitmap); 
            ReleaseDC(hwnd, hdc); 
            //创建字体 
            hFont = CreateFont(iFontHeight, iFontWidth-5, 0, 0, FW_BOLD, 0, 0, 0, 
  DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, 
                                DRAFT_QUALITY, FIXED_PITCH | FF_SWISS, TEXT("Fixedsys")); 
            SelectObject(hdcMem, hFont); 
            DeleteObject (hFont) ; 
            SetBkMode(hdcMem, TRANSPARENT); //设置背景模式为 透明 
            iColumnCount = cxScreen/(iFontWidth*3/2); //屏幕所显示字母雨的列数

ccChain = (pCharColumn)calloc(iColumnCount, sizeof(CharColumn)); 
            for(i=0; i<iColumnCount; i++) 
            { 
                init(ccChain+i, cyScreen, (iFontWidth*3/2)*i); 
            } 
            return 0 ;

case WM_TIMER: 
            hdc = GetDC(hwnd); 
            PatBlt (hdcMem, 0, 0, cxScreen, cyScreen, BLACKNESS) ; //将内存设备映像刷成黑色 
            for(i=0; i<iColumnCount; i++) 
            { 
                ctn = (ccChain+i)->iStopTimes++ > (ccChain+i)->iMustStopTimes; 
                // 
                (ccChain+i)->point = (ccChain+i)->head; //point用于遍历整个显示列 
                 
                //第一个字符显示为 白色 
                SetTextColor(hdcMem, RGB(255, 255, 255)); 
  TextOut(hdcMem, (ccChain+i)->x, (ccChain+i)->y, &((ccChain+i)->point->ch), 1); 
                j = (ccChain+i)->y;  
                (ccChain+i)->point = (ccChain+i)->point->next; 
                //遍历整个显示列,将这个显示列里的字符从下往上显示 
                temp = 0 ; //temp绿色过度到黑色之用 
                while((ccChain+i)->point != (ccChain+i)->head && (ccChain+i)->point->ch) 
                { 
                        SetTextColor(hdcMem, RGB(0, 255-(255*(temp++)/(ccChain+i)->iStrLen), 0)); 
                        TextOut(hdcMem, (ccChain+i)->x, j-=iFontHeight, &((ccChain+i)->point->ch), 1); 
                        (ccChain+i)->point = (ccChain+i)->point->next; 
                } 
                if(ctn) 
                    (ccChain+i)->iStopTimes = 0 ; 
                else continue; 
                (ccChain+i)->y += iFontHeight; //下次开始显示的y坐标 为当前的y坐标加上 一个字符的高度 
                //如果开始显示的y坐标减去 整个显示列的长度超过了屏幕的高度 
                if( (ccChain+i)->y-(ccChain+i)->iStrLen*iFontHeight > cyScreen) 
                { 
                        free( (ccChain+i)->current ); 
init(ccChain+i, cyScreen, (iFontWidth*3/2)*i); 
                } 
                //链表的头 为此链表的前个元素,因为下次开始显示的时候 就相当与在整个显示列的开头添加个元素,然后在开始往上显示 
                (ccChain+i)->head = (ccChain+i)->head->prev; 
                (ccChain+i)->head->ch = randomChar(); 
            } 
             
            BitBlt(hdc, 0, 0, cxScreen, cyScreen, hdcMem, 0, 0, SRCCOPY); 
            ReleaseDC(hwnd, hdc); 
            return 0;

case WM_RBUTTONDOWN: 
            KillTimer (hwnd, ID_TIMER) ; 
            return 0;

case WM_RBUTTONUP: 
            SetTimer (hwnd, ID_TIMER, 10, NULL) ; 
            return 0;

//处理善后工作 
        case WM_KEYDOWN: 
        case WM_LBUTTONDOWN: 
        case WM_DESTROY: 
            KillTimer (hwnd, ID_TIMER) ; 
            DeleteObject(hBitmap); 
            DeleteDC(hdcMem); 
            for(i=0; i<iColumnCount; i++) 
            { 
                free( (ccChain+i)->current ); 
            } 
            free(ccChain); 
            PostQuitMessage (0) ; 
            return 0 ; 
        } 
        return DefWindowProc (hwnd, message, wParam, lParam) ; 
}

C 实现黑客帝国数字雨相关推荐

  1. 【黑客帝国数字雨屏保】基于Win32的黑客帝国数字雨屏幕保护程序(附VS工程代码文件和可执行文件)

    运行效果 代码结构 //黑客帝国数字雨 花心胡萝卜 #包含 <windows.h> #包含 <stdlib.h>#define 时钟编号 1 #define 最大长度 25 / ...

  2. 实现黑客帝国数字雨效果

    今日闲得慌,折腾了一个黑客帝国数字雨效果,还蛮不错的. 操作:新建一个文本文档,输入 以下代码,再将扩展名修改为 Bat,运行即可. 命令提示符代码:(0-1) @echo off title 黑客帝 ...

  3. 【C/C++源码】黑客帝国数字雨

    今天分享一个用C语言画黑客帝国数字雨的源码~ 用到的是easyx图形库绘图功能,所以需要下载安装easyx图形库,直接官网搜索下载即可,devC++用不了,需要另外配置哦!适用于Visual C++与 ...

  4. canvas黑客帝国数字雨背景 html+css+js

    效果(完整源码在最后): [html+css+js]黑客帝国数字雨源码分享 可拿来作页面背景 制作: 定义canvas标签: <canvas id="canvas">& ...

  5. 使用canvas实现黑客帝国数字雨

    效果图: 代码: <!DOCTYPE html> <html lang="en"> <head><meta charset="U ...

  6. 【炫酷秀】仅用4行代码再现《黑客帝国》数字雨,可立即在终端实现!

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 提到<黑客帝国>,字符雨可谓是让人印象深刻. 这种科技感爆棚的特效,你 ...

  7. 4行代码再现《黑客帝国》数字雨,在终端实现的那种

    十三 发自 凹非寺 量子位 报道 | 公众号 QbitAI 提到<黑客帝国>,字符雨可谓是让人印象深刻. 这种科技感爆棚的特效,你是否也想来一套? 这个,可以有. 最近,名叫akinomy ...

  8. python命令数字雨_用Python实现黑客帝国代码雨效果(3种方式)

    说起电影<黑客帝国>,相信大部分人都看过或听说过,影片中有一个场景数字雨,如果你看过电影的话,应该对这个经典场景印象深刻,本文我们利用 Python 以数字.字母.图片三种形式来实现这一效 ...

  9. GitHub开源:4行代码实现《黑客帝国》数字雨特效

    黑客帝国可是经久不衰的科幻热血巨作,近期GitHub一位大神开源了科技感十足的模拟<黑客帝国>数字雨效果特效.使用终端256色支持的十个级别的"绿色",通过添加随机的亮 ...

  10. C语言项目:黑客帝国之数字雨

    编辑 相信大家看过许许多多的关于计算机黑客.骇客.人工智能.AI方面的电影,每当黑客入侵某个五角大楼,某个网站时,都会出现这样一幅画面: 编辑 然后就轻而易举的成功入侵夺取管理员权限了,这时候的我们, ...

最新文章

  1. Swift、Flutter 共同瞄准 Windows!
  2. KVC/KVO 本质
  3. ssl1377-竞赛真理【dp之分组背包】
  4. mysql 学习笔记 多表查询02
  5. [vue] 你知道nextTick的原理吗?
  6. Mysql批量更新的一个坑-allowMultiQueries=true允许批量更新
  7. 【函数的定义、调用(嵌套调用、递归调用)、声明、函数的分类(有无返回值、有无参数)、变量(自动变量与静态变量、局部变量与全局变量、只读变量)】(学习笔记7--函数)
  8. 中文HanLp分词入门
  9. 牛逼! IDEA 2020 要本土化,真的是全中文了!中国开发者话语权越来越大了
  10. 简单的木马编写之服务端篇
  11. ES 索引mapping之keyword;term查询添加keyword查询;更改mapping keyword类型
  12. flex弹性布局教程-02-容器display设置为flex
  13. 计算机多媒体设备维护维修,学校多媒体教学设备的故障检修
  14. ajax401错误,使用jqueryajax捕获401未经授权的http响应
  15. python xlrd获取excel行数_Python 使用xlrd库读取excel,获取最大行和最大列等
  16. Chrome浏览器录屏扩展插件
  17. 输出两个数之间的水仙花数C++
  18. 隐藏实用的GitHub使用技巧
  19. 2021高考成绩排名查询河北,河北高考排名查询方法,2021年河北高考成绩位次全省排名查询...
  20. QQ浏览器使用infinity主题扩展

热门文章

  1. Moebius for SQL Server集群
  2. Dexpot 虚拟桌面软件(推荐)
  3. BIOS的全局变量gST gBS gDS
  4. wav转mp3的最简单方法
  5. KGB Messenger解题流程
  6. xp如何快速升级win10系统
  7. 基于Java基础的客户信息管理系统
  8. 华东师范大学计算机学院博导,华东师范大学计算机科学与软件工程学院导师信息——陈洁...
  9. 2022年第二十三届华东杯大学生数学建模竞赛
  10. 阅读基地畅销榜数据抓取