C语言结构体练习-互动粒子仿真

线下的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];

利用结构体,可以逐步实现一个互动粒子仿真的小程序,效果如图所示。

v2-902bca582aed576879e5591d5fb4599a_b.jpg

1 静止小球初始化与显示

定义小球结构体Mover,包含颜色、坐标、速度、半径等成员变量,随机初始化结构体数组Mover movers[NUM_MOVERS],并在画面中显示。

v2-d1523fb5e1a649a462191395dc538e8b_b.jpg
#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();     // 与用户输入有关的更新
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值