赞
踩
目录
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)如何解决不兼容问题
方法:项目-属性-配置属性-常规-字符集-使用多字节字符集
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。