C语言数字雨--90行代码

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;
}
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值