#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#define CONSOLEWIDTH 80 // 控制台宽度
#define CONSOLEHEIGHT 40 // 控制台高度
// 坐标结构
typedef struct _point
{
short X;
short Y;
} Point;
// 控制台相关
/// @brief 设置光标位置,起点从1开始
/// @param nCols 列
/// @param nRows 行
void MoveCursorTo(int nCols, int nRows)
{
COORD crdLocation = {nCols, nRows};
HANDLE HOutput = GetStdHandle(STD_OUTPUT_HANDLE); // 获取标准输出的句柄
SetConsoleCursorPosition(HOutput, crdLocation); // 设置光标位置
}
/// @brief 设置控制台大小
/// @param uCol 列
/// @param nRows 行
void SetConsoleSize(unsigned uCol, unsigned nRows)
{
char cmd[64];
sprintf(cmd, "mode con cols=%d lines=%d", uCol, nRows);
system(cmd);
}
//
#define NODECOUNT 6 // 小球数量
#define STARTNUM 4 // 小球大小
void printNode(Point pos)
{
int i;
MoveCursorTo(pos.X, pos.Y);
for (i = 0; i < STARTNUM; i++)
printf("*");
MoveCursorTo(pos.X, pos.Y + 1);
printf("*");
for (i = 0; i < STARTNUM - 2; i++)
printf(" ");
printf("*");
MoveCursorTo(pos.X, pos.Y + 2);
for (i = 0; i < STARTNUM; i++)
printf("*");
}
void printMid(Point pos)
{
for (int i = 0; i < NODECOUNT - 1; i++)
{
printNode(pos);
pos.X += STARTNUM + 1;
}
}
int main()
{
SetConsoleSize(CONSOLEWIDTH, CONSOLEHEIGHT);
Point lpos, rpos, orign;
bool isLeft = true; // 左球标记
orign.X = (CONSOLEWIDTH - STARTNUM * NODECOUNT) / 2; // 居中输出
orign.Y = (CONSOLEHEIGHT - 5) / 2;
int step = 5; //
int l = 0, r = 0, flag = 1;
lpos = rpos = orign;
lpos.X -= (STARTNUM + 1) + step; // 左球起始定位
lpos.Y -= step;
rpos.X += (STARTNUM + 1) * (NODECOUNT - 2); // 右球起始定位
while (true)
{
if (_kbhit()) // 按任意键退出
break;
system("cls");
if (isLeft)
{ // 左球运动
lpos.X += flag;
lpos.Y += flag;
printNode(lpos);
printMid(orign);
l += flag;
if (l == step) // 左球碰撞
{
isLeft = false;
flag = -1; // 标记右球起始运动
}
if (l == 0) // 左球到达顶点
flag = 1;
}
else
{
rpos.X += -flag;
rpos.Y += flag;
printNode(rpos);
printMid(lpos);
r += -flag;
if (r == step) // 右球到达顶点
flag = 1;
if (r == 0) // 右球碰撞
{
isLeft = true;
flag = -1;
}
}
Sleep(300);
}
return 0;
}
试一下这个,解决问题的话,记得采纳哦
#include <stdio.h>
#include <math.h>
#define G 9.8
#define DT 0.01
#define N_PARTICLES 3
#define N_STEPS 1000
typedef struct {
double mass;
double position;
double velocity;
} Particle;
void initialize_particles(Particle *particles, int n) {
for (int i = 0; i < n; i++) {
particles[i].mass = 1.0; // 设置粒子的质量
particles[i].position = 0.0; // 设置粒子的初始位置
particles[i].velocity = 0.0; // 设置粒子的初始速度
}
}
void update_particles(Particle *particles, int n) {
for (int i = 0; i < n; i++) {
double force = G * particles[i].mass; // 计算重力
particles[i].velocity += force * DT / particles[i].mass; // 更新速度
particles[i].position += particles[i].velocity * DT; // 更新位置
}
}
int main() {
Particle particles[N_PARTICLES];
initialize_particles(particles, N_PARTICLES);
for (int i = 0; i < N_STEPS; i++) {
update_particles(particles, N_PARTICLES);
}
for (int i = 0; i < N_PARTICLES; i++) {
printf("Particle %d: position = %f, velocity = %f\n", i, particles[i].position, particles[i].velocity);
}
return 0;
}
首先定义向量的结构体及其有关运算。
然后定义质点结构体,包括质量,速度两个向量。
然后用一个循环更新各个小球的状态:
通过质量求出重力,通过速度求出向心力,再通过合力求出加速度,再更新速度,再更新位置。
碰撞的时候根据动量守恒定律和动能守恒定律求出其他小球的速度。