0x00 前言
文章中的文字可能存在语法错误以及标点错误,请谅解;
如果在文章中发现代码错误或其它问题请告知,感谢!
本文档试验所使用的系统版本为:Linux version 3.13.0-24-generic,32位;
文章仅为个人学习展示,可能最终实际效果并不理想,若想接近《黑客帝国》里的效果可以参考0x03节末尾链接。
0x01效果展示
0x02编程思路
1.确定屏幕的长宽xy,坐标轴顶点在左上角;
2.将代码雨分解成一个一个队列,每个队列包含n个节点,队列起始位置在x轴上,每个队列起始位置不重叠,队列依次在y轴加1,形成“下雨”效果;
3.当队列到达y轴最大值后,丢弃队列头节点 ,然后在尾节点插入新节点 ,循环往复。
0x03代码实现
编程时需要ncurses.h 头文件,打开usr/include,若没有则打开终端输入命令来安装ncurses:
sudo apt-get install libncurses5-dev libncursesw5-dev
在RHEL / Fedora / CentOS Linux中,我们使用以下命令来安装:
yum install ncurses-devel ncurses
代码实现:
#include <ncurses.h>
#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/queue.h>
#define COL_NUM 7 //队列数量
#define COL_LEN 4 //队列长度
#define COL_WIDE 10 //队列间距
//某个点的结构体定义
struct Node
{
char ch; //字符
int x; //x值
int y; //y值
SIMPLEQ_ENTRY(Node) entry;
};
int main(void)
{
int i = 0;
int j = 0;
int count = 0;
struct Node *temp;
initscr(); //初始化屏幕
noecho();
curs_set(0); //不显示光标
start_color(); //启用颜色支持
init_pair(1, COLOR_GREEN, COLOR_BLACK); //使用绿色作为前景色,黑色作为背景色
bkgdset(COLOR_PAIR(1)); //设置颜色对
clear(); //清屏,去除原来的字符
//在特定位置显示想要的字符
//位置用坐标来表示,坐标的原点在窗口左上角,x轴指向右边,y轴指向下面
int xmax = getmaxx(stdscr); //标准屏幕的x的最大值
int ymax = getmaxy(stdscr); //标准屏幕的y的最大值
srand(time(NULL)); //随机数种子
SIMPLEQ_HEAD(, Node) col[COL_NUM]; //创建MAX_NUM个队列
for(i = 0; i<COL_NUM; i++)
{
SIMPLEQ_INIT(&col[i]);
}
//对所有的队列的每个成员进行初始化
for(j = 0;j<COL_NUM;j++)
{
for(i = 0;i<COL_LEN;i++)
{
temp = malloc(sizeof(struct Node)); //申请内存空间
temp->ch = rand()%10 + 'a';
temp->x = 10 + j*COL_WIDE;
temp->y = i;
SIMPLEQ_INSERT_TAIL(&col[j], temp, entry); //将节点加入队列
}
}
while(1)
{
clear(); //清屏
struct Node *var; //临时变量用来遍历队列的每一个节点
for(j = 0; j<COL_NUM; j++)
{
SIMPLEQ_FOREACH(var, &col[j], entry)
{
//若该队列头部成员到了底部,删除该成员,并在队列尾部增加新成员
if(var->y >= ymax - 2)
{
SIMPLEQ_REMOVE_HEAD(&col[j], entry); //清除头部成员,每次去除一个
free(temp);
for(i = 0;i<COL_LEN;i++)
{
temp = malloc(sizeof(struct Node)); //申请内存空间
temp->ch = rand()%10 + 'a';
temp->x = 10 + j*COL_WIDE;
temp->y = i;
//将新成员加入该队列尾
SIMPLEQ_INSERT_TAIL(&col[j], temp, entry);
}
}
//显示
move(var->y, var->x);
addch(var->ch);
var->y++;
}
}
refresh();
//延时
usleep(120000);
}
getch(); //等待按键,确保不会马上退出
endwin(); //退出
free(temp);
return 0;
}
该项目已上传至github:https://github.com/fyw4/Code-rain
本代码可能视觉效果并不理想,所以下面贴两个视效贴近影视作品中的代码雨的源代码,不过不是使用C语言开发,但也有一定参考意义:
1.https://download.csdn.net/download/hermanho/4689726
2.https://jingyan.baidu.com/article/066074d6002ee3c3c21cb0f5.html
以上。
参考文档:
1.https://blog.csdn.net/chentao1206/article/details/51280610
2.http://blog.chinaunix.net/uid-29504236-id-4272258.html