目录
一、函数段
二、完整代码
三、运行效果
一、函数段
1、显示图形界面
(1)安装EasyX图形库,官网地址:EasyX Graphics Library for C++
(2)图形库头文件
#include<graphics.h>
(3)宏定义 设置图形化界面大小
#define WIDTH 960 //窗口宽度
#define HEIGTH 640 //窗口高度
(4)图形化窗口的使用
initgraph(WIDTH, HEIGTH); //打开图形化窗口
getchar();
closegraph(); //关闭图像化窗口
2、数字雨的结构体struct
(1)定义属性代码段
struct Rain
{
int x; //数字雨横向位置
int y; //y坐标
int speed; //下降速度
char str[STR_SIZE]; //数字雨数组
}rain[STR_NUM];
3、随机字符
(1)随机数生成数字雨,srand()需要头文件#include<Windows.h>
srand(GetTickCount()); //利用ASCII码值随机生成,GetTickCount();直接获取电脑开机到现在的毫秒数
(2)switch语句或if-else if语句随机生成数字0、1、2,且产生概率相同
4、初始化
(1)初始化基础数据
(2)初始化字符串
void GameInit()
{
for (int i = 0; i < STR_NUM; i++){
rain[i].x = i * STR_WIDTH;
rain[i].y = rand() % HEIGTH;
rain[i].speed = rand() % 5 + 5; // 5至10
}
for (int i = 0; i < STR_NUM; i++){
for (int j = 0; j < STR_SIZE; j++)
{
rain[i].str[j] = CreateCh();
}
}
}
5、输出字符
(1)字符串颜色设置
settextcolor(RGB(255.0 / STR_SIZE * i, 255.0 / STR_SIZE * j, 0));
//settextcolor(RGB(0, 255 - 13 * j, 0));
6、字符移动
7、变换字符
8、主函数main()
(1)如何解决字符下降速度较快问题
方法一:if()条件判断语句实现
DWORD t1, t2;
t1 = t2 = GetTickCount();
while
{
if (t2 - t1 > 20) //使游戏下落延时
{
GamePlay();
t1 = t2;
}
t2 = GetTickCount();
}
方法二:Sleep()函数实现,功能: 等待一段时间
#include<Windows.h> //适用于Windows系统
#include <unistd.h> //适用于Linux系统
Sleep(20); //使整个程序延时
(2)图形化界面的打开与关闭
initgraph(WIDTH, HEIGTH); //打开图形化窗口
closegraph(); //关闭图像化窗口
二、完整代码
#include<stdio.h>
#include<math.h>
#include<graphics.h> //图形化界面头文件
#include<Windows.h>
#define WIDTH 960 //窗口宽度
#define HEIGTH 640 //窗口高度
#define STR_SIZE 20 //字符串数组的最大存储长度
#define STR_NUM 128 //字符串数量
#define STR_WIDTH 15 //字符串宽度
// 数字雨的结构体
struct Rain
{
int x; //数字雨横向位置
int y; //y坐标
int speed; //下降速度
char str[STR_SIZE]; //数字雨数组
}rain[STR_NUM];
//随机字符
char CreateCh()
{
int flag = rand() % 3; //随机产生数字0、1、2,且产生概率相同
switch (flag)
{
case 0:
return rand() % 26 + 'A';
break;
case 1:
return rand() % 26 + 'a';
break;
case 2:
return rand() % 10 + '0';
break;
default:
break;
}
}
//初始化
void GameInit()
{
for (int i = 0; i < STR_NUM; i++)
{
rain[i].x = i * STR_WIDTH;
rain[i].y = rand() % HEIGTH;
rain[i].speed = rand() % 5 + 5; // 5至10
}
for (int i = 0; i < STR_NUM; i++)
{
for (int j = 0; j < STR_SIZE; j++)
{
rain[i].str[j] = CreateCh();
}
}
}
//输出字符
void GameDraw()
{
cleardevice();
for (int i = 0; i < STR_NUM; i++)
{
for (int j = 0; j < STR_SIZE; j++)
{
settextcolor(RGB(255.0 / STR_SIZE * i, 255.0 / STR_SIZE * j, 0));
//settextcolor(RGB(0, 255 - 13 * j, 0));
outtextxy(rain[i].x, rain[i].y + j * STR_WIDTH, rain[i].str[j]);
//使用rain[i].y + j * STR_WIDTH输出一串随机字符
}
}
}
//字符移动
void GamePlay()
{
for (int i = 0; i < STR_NUM; i++)
{
rain[i].y += rain[i].speed;
if (rain[i].y - STR_SIZE * STR_WIDTH > HEIGTH)
{
rain[i].y = 0;
}
}
}
//变换字符
void ChangeCh()
{
for (int i = 0; i < STR_NUM; i++)
{
rain[rand() % STR_NUM].str[rand() % STR_SIZE] = CreateCh();
}
}
int main()
{
initgraph(WIDTH, HEIGTH); //打开图形化窗口
srand(GetTickCount()); //利用ASCII码值随机生成,GetTickCount();直接获取电脑开机到现在的毫秒数
GameInit();
DWORD t1, t2;
t1 = t2 = GetTickCount();
while (1)
{
BeginBatchDraw();
GameDraw();
ChangeCh();
if (t2 - t1 > 20) //使游戏下落延时
{
GamePlay();
t1 = t2;
}
t2 = GetTickCount();
EndBatchDraw();
//Sleep(20); //使整个程序延时
}
getchar();
closegraph(); //关闭图像化窗口
return 0;
}
三、运行效果
PS:可以自己试着运行一下,感受数字雨的动态效果
注意:
(1)如何解决字符串频闪问题
BeginBatchDraw();
EndBatchDraw();
(2)如何解决不兼容问题
方法:项目-属性-配置属性-常规-字符集-使用多字节字符集