线下的C语言课,教完结构体的知识后,为了加深同学们对结构体知识的理解,带领大家一起实现了一个酷炫的互动粒子仿真小程序:
假设有15个粒子小球,要记录他们的速度、坐标,可以用数组实现:
float ball_x[15],ball_y[15]; // 小球的坐标
float ball_vx[15],ball_vy[15]; // 小球的速度
更好的方法,是利用结构体将一个物体的不同属性集合在一起,使代码更加简洁直观:
struct Ball
{
float x,y;
float vx,vy;
}
Ball balls[15];
利用结构体,可以逐步实现一个互动粒子仿真的小程序,效果如图所示。
1 静止小球初始化与显示
定义小球结构体Mover,包含颜色、坐标、速度、半径等成员变量,随机初始化结构体数组Mover movers[NUM_MOVERS],并在画面中显示。
#include <graphics.h>
#include <math.h>
#include <time.h>
#define WIDTH 1024 // 屏幕宽
#define HEIGHT 768 // 屏幕高
#define NUM_MOVERS 800 // 小球数量
// 定义小球结构
struct Mover
{
COLORREF color; // 颜色
float x, y; // 坐标
float vX, vY; // 速度
float radius; // 半径
};
// 定义全局变量
Mover movers[NUM_MOVERS]; // 小球数组
void startup()
{
// 设置随机种子
srand((unsigned int)time(NULL));
// 初始化小球数组
for (int i = 0; i < NUM_MOVERS; i++)
{
movers[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
movers[i].x = rand()%WIDTH;
movers[i].y = rand()%HEIGHT;
movers[i].vX = float(cos(float(i))) * (rand() % 34);
movers[i].vY = float(sin(float(i))) * (rand() % 34);
movers[i].radius = (rand() % 34)/15.0;
}
initgraph(WIDTH, HEIGHT);
BeginBatchDraw();
}
void show()
{
clearrectangle(0,0,WIDTH-1,HEIGHT - 1); // 清空画面全部矩形区域
for(int i = 0; i < NUM_MOVERS; i++)
{
// 画小球
setcolor(movers[i].color);
setfillstyle(movers[i].color);
fillcircle(int(movers[i].x + 0.5), int(movers[i].y + 0.5), int(movers[i].radius + 0.5)); // 四舍五入
}
FlushBatchDraw();
Sleep(2);
}
void updateWithoutInput()
{
}
void updateWithInput()
{
}
void gameover()
{
EndBatchDraw();
closegraph();
}
int main()
{
startup(); // 数据初始化
while (1) // 游戏循环执行
{
show(); // 显示画面
updateWithoutInput(); // 与用户输入无关的更新
updateWithInput(); // 与用户输入有关的更新