Linux下C语言实现代码雨

34 篇文章 6 订阅

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

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值