C/C++黑客帝国代码雨

作者:Want595日期:2025/10/10

img

写在前面

数字雨,又被称为“黑客帝国雨”,是一种经典的视觉效果,常用于表现科幻、科技感十足的场景。这种效果最初在电影《黑客帝国》中出现,以绿色字符从屏幕顶端不断下落的方式,营造出一种神秘而充满未来感的氛围。本文将介绍如何使用C语言在Windows控制台中实现一个简易的数字雨效果。通过这篇文章,你不仅能了解如何利用控制台API进行绘图操作,还能体会到字符动画背后的技术逻辑与美感。

系列文章

序号直达链接
1C/C++李峋同款跳动的爱心
2C/C++跳动的爱心
3C/C++经典爱心
4C/C++满屏飘字
5C/C++大雪纷飞
6C/C++黑客帝国字母雨
7C/C++樱花树
8C/C++奥特曼
9C/C++精美圣诞树
10C/C++俄罗斯方块小游戏
11C/C++贪吃蛇小游戏
12C/C++孤单又灿烂的神
13C/C++闪烁的爱心
14C/C++哆啦A梦
15C/C++简单圣诞树
16C/C++小宇宙
17C/C++冰墩墩
18C/C++七彩花朵
19C/C++玫瑰花
20C/C++小猪佩奇
21C/C++简易爱心
22C/C++流星雨①
23C/C++2048小游戏
24C/C++爱心圣诞树
25C/C++文字跑马灯
26C/C++教师工作量管理系统
27C/C++满天繁星
28C/C++漂浮爱心
29C/C++五子棋小游戏
30C/C++球球大作战小游戏
31C/C++走迷宫小游戏
32C/C++粉色爱心
33C/C++棕色小熊
34C/C++粉色动态爱心
35C/C++炫酷烟花①
36C/C++炫酷烟花②
37C/C++炫酷烟花③
38C/C++炫酷烟花④
39C/C++星空漩涡
40C/C++流星雨②
敬请期待……

技术需求

  1. 控制台窗口操作
  • 句柄管理:通过GetStdHandle获取标准输出设备的句柄,用于后续的光标定位和颜色设置。
  • 窗口尺寸自适应:利用GetConsoleScreenBufferInfo动态获取控制台窗口的尺寸,并根据窗口大小调整显示区域,确保在不同分辨率下都能正常显示。
  • 最大化窗口:通过调用ShowWindow函数,将控制台窗口最大化,提升视觉体验。
  1. 光标与字符控制
  • 光标隐藏:使用GetConsoleCursorInfoSetConsoleCursorInfo隐藏控制台光标,避免干扰视觉效果。
  • 字符定位:借助SetConsoleCursorPosition实现字符的精确位置控制,使每个字符都能准确出现在指定坐标。
  • 字符擦除:通过在字符轨迹末端输出空格,模拟字符“下落”并逐渐消失的效果。
  1. 颜色与视觉效果管理
  • 颜色设置:使用SetConsoleTextAttribute设置字符颜色,通过组合前景色和高亮属性,区分字符的头部与尾部,增强视觉层次感。
  • 动态颜色变化:字符头部采用高亮绿色,尾部为普通绿色,形成鲜明对比,模拟真实数字雨的视觉效果。
  1. 随机性与动态更新机制
  • 随机字符生成:利用rand()函数生成随机字母,使每条字符轨迹都具有独特性。
  • 动态更新:通过Sleep函数控制刷新频率,结合循环不断更新字符位置,形成流畅的动画效果。
  • 边界重置:当字符下落至窗口底部时,自动重置其位置,形成无限循环的下落效果。
  1. 结构体与数据管理
  • 结构体封装:使用RAINDROP结构体封装字符的坐标与内容,便于统一管理多个字符轨迹。
  • 数组管理:通过数组存储多个RAINDROP实例,实现多条字符轨迹的同时下落。
  1. 性能优化与兼容性
  • 缓冲区尺寸调整:通过SetConsoleScreenBufferSize设置合适的缓冲区大小,避免字符显示异常。
  • 系统兼容性:代码基于Windows API开发,适用于Windows平台,具有良好的兼容性。

主要代码

创作不易,订阅后可查看完整代码

1#include <stdio.h>
2#include <time.h>
3#include <Windows.h>
4typedef struct {  //字母结构体
5  int x, y;
6  char ch;
7} RAINDROP;
8const int BUFFER_SIZE = 100;
9int WIDTH = 80;
10int HEIGHT = 30;
11const int RAIN_LENGTH = 18;
12RAINDROP raindropLine[BUFFER_SIZE];
13HANDLE HOUT = GetStdHandle(STD_OUTPUT_HANDLE);  //获得标准输出的句柄
14void gotoxy(int x, int y) {
15  COORD pos;        //定义表示一个字符在控制台屏幕上的坐标的对象
16  pos.X = x;
17  pos.Y = y;
18  SetConsoleCursorPosition(HOUT, pos);  //设置控制台标准输出光标位置
19}
20void show_cursor(BOOL hide) {
21  CONSOLE_CURSOR_INFO cciCursor;
22  if (GetConsoleCursorInfo(HOUT, &cciCursor)) {  //获得光标信息
23    cciCursor.bVisible = hide;          //隐藏光标    
24    SetConsoleCursorInfo(HOUT, &cciCursor);    //重新设置光标
25  }
26}
27void set_color(int color) {
28  SetConsoleTextAttribute(HOUT, color);    //设置输出颜色
29}
30……
31

创作流程

在创作这段代码时,我的目标是复现电影《黑客帝国》中那种充满科技感的数字雨效果。我希望通过字符的动态下落,营造出一种神秘而富有未来感的氛围。整个过程从设计结构体开始,逐步构建出一个完整的动画系统。

首先,我定义了一个RAINDROP结构体,用于存储每个字符的坐标和内容。这个结构体是整个数字雨系统的核心,它让每个字符都能独立运动,互不干扰。为了让字符轨迹更长,我设置了RAIN_LENGTH常量,用于控制字符的“尾巴”长度。

接下来,我着手处理控制台窗口的尺寸问题。我希望这个程序能在不同分辨率的屏幕上正常运行,因此通过GetConsoleScreenBufferInfo动态获取窗口尺寸,并根据窗口大小调整显示区域。同时,我还调用了ShowWindow函数,将控制台窗口最大化,以提供更广阔的视觉空间。

为了增强视觉效果,我决定隐藏控制台的光标。通过GetConsoleCursorInfoSetConsoleCursorInfo函数,我成功隐藏了光标,避免它在动画过程中干扰视线。随后,我利用SetConsoleCursorPosition函数实现了字符的精确位置控制,这是实现字符动画的关键一步。

在颜色设置方面,我使用了SetConsoleTextAttribute函数。为了让字符头部更加突出,我将其设置为高亮绿色,而尾部则为普通绿色。这种颜色对比不仅增强了视觉层次感,也让整个动画更加生动。

为了让字符能够随机下落,我利用rand()函数生成随机字母,并将其存储在RAINDROP结构体中。通过不断更新字符的Y坐标,我实现了字符从上至下的下落效果。当字符下落至窗口底部时,我会将其重置到顶部,形成无限循环的动画。

最后,我通过Sleep函数控制动画的刷新频率,确保动画流畅运行。整个过程虽然基于简单的字符操作,但通过精心设计,最终呈现出一种极具科技感的视觉效果。

写在后面

我是一只有趣的兔子,感谢你的喜欢!


C/C++黑客帝国代码雨》 是转载文章,点击查看原文


相关推荐


深入浅出 Compose 测量机制
Pika2025/10/9

自从换了新工作后,好久没有写博客了,今天终于能有时间写点东西,Compose作为Android新一代UI框架,已经得到了很多公司的认可,未来市场对Compose的要求也逐步提高。如果大家对Compose有兴趣,也欢迎后台私信我,字节移动OS招聘Compose框架的二次定制开发的Android小伙伴,一起把Compose做大做强吧! UI框架的测量流程 对于UI框架来说,测量布局与绘制可谓是非常重要的三个话题,对于Compose来说也不例外,本章我们将从着Compose的原理出发,来聊一下最重要


大数据毕业设计选题推荐-基于大数据的全球产品库存数据分析与可视化系统-大数据-Spark-Hadoop-Bigdata
IT研究室2025/10/8

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python项目 安卓项目 微信小程序项目 文章目录 一、前言二、开发环境三、系统界面展示四、代码参考五、系统视频结语 一、前言 系统介绍 本系统是一个基于大数据技术的全球产品库存数据分析与可视化系统,采用Hado


【Linux】线程的互斥
羚羊角uou2025/10/6

因为线程是共享地址空间的,就会共享大部分资源,这种共享资源就是公共资源,当多执行流访问公共资源的时候,就会出现各种情况的数据不一致问题。为了解决这种问题,我们就需要学习线程的同步与互斥,本篇将介绍线程的互斥。 1.相关概念 临界资源:多线程执⾏流被保护的共享资源就叫做临界资源 临界区:每个线程内部,访问临界资源的代码,就叫做临界区 互斥:任何时刻,互斥保证有且只有⼀个执⾏流进⼊临界区,访问临界资源,通常对临界资源起保护作⽤ 原⼦性:不会被任何调度机制打断的操作,该操作只有两态,要么完成,


MySQL Performance Schema详解与实战应用
IT橘子皮2025/10/5

Performance Schema是MySQL内置的性能监控系统,自5.5版本引入以来已成为数据库性能分析与优化的核心工具。本文将全面解析其架构原理、配置方法及典型应用场景,帮助您掌握这一强大的性能诊断利器。 一、Performance Schema核心架构 Performance Schema采用插桩-消费者模型构建,通过轻量级的内存表存储性能数据,对数据库性能影响通常控制在5%以内。其核心组件包括: ​插桩点(Instruments)​​:嵌入MySQL代码的探测点,按层级命名如wai


【Unity笔记】Unity XR 模式下 Point Light 不生效的原因与解决方法
EQ-雪梨蛋花汤2025/10/4

Unity XR 模式下 Point Light 不生效的原因与解决方法 在 Unity 中开发 VR 应用时,经常会遇到一个让人疑惑的现象: 在 编辑器 Game 模式下,场景中的 Point Light(点光源) 可以正常照亮物体。但当启用 Initialize XR on Startup 并通过 VR 设备运行时,Point Light 不再生效,只有 Directional Light(平行光) 仍然有效。 这让很多开发者误以为“材质只支持 Directional Light,而不支持


XYplorer(多标签文件管理器) 多语便携版
东风西巷2025/10/2

XYplorer中文版是一款多标签文件管理器及增强资源管理器的工具,XYplorer文件管理器支持多标签页栏,管理文件时跟使用Chrome之类浏览器一样,从浏览方便性,和切换滑顺程度,要比Windows系统自带的Explorer资源管理器便捷得多.可以大部分程度上替代系统自带的文件管理器.同时,有浏览器快捷键和鼠标快捷. 软件功能 双窗口浏览:支持双窗口浏览,可以同时浏览两个文件夹,方便文件的复制、移动和比较。 高级搜索:支持高级搜索功能,可以根据文件名、大小、日期、属性等多种条件进


什么是 Apache Ignite?
悟能不能悟2025/10/2

首先需要明确一点:“Ignite”这个名字在技术领域可能指代不同的事物,但最著名和广泛使用的是 ​Apache Ignite。它是一个功能强大的、分布式内存计算平台。除此之外,还有例如 ​Couchbase Ignite​(一个会议)等。本文将重点介绍 ​Apache Ignite。 什么是 Apache Ignite? Apache Ignite 是一个以内存为中心的分布式数据库、缓存和处理平台,设计用于在横向扩展的架构上提供极高的性能和吞吐量。你可以把它理解为一个“内存数据网格”,但其


Python零基础入门:30分钟掌握核心语法与实战应用
做运维的阿瑞2025/10/2

Python基础入门指南 5分钟掌握核心概念,15分钟上手实战项目 你将学到什么 核心技能实际应用学习时间🔢 数据类型处理文本、数字、列表10分钟🔄 控制流程循环、判断、函数15分钟📊 数据处理文件操作、数据分析20分钟🎮 实战项目猜数字游戏30分钟 适合人群 零基础新手 | 转语言开发者 | 在校学生 | 职场提升 快速开始 三个核心场景 数据处理 # 处理学生成绩 scores = [85, 92, 78, 96, 88, 76, 94, 82] #


软件工程实践团队作业——团队组建与实践选题
Funny Valentine-js10/1/2025

吴彦组。


Qt Widgets 应用程序核心类 - QApplication 详解
会飞的胖达喵9/30/2025

摘要:QApplication是Qt Widgets应用的核心类,负责GUI应用程序的控制流和全局设置。它继承自QGuiApplication和QCoreApplication,提供样式管理、调色板/字体设置、用户交互参数配置以及窗口管理等功能。通过qApp宏可全局访问应用实例,支持运行时动态调整界面风格。示例展示了QApplication的初始化、属性设置、样式更改和事件循环管理,以及高级功能如字体大小控制和样式表应用,体现了其在Qt Widgets开发中的核心作用。

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0