目录
一、函数段
二、完整代码
三、运行效果
一、函数段
1、显示图形界面
(1)安装EasyX图形库,官网地址:EasyX Graphics Library for C++
(2)图形库头文件
#include
(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
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系统 #include //适用于Linux系统 Sleep(20); //使整个程序延时
(2)图形化界面的打开与关闭
initgraph(WIDTH, HEIGTH); //打开图形化窗口 closegraph(); //关闭图像化窗口二、完整代码
#include三、运行效果#include #include //图形化界面头文件 #include #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)如何解决不兼容问题
方法:项目-属性-配置属性-常规-字符集-使用多字节字符集
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)