当前位置: 首页 > news >正文

C/C++小宇宙代码

系列目录

序号直达链接
1C/C++爱心代码
2C/C++跳动的爱心
3C/C++李峋同款跳动的爱心代码
4C/C++满屏飘字表白代码
5C/C++大雪纷飞代码
6C/C++烟花代码
7C/C++黑客帝国同款字母雨
8C/C++樱花树代码
9C/C++奥特曼代码
10C/C++圣诞树代码
11C/C++俄罗斯方块
12C/C++贪吃蛇
13C/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 函数关闭图形窗口,释放图形资源。

总结

整个代码的功能是通过随机生成星星的参数,然后在屏幕上持续更新每颗星星的下落位置,模拟出星星在夜空中不断坠落的效果。

写在后面

我是一只有趣的兔子,感谢你的喜欢!


http://www.mrgr.cn/news/60119.html

相关文章:

  • 道路车辆功能安全 ISO 26262标准(9-4)—面向汽车安全完整性等级 (ASIL) 和安全的分析
  • 清华面试文稿
  • 平衡控制——直立环——速度环
  • 基于Datawhale开源量化投资学习指南(11):LightGBM在量化选股中的优化与实战
  • android studio编译错误提示无法下载仓库
  • stm32单片机基于rt-thread 的 littlefs 文件系统 的使用
  • 梦笔记20241028
  • AngularJS 指令
  • python处理文件和图片
  • Golang | Leetcode Golang题解之第516题最长回文子序列
  • Flux 开源替代,他来了——Liberflux
  • spring-第十二章 GoF代理模式
  • Bootstrap 5 弹出框
  • MSR寄存器独有的还是共享的
  • Java最全面试题->数据库/中间件->RocketMQ面试题
  • 后台管理系统的通用权限解决方案(三)SpringBoot整合Knife4j生成接口文档
  • 问:SQL中的通用函数及用法?
  • AI学习指南自然语言处理篇-Transformer模型的实践
  • fastjson解析null值问题: 解决 null的属性不显示问题
  • 如何从示波器上得到时间常数