模拟小球弹跳

模拟小球弹跳。

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值