模拟小球弹跳。
#include<bits/stdc++.h>
#include<windows.h>
const int MAX_BALLS=10;//Maximum number of balls==10
const double GRAVITY=9.8;//Gravity acceleration==9.8
const int MAX_HEIGHT=50;//Maximum ball bounce height==20
const int MAX_WIDTH=60;//Screen width==60
const int MAX_SPEED_X=4;//Horizontal ball speed range==4
const int MAX_SPEED_Y=2;//Vertical ball speed range==2
struct Ball{
int x,y;
int radius;
double vx,vy;
};void clearScreen(){system("cls");}
void sleep(int milliseconds){
Sleep(milliseconds);
}void printBall(const Ball& ball){
std::cout<<"\033["<<ball.y<<";"<<ball.x<<"H";
std::cout<<"O";
}void updateBall(Ball& ball,const Ball* otherBalls,int numBalls){
ball.x+=ball.vx,ball.y+=ball.vy;
if(ball.x<=0||ball.x>=MAX_WIDTH)ball.vx=-ball.vx;
if(ball.y<=0||ball.y>=MAX_HEIGHT)ball.vy=-ball.vy;
for(int i=0;i<numBalls;i++){
const Ball& otherBall=otherBalls[i];
if(&ball!=&otherBall){
int dx=ball.x-otherBall.x;
int dy=ball.y-otherBall.y;
int distance=sqrt(dx*dx+dy*dy);
if(distance<(ball.radius+otherBall.radius)){
ball.vx=-ball.vx;
ball.vy=-ball.vy;
break;
}
}
}ball.vy+=GRAVITY;
}void Hide(){
HANDLE h_GAME =GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cursor_info;
GetConsoleCursorInfo(h_GAME,&cursor_info);
cursor_info.bVisible=false;
SetConsoleCursorInfo(h_GAME,&cursor_info);
}int main(){
Hide();
srand(static_cast<unsigned int>(time(0)));
Ball balls[MAX_BALLS];
for(int i=0;i<MAX_BALLS;i++){
balls[i].x=rand()%MAX_WIDTH;
balls[i].y=rand()%MAX_HEIGHT;
balls[i].vx=rand()%(MAX_SPEED_X*2)-MAX_SPEED_X;
balls[i].vy=rand()%(MAX_SPEED_Y*2)-MAX_SPEED_Y;
balls[i].radius=rand()%3+1;
}while(1){
clearScreen();
for(int i=0;i<MAX_BALLS;i++){
printBall(balls[i]);
updateBall(balls[i],balls,MAX_BALLS);
}sleep(5);
}return 0;
}