C语言数字雨–90行代码
上图
前期准备:
因为我们用C语言写会用到图形库,所以需要进行环境的搭建;
我这里用的VS2019,先到官方下载一个EasyX.exe;
具体在我的文章"雷霆战机"叙述过
#include<stdio.h>
#include<time.h>
#include<Windows.h>
#include<graphics.h>
#define MAXSTRNUMBER 128 //最多出现多少串
#define MAXLONG 20 //字串最大长度
#define SPACE 15 //两个串之间的距离
#define X 1920 //屏幕横最大坐标
#define Y 1080 //屏幕最大纵坐标
struct Posiation {
int x, y;
int speed;
char str[MAXLONG];
}strNumber[MAXSTRNUMBER];
char getRandChar() {
char temp;
int flag = rand() % 3;
if (flag == 0) {
return temp = rand() % 10 + '0';
}
else if (flag == 1) {
return temp = rand() % 26 + 'a';
}
else if (flag == 2) {
return temp = rand() % 26 + 'A';
}
}
void initializationStr() {
for (int i = 0; i < MAXSTRNUMBER;++i) {
strNumber[i].x = i * SPACE;//初始化x坐标,随着i++,x坐标不断增大,最小为0,最大不超过X
strNumber[i].y = rand()%Y;//初始化y坐标,y是随机的,这也就意味着y可以出现任何地方,
//只要保证y在Y范围内就行了
strNumber[i].speed = rand() % 5 + 5;//速度随机在5-10之间;
}
for (int i = 0; i < MAXSTRNUMBER;++i) {
for (int j = 0; j < MAXLONG;++j) {
strNumber[i].str[j] = getRandChar();//随机对每一个串中的每一个元素赋值
}
}
}
void printXY() {
cleardevice();
//这里的strNumber.y- j * SPACE;即随着j++y值越来越小,所以,所有元素
//都在某一x坐标上,然后紧随第一个元素,y坐标不同,排列在一起,就成一个串了;
for (int i = 0; i < MAXSTRNUMBER;++i) {
for (int j = 0; j < MAXLONG;++j) {
outtextxy(strNumber[i].x, strNumber[i].y - j*SPACE, strNumber[i].str[j]);
settextcolor(RGB(0,255 - j*13,0));
}
}
}
void changeXY() {
//我们需要当每一次字串落下完毕以后,改变,重置其位置,否则,就只能看到一阵流星划过
//然后就啥也没有了,所以当我们某一个字符串的尾部,到达最低端的时候,就重置
//
for (int i = 0; i < MAXSTRNUMBER;++i) {
strNumber[i].y += strNumber[i].speed;//不断改变y坐标位置;
if (strNumber[i].y - SPACE*MAXLONG > Y) {
strNumber[i].y = 0;
}
}
}
void changeStr() {
//我们还需要随机选择结构体中的随机数组中的随机某个元素进行随机改变
for (int i = 0; i < MAXSTRNUMBER;++i) {
strNumber[rand()%MAXSTRNUMBER].str[rand()%MAXLONG] = getRandChar();
}
}
int main() {
srand(GetTickCount());
initgraph(X,Y);
initializationStr();
//sleep不建议使用,它是暂停了,整个程序20毫秒,而我们另一种方法,是局部暂停
//那就是获取时间差,当差值>20的时候,就执行;
DWORD time1, time2;
time1 = time2 = GetTickCount();
while (1) {
BeginBatchDraw();
printXY();
changeStr();
if (time2 - time1 > 20) {
changeXY();
time1 = time2;
}
time2 = GetTickCount();
EndBatchDraw();
}
getchar();
closegraph();
return 0;
}