#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;
}
黑客帝国数字雨
最新推荐文章于 2024-07-21 18:09:58 发布