系列目录
序号 | 直达链接 |
1 | C/C++爱心代码 |
2 | C/C++跳动的爱心 |
3 | C/C++李峋同款跳动的爱心代码 |
4 | C/C++满屏飘字表白代码 |
5 | C/C++大雪纷飞代码 |
6 | C/C++烟花代码 |
7 | C/C++黑客帝国同款字母雨 |
8 | C/C++樱花树代码 |
9 | C/C++奥特曼代码 |
10 | C/C++圣诞树代码 |
11 | C/C++俄罗斯方块 |
12 | C/C++贪吃蛇 |
13 | C/C++小宇宙代码 |
目录
系列目录
写在前面
完整代码
代码分析
写在后面
写在前面
C语言实现小宇宙的完整代码。
环境:C/C++
软件:Visual Studio 2022
安装教程:最新Visual Studio下载安装以及C语言环境搭建教程(含C语言入门教程)-CSDN博客
插件:EasyX
EasyX是一个专为C++初学者和爱好者设计的图形库。该库以简洁易用、功能实用为宗旨,通过封装Windows GDI接口,极大降低了C++编程中图形界面设计的复杂度,使得用户能够快速上手并实现各类图形图像处理任务。
EasyX提供了一系列丰富的API函数,涵盖了绘制基本图形(如线段、圆形、矩形等)、填充图形、显示文本、加载与保存图片、颜色设置以及鼠标键盘事件处理等功能。通过简单的函数调用,开发者可以高效地进行2D图形绘制和交互式程序设计。
总的来说,EasyX以其友好的学习曲线和高效的图形处理能力,极大地激发了C++初学者对计算机图形学的兴趣,是广大编程入门者和教育领域广泛采用的一款图形库工具。
下载安装EasyX
1.进入EasyX官网,点击下载按钮开始下载
2.下载完成后进入下载目录,双击.exe文件开始安装
3.按如下步骤进行安装即可
完整代码
#include <graphics.h>
#include <time.h>
#include <stdio.h>
#include <conio.h>
#include <vector>
using namespace std;
#define MAXSnow 99 // 设置星球总数
struct Snow
{
double x; // 星球横坐标
int y; // 星球纵坐标
int r; // 星球的大小
double speed; // 星球下落速度
int color; // 星球的颜色
};
Snow snow[MAXSnow]; // 保存所有星球
// 初始化星球
void InitSnow(int i, int width, int height)
{
snow[i].x = rand() % width-width;
snow[i].y = rand() % height;
snow[i].r = rand() % 4 + 1;
snow[i].speed = (rand() % 1000) / 1000.0 + 0.5;
snow[i].color = (int)(255); // 设置星球颜色
snow[i].color = RGB(snow[i].color, snow[i].color, snow[i].color);
}
// 星球的下落函数
void MoveSnow(int i, int width, int height)
{
setlinecolor(RGB(0, 0, 0));
setfillcolor(RGB(0, 0, 0));
// 删除原来的星球
fillcircle((int)snow[i].x, snow[i].y, snow[i].r);
// 计算星球新位置
snow[i].x += snow[i].speed;
if (snow[i].x > width) InitSnow(i, width, height);
// 画新星球
setfillcolor(snow[i].color);
setlinecolor(snow[i].color);
fillcircle((int)snow[i].x, snow[i].y, snow[i].r);
}
// 主函数
int main()
{
srand((unsigned)time(NULL));// 设置随机种子
int ScreenWidth = GetSystemMetrics(SM_CXSCREEN);
int ScreenHeight = GetSystemMetrics(SM_CYSCREEN);
initgraph(ScreenWidth, ScreenHeight);// 创建绘图窗口
HWND hwnd = GetHWnd(); // 获取绘图窗口句柄
int x = 0; // 窗口左上角横坐标
int y = 0; // 窗口左上角纵坐标
SetWindowPos(hwnd, HWND_TOP, x, y, 0, 0, SWP_NOSIZE); // 设置窗口位置
// 初始化所有星球
for (int i = 0; i < MAXSnow; i++)
{
InitSnow(i, ScreenWidth, ScreenHeight);
snow[i].x = rand() % ScreenWidth;
}
// 绘制星球,按任意键退出
while (!_kbhit())
{
for (int i = 0; i < MAXSnow; i++)
MoveSnow(i, ScreenWidth, ScreenHeight);
Sleep(0);
}
closegraph();// 关闭绘图窗口
}
代码分析
这段代码的功能是使用 C++ 和图形库创建一个动画效果,模拟夜空中星星从屏幕顶部向下“坠落”的动态效果。下面从代码的结构和具体函数的实现角度详细分析每个部分的作用和原理。
1. 引入库和定义常量
首先,代码导入了 graphics.h
(用于图形操作),time.h
(用于获取当前时间以初始化随机数种子),stdio.h
和 conio.h
(用于控制台输入输出操作),以及 <vector>
(用于创建动态数组)。接着,用 #define
定义了一个常量 MAXSnow
,它的值为 99,表示星星的数量上限。这个常量在定义和使用时可能会影响动画的流畅性和复杂度。
2. 定义结构体 Snow
代码定义了一个 Snow
结构体,用于保存单个星星的各种属性:
-
x
:星星的横坐标。 -
y
:星星的纵坐标。 -
r
:星星的半径。 -
speed
:星星的下落速度。 -
color
:星星的颜色,使用整数表示。
结构体定义的目的是将星星的属性进行组合,以便于统一管理和操作。
3. 初始化星星的函数 InitSnow
InitSnow
函数用于初始化星星的各项属性。参数 i
表示第 i
个星星,width
和 height
分别是屏幕的宽度和高度。函数中的主要操作包括:
-
x
的取值为随机值rand() % width-width
,产生一个在屏幕范围内的负值x
坐标,使星星从屏幕左边缘外的位置开始显示。 -
y
的取值为随机高度值rand() % height
,使星星的初始纵坐标也随机。 -
r
的值为rand() % 4 + 1
,即星星的大小在 1 到 4 的范围内变化。 -
speed
的取值为(rand() % 1000) / 1000.0 + 0.5
,保证星星下落速度在0.5
到1.5
之间。 -
color
的初始值为255
,然后调用RGB
函数生成灰度值,使星星呈现白色或灰色的效果。
4. 星星的下落函数 MoveSnow
MoveSnow
函数用于更新星星位置,从而产生下落效果。函数内的操作顺序为:
-
设置填充颜色和线条颜色为黑色(即背景色),删除上次绘制的星星位置。
-
更新星星的
x
坐标,将其增加一个speed
值。如果x
超过屏幕宽度,则说明星星已经超出屏幕右边缘,这时重新初始化该星星的参数,以实现循环显示效果。 -
重新绘制星星,新星星的颜色使用
InitSnow
设置的color
值。
这种方式通过快速更新星星的位置,再用背景色覆盖旧位置并重新绘制新的位置,达到流畅的动态下落效果。
5. 主函数 main
main
函数中包含了整个动画的初始化和循环逻辑:
-
使用
srand
函数初始化随机数种子,使星星的初始位置、速度、大小等属性随机分布。 -
获取屏幕宽度和高度
ScreenWidth
和ScreenHeight
。 -
调用
initgraph
函数,创建图形窗口,并设置窗口大小与屏幕一致。 -
使用
GetHWnd()
获取窗口句柄hwnd
,然后调用SetWindowPos
将窗口位置设置为屏幕左上角(0, 0
),保证窗口全屏显示。
在 for
循环中,InitSnow
函数被依次调用,初始化所有星星。每个星星的 x
坐标在 ScreenWidth
范围内随机取值,确保初始位置不同,从而使动画效果更加自然。
6. 动画循环
while (!_kbhit())
是一个无限循环,持续更新星星的位置,实现动画效果。_kbhit
函数来自 conio.h
,在检测到按键按下时会返回 true
,从而跳出循环。for
循环遍历每颗星星并调用 MoveSnow
函数更新它的位置,实现星星在屏幕上持续下落的效果。
代码中 Sleep(0)
使 CPU 空闲,让出一些时间片以降低资源消耗,但在实际效果中可能需要调整更长时间的延迟,如 Sleep(10)
,避免动画更新过快。
7. 关闭窗口
循环结束后,调用 closegraph
函数关闭图形窗口,释放图形资源。
总结
整个代码的功能是通过随机生成星星的参数,然后在屏幕上持续更新每颗星星的下落位置,模拟出星星在夜空中不断坠落的效果。
写在后面
我是一只有趣的兔子,感谢你的喜欢!