C语言字符雨动画

引言

思路:

代码部分

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

#define High 1000
#define Width 1000  //设置画布大小
#define Charsize 25 //设置字体大小
#define Highnum High/Charsize
#define Widthnum Width/Charsize

/***产生随机字母个数与随机字母,形成含有字母信息的矩阵***/
void random_char(char char_rain[Widthnum][Highnum],int Color[Widthnum],int Cnum[Widthnum])
{
	for (int i = 0; i < Widthnum; i++)
	{
		Cnum[i] = rand() % (Highnum); //每行随机字符个数
		for (int j = 0; j < Cnum[i]; j++)
		{
			char_rain[i][j] = (rand() % 26) + 65;//产生A~Z的ascall码
		}
		Color[i] = 255;//初始化颜色
	}
}

/***字符雨下落与更新**/
void rain_drop(char char_rain[Widthnum][Highnum], int Cnum[Widthnum],int Color[Widthnum])
{
	for (int i = 0; i < Widthnum; i++)
	{
		if (Cnum[i] < Highnum)
		{
			for (int j = Cnum[i]-1;j>=0; j--)//注意j=Cnum[i]-1,否则可能溢出
			{
				char_rain[i][j + 1] = char_rain[i][j]; //向下移动一格
			}
			Cnum[i]++; //字符个数加一
			char_rain[i][0] = (rand() % 26) + 65; //第一行再随机产生一个字符
		}
		else
		{
			if (Color[i] > 40)
				Color[i] -= 20;  //颜色逐渐变淡
			else
			{
				Cnum[i]= rand() % (Highnum);
				Color[i] = (rand()%75)+180;
				for (int m = 0; m < Cnum[i]; m++)
				{
					char_rain[i][m] = (rand() % 26) + 65;
				}
			}// 颜色太淡,重新产生一列
		}
	}
}

/***显示画面***/
void show(char char_rain[Widthnum][Highnum],int Color[Widthnum], int Cnum[Widthnum])
{
	settextstyle(25,10, _T("宋体"));// 设置字体格式
	for (int i = 0; i < Widthnum; i++)
	{
		int x = i * Charsize;//横坐标
		for (int j = 0; j <Cnum[i]; j++)
		{
			int y = j * Charsize;//纵坐标
			setcolor(RGB(0, Color[i], 0));
			outtextxy(x, y, char_rain[i][j]);
		}
	}
	FlushBatchDraw();
	Sleep(100);
}
int main(void)
{
	initgraph(High, Width);
	char char_rain[Widthnum][Highnum];//存字符信息
	int Cnum[Widthnum];//存有每列的字符个数信息
	int Color[Widthnum];//存每列颜色信息

	srand((unsigned)time(NULL)); //设置随机数种子,避免重复产生相同数字
	random_char(char_rain,Color,Cnum);
	BeginBatchDraw();
	while (1)
	{
		rain_drop(char_rain, Cnum, Color);
		show(char_rain, Color,Cnum);
	}
	EndBatchDraw();
	_getch();
	closegraph();
}

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

附录

对字母的代码雨的思考,从而想到了能否随机出现汉字的代码雨,引发了一系列的问题,如何把每个汉字当成一个个体处理,汉字的储存方式等,代码中得到了部分解决,每个汉字一般占两个char字符,对以上代码进行简单修改可以得到汉字版代码雨,读者也可对一些颜色参数进行修改,会产生辣眼睛的效果( ̄▽ ̄)",初学写的比较粗糙,望有问题可以交流学习

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

#define High 1000
#define Width 1000  //设置画布大小
#define Charsize 25 //设置字体大小
#define Highnum High/Charsize
#define Widthnum Width/Charsize

char word[3][3] = { {"我"},{"爱"},{"你"} };//初始化赋值,必须为3个char,一个要存‘\0’
/***产生随机字母个数与随机字母,形成含有字母信息的矩阵***/
void random_char(char char_rain[Widthnum][Highnum][3], int Color[Widthnum], int Cnum[Widthnum])
{
	for (int i = 0; i < Widthnum; i++)
	{
		Cnum[i] = rand() % (Highnum);  //每行随机字符个数
		for (int j = 0,n=0; j < Cnum[i]; j++)
		{
			n = rand() % 3;
			for(int m=0;m<3;m++)
				char_rain[i][j][m] =word[n][m];//把汉字赋值到char_rain数组
		}
		Color[i] = 255;
	}
}

/***字符雨下落与更新**/
void rain_drop(char char_rain[Widthnum][Highnum][3], int Cnum[Widthnum], int Color[Widthnum])
{
	for (int i = 0,n=0; i < Widthnum; i++)
	{
		if (Cnum[i] < Highnum)
		{
			for (int j = Cnum[i]-1; j >= 0; j--)
			{
				for(int m=0;m<3;m++)
					char_rain[i][j + 1][m] = char_rain[i][j][m]; //向下移动一格
			}
			Cnum[i]++;
			n = rand() % 3;
			for (int m = 0; m < 3; m++)
				char_rain[i][0][m] = word[n][m];
		}
		else
		{
			if (Color[i] > 40)
				Color[i] -= 20;
			else
			{
				Cnum[i] = rand() % (Highnum);
				Color[i] = (rand() % 75) + 180;
				for (int m = 0; m < Cnum[i]; m++)
				{
					n = rand() % 3;
					for (int m1 = 0; m1 < 3; m1++)
						char_rain[i][0][m1] = word[n][m1];//产生A~Z的ascall码
				}
			}
		}
	}
}

void show(char char_rain[Widthnum][Highnum][3], int Color[Widthnum], int Cnum[Widthnum])
{
	settextstyle(25,10, _T("宋体"));
	for (int i = 0; i < Widthnum; i++)
	{
		int x = i * Charsize;
		for (int j = 0; j < Cnum[i]; j++)
		{
			int y = j * Charsize;
			setcolor(RGB(0, Color[i],0));
			outtextxy(x, y, char_rain[i][j]);
		}
	}
	FlushBatchDraw();
	Sleep(100);
}
int main(void)
{
	initgraph(High, Width);
	char char_rain[Widthnum][Highnum][3];
	int Cnum[Widthnum];//存有每列的字符个数信息
	int Color[Widthnum];

	srand((unsigned)time(NULL)); //设置随机数种子,避免重复产生相同数字
	random_char(char_rain, Color, Cnum);
	BeginBatchDraw();
	while (1)
	{
		rain_drop(char_rain, Cnum, Color);
		show(char_rain, Color, Cnum);
	}
	EndBatchDraw();
	_getch();
	closegraph();
}

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

原创文章 6 获赞 7 访问量 549

猜你喜欢

转载自blog.csdn.net/jiuzhongxian_/article/details/105408223
今日推荐