引言
思路:
代码部分
#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();
}
效果图: