使用C++在Ubuntu系统中模拟数字雨效果

简介: 别忘了,这可是一场没有结尾的雨,按下'q'键退出哦。现在,你已经可以在自己的Ubuntu系统上享受这场视觉盛宴了,享受编程的乐趣,让创造力和代码带给你无尽的可能。

模拟数字雨(Matrix Rain)效果,好像直接走进了电影《黑客帝国》的数字荒原。想实现这个酷炫的效果?让我们在Ubuntu系统上,使用C++,以及ncurses库来点亮你的终端屏幕。

首先,你得有g++编译器和ncurses库。不用担心,Ubuntu通通有提供。打开终端,轻松安装:

sudo apt-get install g++ libncurses5-dev libncursesw5-dev
​

噼里啪啦,一堆代码就安装好了。接着,就是编写C++代码。我们需要做的事情是:

  1. 初始化ncurses,准备美丽的终端界面。
  2. 创建一把钥匙,那就是矩阵式的字符数组。
  3. 编排每一列字符,让它们像倾盆大雨一样下落。
  4. 让每个字符有随机的延迟效果,就像每滴雨落下的速度不同。

下面是创建你自己的数字雨的具体步骤:

#include <ncurses.h>
#include <unistd.h>
#include <stdlib.h>
#include <ctime>

// 设置数字雨中一些基本的参数
const int width = 70;   // 设置屏幕宽度
const int length = 200; // 设置字符下落的长度,也就是下落速度和屏幕的「深度」

// 神秘的数字雨字符集合
const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890@#$%^&*()_+[]{}|;:',.<>/?"

// 给我们的雨设置一个初始位置。
int startPosition[width];

// 这是行进速度的调节器。
int getRandSpeed() {
    return rand() % 5 + 1; // 随机速度
}

// 初始化开始位置
void initRain() {
    for (int i = 0; i < width; ++i) {
        // 设定每滴数字雨的起始高度为随机值
        startPosition[i] = -1 * (rand() % length);
    }
}

// 制造一滴滴数字雨
void makeItRain() {
    int printHeight;
    for (int i = 0; i < width; ++i) {
        if(startPosition[i] >= length)
            startPosition[i] = 0;
        else
            startPosition[i] += getRandSpeed();
        printHeight = startPosition[i];

        for (int j = 0; j < printHeight; j++) {
            if(j < printHeight - 2) {
                // 这里让字符随机显示
                mvaddch(j, i, charset[rand() % (sizeof(charset) - 1)]);
            } else {
                // 这里是落地的字符,我们给他个白色高亮
                attron(A_REVERSE);
                mvaddch(j, i, charset[rand() % (sizeof(charset) - 1)]);
                attroff(A_REVERSE);
            }
        }
    }
}

int main() {
    srand(time(NULL)); // 随机种子
    initscr();         // 初始化 ncurses
    cbreak();          // 禁止行缓冲,使得字符立即可用
    noecho();          // 关闭回显
    curs_set(0);       // 隐藏光标
    nodelay(stdscr, TRUE); // 设置 getch()为非阻塞模式
    initRain();        // 初始化雨滴的起始位置

    // 死循环,至直到按下'q'
    while(getch() != 'q') {
        makeItRain();
        refresh();      // 刷新屏幕以显示字符
        usleep(30000);  // 设置延迟,这影响了雨滴下落的速度
    }
    endwin(); // 结束 curses 模式

    return 0;
}
​

编写完上述代码后,保存为 matrix_rain.cpp,然后编译它:

g++ matrix_rain.cpp -o matrix_rain -lncurses
​

然后,只需运行编译出来的程序,你的终端就会有了炫酷的数字雨效果:

./matrix_rain
​

这堆代码就像魔法一样,在你的屏幕上召唤出流动的数字雨,不久你就会发现自己深深地被吸引,沉浸在这个神奇的数字世界中。

别忘了,这可是一场没有结尾的雨,按下'q'键退出哦。现在,你已经可以在自己的Ubuntu系统上享受这场视觉盛宴了,享受编程的乐趣,让创造力和代码带给你无尽的可能。

目录
相关文章
|
3月前
|
Ubuntu Linux 开发者
Ubuntu 系统默认主题 Yaru 有望获得新的垃圾箱图标
目前,设计师仍在接受其他贡献者的反馈,因此到目前为止制作的图标不确保一定会出现在 Ubuntu 中。值得注意的是,一些评论者表示他们喜欢现有的垃圾桶图标,并希望它不要改变。
|
3月前
|
存储 Ubuntu Linux
「正点原子Linux连载」第二章Ubuntu系统入门
在图2.8.2.4中,我们使用命令umount卸载了U盘,卸载以后当我们再去访问文件夹/mnt/tmp的时候发现里面没有任何文件了,说明我们卸载成功了。
|
1月前
|
Ubuntu 编译器 开发工具
在Ubuntu系统上搭建RISC-V交叉编译环境
以上步骤涵盖了在Ubuntu系统上搭建RISC-V交叉编译环境的主要过程。这一过程涉及了安装依赖、克隆源码、编译安装工具链以及设置环境变量等关键步骤。遵循这些步骤,可以在Ubuntu系统上搭建一个用于RISC-V开发的强大工具集。
200 22
|
1月前
|
Ubuntu 网络协议 网络安全
解决Ubuntu系统的网络连接问题
以上步骤通常可以帮助解决大多数Ubuntu系统的网络连接问题。如果问题仍然存在,可能需要更深入的诊断,或考虑联系网络管理员或专业技术人员。
461 18
|
1月前
|
Ubuntu API C++
C++标准库、Windows API及Ubuntu API的综合应用
总之,C++标准库、Windows API和Ubuntu API的综合应用是一项挑战性较大的任务,需要开发者具备跨平台编程的深入知识和丰富经验。通过合理的架构设计和有效的工具选择,可以在不同的操作系统平台上高效地开发和部署应用程序。
108 11
|
2月前
|
Ubuntu 安全 关系型数据库
安装MariaDB服务器流程介绍在Ubuntu 22.04系统上
至此, 您已经在 Ubuntu 22.04 系统上成功地完成了 MariadB 的标准部署流程,并且对其进行基础但重要地初步配置加固工作。通过以上简洁明快且实用性强大地操作流程, 您现在拥有一个待定制与使用地强大 SQL 数据库管理系统。
230 18
|
2月前
|
Ubuntu 安全 关系型数据库
安装MariaDB服务器流程介绍在Ubuntu 22.04系统上
至此, 您已经在 Ubuntu 22.04 系统上成功地完成了 MariadB 的标准部署流程,并且对其进行基础但重要地初步配置加固工作。通过以上简洁明快且实用性强大地操作流程, 您现在拥有一个待定制与使用地强大 SQL 数据库管理系统。
250 15
|
2月前
|
存储 Ubuntu iOS开发
在Ubuntu 22.04系统上安装libimobiledevice的步骤
为了获取更多功能或者解决可能出现问题,请参考官方文档或者社区提供支持。
169 14
|
2月前
|
Ubuntu
在Ubuntu系统上设置syslog日志轮替与大小限制
请注意,在修改任何系统级别配置之前,请务必备份相应得原始档案并理解每项变更可能带来得影响。
290 2