//字母数字雨
#include<stdio.h>
//随机数头文件
#include<stdlib.h>
//包含easyX图形库 可以使用绘图函数 以及鼠标操作
#include<graphics.h>
#include<conio.h>
#define STR_SIZE 20//没串雨的字符个数
#define RAIN_NUM 128//雨的数量
#define WIDTH 960
#define HEIGHT 640
#define STR_W 15//字符宽度
//结构体封装属性
struct rain
{
int x;
int y;
int speed;
char str[STR_SIZE];//每一串字符语
}rain[RAIN_NUM];
//每一个字符串由字符组成
//写一个函数生成字符
char createch()
{
char ch = 0;
//随机产生字符,使用rand函数,
//随机中的随机
int flag = rand() % 3;// 0 1 2
if (flag == 0)
{
ch = rand() % 10 + '0';//产生0~9的随机数 加一个'0'把数字转化成字符
}
else if (flag == 1)
{
ch = rand() % 26 + 'a';//随机产生字母 大写 小写 26个字母
}
else
{
ch = rand() % 26 + 'A';
}
return ch;
}
//数据的初始化
void GameInit()
{
for (int i = 0; i < RAIN_NUM; i++)
{
rain[i].x = i*STR_W;//每条雨之间的距离等距
rain[i].y = rand() % HEIGHT;
rain[i].speed = rand() % 5 +5 ;//在5 ~ 9之间
for (int j = 0; j < STR_SIZE; j++)
{
rain[i].str[j] = createch();//初始化每条雨
}
}
}
//绘制
void GameDraw()
{
//双缓冲绘图
BeginBatchDraw();
//清楚屏幕
cleardevice();
for (int i = 0; i < RAIN_NUM; i++)
{
for (int j = 0; j < STR_SIZE; j++)
{
//设置颜色
settextcolor(RGB(0,255-j*13,0));//由下到上 越来越浅
//out text xy 输出文本到指定的位置
outtextxy(rain[i].x,rain[i].y-15*j,rain[i].str[j]);
}
}
EndBatchDraw();
}
void changeCh()
{
//找到每一个字符串
for (int i = 0; i < RAIN_NUM; i++)
{
for (int j = 0; j < STR_SIZE; j++)
{
//让字符串的每一个字符,都有可能发生改变,但是不是同一时间发生改变。
rain[i].str[rand() % STR_SIZE] = createch();
}
}
}
//让它动起来
void GamePlay()
{
for (int i = 0; i < RAIN_NUM; i++)
{
rain[i].y+=rain[i].speed;
//当它掉出屏幕后 传到上面
if (rain[i].y-STR_SIZE*STR_W >= HEIGHT)
{
//让速度重新生成
rain[i].speed = rand() % 5 + 5;
rain[i].y = 0;
}
changeCh();
}
}
//下落的过程中,数字字母不断变化
//让程序暂停 原理就是运用死循环
void stop()
{
//判断是否有按键产生
if (_kbhit() && _getch() == ' ')//有按键返回非0值,否则返回0
{
while (_getch() != ' ');//如果没有输入空格就一直等待
}
}
int main(void)
{
//创建一个图形窗口,init初始化 大小 参数 宽高 SHOWCONSOLE显示黑窗口
initgraph(WIDTH, HEIGHT);
//设置随机数种子
srand(GetTickCount());//返回从开机到现在所经过的毫秒数,让所产生的随机数不断的变化。
GameInit();
while (1)
{
GamePlay();
GameDraw();
changeCh();
stop();
}
getchar();
return 0;
}
参考视频:https://www.bilibili.com/video/BV1kK411M7qo?t=5027