【C】C语言实现数字字母雨小程序

2
//字母数字雨
#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