黑客帝国数字雨(手把手教你写基础项目)0基础也能学会

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<easyx.h>	


#define RAIN_NUM 128 //字符雨条数
#define STR_NUM 20	 //每串数字雨字符个数
#define SIZE 15		 //字符间距
#define SCREEN_TICKS_PER_FRAME (1000/60.0)	//每秒屏幕节拍 16.666666

//数字雨结构体
struct Rain
{
	int x;
	int y;
	int speed;			//下落速度
	char str[STR_NUM];	//每一串数字雨的字符
};
struct Rain rains[RAIN_NUM];

//随机生成字符
char createChar()
{
	int flag = rand() % 3;	//0 1 2
	if (flag == 0)
	{
		//生成数字字符
		return rand() % 10 + '0';
	}
	else if (flag == 1)
	{
		//生成字母
		return rand() % 26 + 'A';
	}
	else
	{
		return rand() % 26 + 'a';
	}
}
//初始化数字雨
void rainInit()
{
	for (int i = 0; i < RAIN_NUM; i++)
	{
		rains[i].x = i * SIZE;		//等距
		rains[i].y = rand() % getheight();
		rains[i].speed = rand() % 3 + 1;	//1 2 3
		for (int k = 0; k < STR_NUM; k++)
		{
			rains[i].str[k] = createChar();
		}
	}
}
//绘制数字雨
void rainDraw()
{
	//printf("hello 歪你");
	//error C2665:  2 个重载中没有一个可以转换所有参数类型  字符集问题
	//outtextxy(0, 0, "hello 歪你");

	for (int i = 0; i < RAIN_NUM; i++)
	{
		for (int k = 0; k < STR_NUM; k++)
		{
			//设置文字颜色
			settextcolor(RGB(0, 255 - k * 13, 0));
			outtextxy(rains[i].x, rains[i].y - k * 15, rains[i].str[k]);
		}
	}
}
//随即改变字符
void rainChangChar()
{
	for (int i = 0; i < RAIN_NUM; i++)
	{
		rains[i].str[rand() % STR_NUM] = createChar();
	}
}
//下雨
void raining()
{
	for (int i = 0; i < RAIN_NUM; i++)
	{
		rains[i].y += rains[i].speed;
		//让数字雨落下去了之后,又从上往下落
		if (rains[i].y - STR_NUM * SIZE > getheight())
		{
			rains[i].y = 0;
		}
	}
}




int main()
{
	//创建图形窗口
	initgraph(960, 640);
	//设置背景模式
	setbkmode(TRANSPARENT);
	//设置随机数种子
	srand(time(NULL));
	rainInit();
	//fps 60 如何控制帧率
	while (true)
	{
		//获取每一次循环开始的时间
		int startTime = clock();	//获取程序运行到调用clock函数所经过的毫秒数

		//双缓冲
		BeginBatchDraw();
		//清屏
		cleardevice();

		rainDraw();
		rainChangChar();
		raining();
		FlushBatchDraw();
		//计算一下这一帧经过了多少毫秒
		int frameTime = clock() - startTime;
		//判断是否提前完成 16ms 6 -> 10ms
		if (frameTime < SCREEN_TICKS_PER_FRAME)
		{
			Sleep(SCREEN_TICKS_PER_FRAME - frameTime);
		}
	}
	EndBatchDraw();	//把内容中的图绘制到窗口上
	closegraph();
	//getchar();
	return 0;
}

 

 

本人公众号
标玩机器的鲁

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值