控制台字符动画-小球弹跳
// 清除屏幕
#define CLEAR() printf("\033[2J")// 上移光标
#define MOVEUP(x) printf("\033[%dA", (x))// 下移光标
#define MOVEDOWN(x) printf("\033[%dB", (x))// 左移光标
#define MOVELEFT(y) printf("\033[%dD", (y))// 右移光标
#define MOVERIGHT(y) printf("\033[%dC",(y))// 定位光标
#define MOVETO(x,y) printf("\033[%d;%dH", (x), (y))// 光标复位
#define RESET_CURSOR() printf("\033[H")// 隐藏光标
#define HIDE_CURSOR() printf("\033[?25l")// 显示光标
#define SHOW_CURSOR() printf("\033[?25h")//反显
#define HIGHT_LIGHT() printf("\033[7m")
#define UN_HIGHT_LIGHT() printf("\033[27m")
// 代码来源 https://blog.csdn.net/qq_40797283/article/details/132315990
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <thread>
#include "cursor.h"using namespace std;
using namespace std::chrono_literals;#define G 9.8fstruct PosInfo {float x;float y;
};struct AccelerateInfo {float accelerateX;float accelerateY;
};struct VelocityInfo {float velocityX;float velocityY;
};constexpr int32_t BoxWidth = 60;
constexpr int32_t BoxHeight = 20;
constexpr chrono::duration<long double> Time = 10ms;
constexpr float CoefficientRestitution = 0.9f;
PosInfo curPos{10.0f, .0f};
AccelerateInfo curAccelerate{.0f, G};
VelocityInfo curVelocity {3.0f, .0f};void PrintBoxAndBall(int32_t width, int32_t height) {for(int32_t i =0;i<height;i++) {printf(i==height - 1 ? "└" : "│");for(int32_t j=1;j<width-1;j++) {if (i == (int32_t)curPos.y && j == (int32_t)curPos.x) {putchar('*');} else {printf(i==height - 1 ? "─" : " ");}}printf(i==height - 1 ? "┘\n" : "│\n");}
}void UpdateBallPositionInfo(float time) {curVelocity.velocityX += curAccelerate.accelerateX * time;curVelocity.velocityY += curAccelerate.accelerateY * time;curPos.x += curVelocity.velocityX * time;curPos.y += curVelocity.velocityY * time;if (curPos.x > BoxWidth) {curPos.x = BoxWidth * 2 - curPos.x;curVelocity.velocityX = -curVelocity.velocityX * CoefficientRestitution;} else if (curPos.x < .0f) {curPos.x = -curPos.x;curVelocity.velocityX = -curVelocity.velocityX * CoefficientRestitution;}if (curPos.y > BoxHeight) {curPos.y = BoxHeight * 2 - curPos.y;curVelocity.velocityY = -curVelocity.velocityY * CoefficientRestitution;}printf("vx:%6.2f, vy:%6.2f, x:%6.2f, y:%6.2f\n", curVelocity.velocityX, curVelocity.velocityY, curPos.x, curPos.y);
}int main() {HIDE_CURSOR();while(1) {PrintBoxAndBall(BoxWidth, BoxHeight);UpdateBallPositionInfo(Time.count());MOVEUP(BoxHeight + 1);std::this_thread::sleep_for(Time);}SHOW_CURSOR();return 0;
}