1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//字母数字雨
#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