你要的C语言实现雪花纷纷

本教程详细介绍了如何使用easyx库在C++环境中实现动态雪花效果及文字跑马灯功能,包括雪花的随机生成、移动以及文字的滚动显示,通过调整参数可以改变雪花的大小、速度和颜色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【版本1.0】雪花纷飞

前期准备:

  1. 首先需要去安装 easyx,请移步到官网 easyx官网
  2. 打开安装到对应的开发环境

在这里插入图片描述

#include <graphics.h>
#include <time.h>
#include <stdio.h>
#include <conio.h>
#include<vector>

using namespace std;

#define MAXSnow 2000	// 雪花总数
#define SCREEN_W 1000	// 窗口宽度
#define SCREEN_H 500	// 窗口高度
#define SOWN_RADIO 3	// 雪花大小
#define SNOW_SLEEP 0	// 雪花下落速度

struct Snow
{
	double	x;		//坐标
	int		y;
	double	step;	//速度
	int		color;	//颜色
	int radui;		//大小
};

Snow snow[MAXSnow];//保存所有雪花

// 初始化雪花
void InitStar(int i)
{
	snow[i].x = rand() % SCREEN_W;
	snow[i].y = rand() % SCREEN_H;
	snow[i].radui = rand() % SOWN_RADIO+1;
	snow[i].step = (rand() % 5000) / 1000.0 + 1;
	snow[i].color = (int)(snow[i].step * 255 / 6.0 + 0.5);	// 速度越快,颜色越亮
	snow[i].color = RGB(snow[i].color, snow[i].color, snow[i].color);
}

// 移动雪花
void MoveStar(int i)
{
	setlinecolor(RGB(0, 0, 0));
	setfillcolor(RGB(0, 0, 0));
	// 擦掉原来的
	fillcircle((int)snow[i].x, snow[i].y, snow[i].radui);

	// 计算新位置
	snow[i].y += snow[i].step;
	if (snow[i].y > SCREEN_H)	InitStar(i);

	// 画新雪花
	setfillcolor(snow[i].color);
	setlinecolor(snow[i].color);
	fillcircle((int)snow[i].x, snow[i].y, snow[i].radui);

}

// 主函数
int main()
{
	srand((unsigned)time(NULL));// 随机种子
	initgraph(SCREEN_W, SCREEN_H);// 创建绘图窗口

	
	// 初始化所有雪花
	for (int i = 0; i < MAXSnow; i++)
	{
		InitStar(i);
		snow[i].x = rand() % SCREEN_W;
	}

	// 绘制雪花,按任意键退出
	while (!_kbhit())
	{
		for (int i = 0; i < MAXSnow; i++)
			MoveStar(i);
		Sleep(SNOW_SLEEP);
	}
	
	
	closegraph();// 关闭绘图窗口
}

【版本1.1】 文字跑马灯

  • 【新增】加入文字跑马灯,任意输出文字
  • 【优化】使用 BeginBatchDraw 相关 API,使画面更细腻
    在这里插入图片描述

完整代码,如下:

#include <graphics.h>
#include <time.h>
#include <stdio.h>
#include <conio.h>
#include <vector>
using namespace std;

//雪花常量
#define MAX_SNOW_SIZE 2000	//雪花总数
#define SCREEN_W 1520		// 窗口宽度
#define SCREEN_H 800		// 窗口高度
#define SOWN_RADIO 5		// 雪花大小
#define SNOW_SLEEP 0		// 雪花下落速度

//文字常量
#define DIRECTION_LEFT 1	//方向:左
#define DIRECTION_RIGHT 2   //方向:右
#define DIRECTION_RIGHT 2   //方向:右
#define MAX_TEXT_SIZE 20    //最大文字字体
#define MAX_TEXT_COUNT 5    //同时显示的文字数量
#define TEXT_CONTENT_COUNT 15		//句子数量
#define TEXT_CONTENT_BUFFER 255     //每一句最大字符个数


/// <summary>
/// 雪花颗粒-结构体
/// </summary>
struct Snow
{
	double	x;		//坐标
	int		y;

	double	step;	//速度
	int		color;	//颜色
	int radui;		//大小
};

/// <summary>
/// 文字-结构体
/// </summary>
struct TextContent
{
	int x;		 //坐标
	int y;
	
	int textWidth;//句子长度
	int textHeight;

	double step;	//速度
	int color;		//颜色
	int size;		//文字大小
	int direction = DIRECTION_RIGHT;//方向:默认右边滚动到左边   
	WCHAR* content;	//文字内容
};


 /// <summary>
 /// 定义你想输出的优美句子,有没中国话,但是句子长度不能超过 TEXT_CONTENT_BUFFER 个字符,句子数量不能超过 TEXT_CONTENT_COUNT
 /// </summary>
 WCHAR CONTEXT_LIST[TEXT_CONTENT_COUNT][TEXT_CONTENT_BUFFER] = {
	_T("村长"),
	_T("圣诞节快乐"),
	_T("JsonLi"),
	_T("C语言"),
	_T("优快云"),
	_T("Easyx"),
	_T("欢迎大家!"),
	_T("兄弟,我歇逼了"),
	_T("年终总结"),
	_T("展望2022ヾ(◍°∇°◍)ノ゙"),
	_T("虎虎生威"),
	_T("寻寻觅觅,冷冷清清是岁月衰老的凄凉"),
	_T("梧桐更兼细雨,到黄昏、点点滴滴。"),
	_T("海内存知己,天涯若比邻。"),
	_T("新年新气象啊,兄弟们")
};

/// <summary>
/// 设定你想要的字体,window 系统同名字体即可
/// </summary>
LPCTSTR textType = (LPCTSTR) ("微软雅黑");


Snow snow[MAX_SNOW_SIZE];			//保存所有雪花
TextContent text[MAX_TEXT_SIZE];	//存储所有文字数据

///////////////////////////////////////////////////////////////// 雪花

/// <summary>
/// 对某一个雪花赋予新的属性值
/// </summary>
void setSnowValueByIndex(int index) {
	snow[index].x = rand() % SCREEN_W;
	snow[index].y = rand() % SCREEN_H;
	snow[index].radui = rand() % SOWN_RADIO + 1;
	snow[index].step = (rand() % 5000) / 1000.0 + 1;

	int color = (int)(snow[index].step * 255 / 6.0 + 0.5);	// 速度越快,颜色越亮
	snow[index].color = RGB(color, color, color);
}


/// <summary>
/// 初始化雪花
/// </summary>
void InitSnow()
{
	for (int i = 0; i < MAX_SNOW_SIZE; i++) {
		setSnowValueByIndex(i);
	}
}


/// <summary>
/// 移动雪花
/// </summary>
void MoveSnow()
{
	for (int i = 0; i < MAX_SNOW_SIZE; i++) {
		setlinecolor(RGB(0, 0, 0));
		setfillcolor(RGB(0, 0, 0));
		// 擦掉原来的
		fillcircle((int)snow[i].x, snow[i].y, snow[i].radui);

		// 计算新位置
		snow[i].y += snow[i].step;
		if (snow[i].y > SCREEN_H) {
			setSnowValueByIndex(i);
		}

		// 画新雪花
		setfillcolor(snow[i].color);
		setlinecolor(snow[i].color);
		fillcircle((int)snow[i].x, snow[i].y, snow[i].radui);
	}
}

/// <summary>
/// 初始化文字
/// </summary>
/// <param name="index"></param>
void setTextValueByIndex(int index) {
	text[index].x = SCREEN_W;
	text[index].y = rand() % SCREEN_H;
	text[index].size = rand() % MAX_TEXT_SIZE + 10;//最小文字大小 5 个像素
	text[index].step = (rand()%20)+2;
	text[index].direction = (rand() % 2) + 1;//随机生成 1、2
	text[index].content = CONTEXT_LIST[(rand() % TEXT_CONTENT_COUNT)];
	text[index].textWidth = textwidth(text[index].content);
	text[index].textHeight = textheight(text[index].content);


	int color = (int)(text[index].step * 255 / 6.0 + 0.5);	// 速度越快,颜色越亮
	text[index].color = RGB((rand() % 255), (rand() % 255), (rand() % 255));
}

/// <summary>
/// 初始化文字
/// </summary>
void InitText() {
	for (int i = 0; i < TEXT_CONTENT_COUNT; i++){
		setTextValueByIndex(i);
	}
}


/// <summary>
/// 移动文字
/// </summary>
void MoveText()
{
	for (int i = 0; i < TEXT_CONTENT_COUNT; i++) {

		// 擦掉原来的
		int textHeight = textheight(text[i].content);
		int textWidth = textwidth(text[i].content);
		settextcolor(RGB(0,0,0));
		settextstyle(text[i].size, text[i].size, textType);
		outtextxy(text[i].x, text[i].y, text[i].content);

		// 计算新位置
		text[i].x -= text[i].step;
		if ((text[i].x + textWidth) <= 0) {
			setTextValueByIndex(i);
		}
		
		settextcolor(text[i].color);
		settextstyle(text[i].size,0,textType);
		outtextxy(text[i].x, text[i].y, text[i].content);
	}
}



////////////////////////////////////////////////////

/// <summary>
/// 运行程序
/// </summary>
void runProgram() {
	// 初始化所有雪花
	InitSnow();
	// 初始化所有文字
	InitText();

	// 绘制雪花,按任意键退出
	while (!_kbhit())
	{
		BeginBatchDraw();
		MoveText();
		MoveSnow();
		FlushBatchDraw();
		Sleep(5);
	}

	EndBatchDraw();
}


/// <summary>
/// 主函数
/// </summary>
/// <returns></returns>
int main()
{
	srand((unsigned)time(NULL));	// 随机种子
	initgraph(SCREEN_W, SCREEN_H);	// 创建绘图窗口
	runProgram();					// 运行
	closegraph();					// 关闭绘图窗口
}


【版本1.2】背景音乐

更新中… …

评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值