黑客帝国数字雨

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<easyx.h> //需要安装的图形库

/*
* 课程内容:黑客帝国数字雨
* 开发环境:vs2022+easyx
*/

#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;
        }
    }
}

//绘制五角星
void drawFiveStar(int x, int y, int w, int h)
{
    POINT star[5] =
    {
        {x,         y + h / 3},     //1
        {x + w / 2, y},             //2
        {x + w,     y + h / 3},     //3
        {x + w / 5 * 4,y + h},      //4
        {x + w / 5, y + h},         //5
    };
    line(star[0].x, star[0].y, star[2].x, star[2].y);
    line(star[2].x, star[2].y, star[4].x, star[4].y);
    line(star[4].x, star[4].y, star[1].x, star[1].y);
    line(star[1].x, star[1].y, star[3].x, star[3].y);
    line(star[3].x, star[3].y, star[0].x, star[0].y);
}


int main()
{
    //创建图形窗口
    initgraph(960, 640, EW_SHOWCONSOLE);
    //设置背景模式
    setbkmode(TRANSPARENT);
    //设置随机数种子
    srand(time(NULL));

    rainInit();
    //fps 60 如何控制帧率
    while (true)
    {
        //获取每一次循环开始的时间
        int startTime = clock();    //获取程序运行到调用clock函数所经过的毫秒数

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

        rainDraw();
        rainChangChar();
        raining();
        drawFiveStar(50, 50, 100, 100);
        EndBatchDraw(); //把内容中的图绘制到窗口上

        //计算一下这一帧经过了多少毫秒
        int frameTime = clock() - startTime;
        //判断是否提前完成 16ms 6 -> 10ms
        if (frameTime < SCREEN_TICKS_PER_FRAME)
        {
            Sleep(SCREEN_TICKS_PER_FRAME - frameTime);
        }
    }

    getchar();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值