项目: 代码雨

本文详细介绍了一种使用C语言实现代码雨动画的方法,包括静态代码雨的生成、动态代码雨的更新以及带有颜色渐变效果的代码雨动画。通过随机生成ASCII字符并控制其下落速度,实现了类似电影《黑客帝国》中的经典视觉效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、项目描述和最终的效果展示

项目:   让字符从上到下依次的下落,呈现出代码雨。

最终效果图如下所示:
在这里插入图片描述

二、静态的代码雨

代码如下:

#include<graphics.h>
#include<time.h>
#include<conio.h>

#define High 800//游戏画面
#define Width 1000
#define CharSize 25//每个字符显示的大小

int main(void)
{
	int highNum=High/CharSize;
	int widthNum=Width/CharSize;

	//CharRain存储对应字符矩阵中需要输出字符的ASCII码
	int CharRain[Width/CharSize][High/CharSize];
	int CNum[Width/CharSize];//每一列的有效字符个数
	int i,j,x,y;
	srand((unsigned)time(NULL));//设置随机函数种子

	for(i=0;i<widthNum;i++)//初始化字符矩阵
	{
		CNum[i]=(rand()%(highNum*9/10))+highNum/10;//这一列的有效字符个数
		for(j=0;j<CNum[i];j++)
			CharRain[j][i]=(rand()%26)+65;//产生A~Z的随机字符
	}

	initgraph(Width,High);
	BeginBatchDraw();
	setfont(25,10,"Courier");//设置字体
	setcolor(GREEN);

	for(i=0;i<widthNum;i++)//输出整个字符矩阵
	{
		x=i*CharSize;//当前字符的x坐标
		for(j=0;j<CNum[i];j++)
		{
			y=j*CharSize;//当前字符的y坐标
			outtextxy(x,y,CharRain[j][i]);//输出当前字符
		}
	}
	FlushBatchDraw();
	EndBatchDraw();
	getch();
	closegraph();
	return 0;
}

效果图如下:
在这里插入图片描述

三、一场动态的代码雨

代码如下:

#include<graphics.h>
#include<time.h>
#include<conio.h>

#define High 800//游戏画面
#define Width 1000
#define CharSize 25//每个字符显示的大小

int main(void)
{
	int highNum=High/CharSize;
	int widthNum=Width/CharSize;

	//CharRain存储对应字符矩阵中需要输出字符的ASCII码
	int CharRain[Width/CharSize][High/CharSize];
	int CNum[Width/CharSize];//每一列的有效字符个数
	int i,j,x,y;
	srand((unsigned)time(NULL));//设置随机函数种子

	for(i=0;i<widthNum;i++)//初始化字符矩阵
	{
		CNum[i]=(rand()%(highNum*9/10))+highNum/10;//这一列的有效字符个数
		for(j=0;j<CNum[i];j++)
			CharRain[j][i]=(rand()%26)+65;//产生A~Z的随机字符
	}

	initgraph(Width,High);
	BeginBatchDraw();
	setfont(25,10,"Courier");//设置字体
	setcolor(RGB(0,255,0));

	while(1)
	{
		for(i=0;i<widthNum;i++)
		{
			if(CNum[i]<highNum-1)//当这一列字符没有填满时
			{
				for(j=CNum[i]-1;j>=0;j--)//每个字符向下移动一格
				{
					CharRain[j+1][i]=CharRain[j][i];
				}
				CharRain[0][i]=(rand()%26)+65;//最上一格再重新随机的产生一个字符
				CNum[i]=CNum[i]+1;//这一列的字符数加1
			}
		}
		for(i=0;i<widthNum;i++)//输出整个字符矩阵
		{
			x=i*CharSize;//当前字符的x坐标
			for(j=0;j<CNum[i];j++)
			{
				y=j*CharSize;//当前字符的y坐标
				outtextxy(x,y,CharRain[j][i]);//输出当前字符
			}
		}
		FlushBatchDraw();
		Sleep(200);
		clearrectangle(0,0,Width-1,High-1);//清空画面
	}
	
	EndBatchDraw();
	getch();
	closegraph();
	return 0;
}

效果图如下:
在这里插入图片描述

四、实现代码雨动画

代码如下:

#include<graphics.h>
#include<time.h>
#include<conio.h>

#define High 800//游戏画面
#define Width 1000
#define CharSize 25//每个字符显示的大小

int main(void)
{
	int highNum=High/CharSize;
	int widthNum=Width/CharSize;

	//CharRain存储对应字符矩阵中需要输出字符的ASCII码
	int CharRain[Width/CharSize][High/CharSize];
	int CNum[Width/CharSize];//每一列的有效字符个数
	int ColorG[Width/CharSize];//每一列字符的颜色
	int i,j,x,y;
	srand((unsigned)time(NULL));//设置随机函数种子

	for(i=0;i<widthNum;i++)//初始化字符矩阵
	{
		CNum[i]=(rand()%(highNum*9/10))+highNum/10;//这一列的有效字符个数
		ColorG[i]=255;
		for(j=0;j<CNum[i];j++)
			CharRain[j][i]=(rand()%26)+65;//产生A~Z的随机字符
	}

	initgraph(Width,High);
	BeginBatchDraw();
	setfont(25,10,"Courier");//设置字体

	while(1)
	{
		for(i=0;i<widthNum;i++)
		{
			if(CNum[i]<highNum-1)//当这一列字符没有填满时
			{
				for(j=CNum[i]-1;j>=0;j--)//每个字符向下移动一格
				{
					CharRain[j+1][i]=CharRain[j][i];
				}
				CharRain[0][i]=(rand()%26)+65;//最上一格再重新随机的产生一个字符
				CNum[i]=CNum[i]+1;//这一列的字符数加1
			}
			else
			{
				if(ColorG[i]>40)
					ColorG[i]=ColorG[i]-20;//让满的这一列逐渐变暗
				else
				{
					CNum[i]=(rand()%(highNum/3))+highNum/10;//这一列字符的个数
					ColorG[i]=(rand()%75)+180;//这一列字符的颜色
					for(j=0;j<CNum[i];j++)//重新初始化这一列字符
					{
						CharRain[j][i]=(rand()%26)+65;
					}
				}
			}
		}
		for(i=0;i<widthNum;i++)//输出整个字符矩阵
		{
			x=i*CharSize;//当前字符的x坐标
			for(j=0;j<CNum[i];j++)
			{
				y=j*CharSize;//当前字符的y坐标
				setcolor(RGB(0,ColorG[i],0));
				outtextxy(x,y,CharRain[j][i]);//输出当前字符
			}
		}
		FlushBatchDraw();
		Sleep(100);
		clearrectangle(0,0,Width-1,High-1);//清空画面
	}
	
	EndBatchDraw();
	getch();
	closegraph();
	return 0;
}

效果图如下:
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值