栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C/C++项目源码——数字雨DigitalRain

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C/C++项目源码——数字雨DigitalRain

目录

一、函数段

二、完整代码

三、运行效果


一、函数段

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)如何解决不兼容问题

方法:项目-属性-配置属性-常规-字符集-使用多字节字符集

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/529672.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号