现在需要模拟圆的相互碰撞。
描述如下:在一个平面上,有n个圆,在做随机运动,一旦两个圆碰到一块,就同时消失,并且在消失的时候,会输出下列信息:圆的编号,位置是什么。这样的一个系统,直到所有的都消失,或者只剩下一个为止。
#include <iostream>
#include <cmath>
#include <time.h>
using namespace std;
const int Left=0;
const int Right=100;
const int Top=0;
const int Bottom=100; //定义圆运动的平面
class circle{
int iPosX;
int iPosY; //圆心的坐标
double dRadius; //圆的半径
int iDirX;
int iDirY; //圆运动的方向
int iSpeed; //圆运动的速度
int iCID; //圆的生成编号
public:
static int iCirnum; //记录现有几个圆存在
circle(int,int,double);
~circle();
int getPosX() { return iPosX; }
int getPosY() { return iPosY; } //获取圆的坐标
double getRadius() { return dRadius; } //获取圆的半径
void Move(int speed); //圆在平面内运动
void OutputState(); //输出圆当前的状态
};
int circle::iCirnum=0;
circle::circle(int x,int y,double r)
{
iPosX=x;
iPosY=y;
dRadius=r;
iDirX=1;
iDirY=1;
iCID=++iCirnum;
cout<<"我是"<<iCID<<"号圆,"<<"我在这里被生成,"<<"我的位置是("<<iPosX<<","<<iPosY<<"),我的半径为"<<dRadius<<"。"<<endl;
}
circle::~circle()
{
iCirnum--;
cout<<"我是"<<iCID<<"号圆,我在此被撞毁。我的位置是:("<<iPosX<<","<<iPosY<<")。"<<endl;
}
void circle::Move(int speed)
{
iPosX+=iDirX*speed;
if(iPosX<=Left||iPosX>=Right)
{
iPosX-=iDirX*speed;
iDirX*=-1; //如果圆的坐标出了平面的范围,则向反方向运动
}
iPosY+=iDirY*speed;
if(iPosY<=Top||iPosY>=Bottom)
{
iPosY-=iDirY*speed;
iDirY*=-1;
}
}
void circle::OutputState()
{
cout<<"我是"<<this->iCID<<"号圆,我现在的位置是:("<<this->iPosX<<","<<this->iPosY<<")。"<<endl;
}
class Platform{
bool *bLiveCir; //记录圆是否存在,true表示存在,false表示已被销毁。
circle **cir;
int CheckHit(circle &,circle &); //检测两个圆是否相撞
void CreateCircle(int); //生成一个圆
void Delete(circle *); //删除一个圆
void LastLive(); //输出最后剩下的一个圆的信息
int iCirnumber; //一共生成的圆的个数
public:
Platform(int);
void Run();
};
Platform::Platform(int a)
{
iCirnumber=a;
cir=new (circle *[a]);
bLiveCir=new bool[a];
for(int i=0;i<a;i++) //生成5个圆,并且将存在标识置为true.
{
CreateCircle(i);
bLiveCir[i]=true;
}
system("pause");
cout<<endl;
}
int Platform::CheckHit(circle &c1,circle &c2)
{
double d=sqrt(pow((c1.getPosX()-c2.getPosX()),2)+pow((c1.getPosY()-c2.getPosY()),2));
if(d<=c1.getRadius()+c2.getRadius()) //若两个圆的圆心之间的距离小于半径的和,则两圆相交
{
return 1;
}
return 0;
}
void Platform::CreateCircle(int i)
{
int x=int(rand()/double(RAND_MAX)*(Right-Left)+Left);
int y=int(rand()/double(RAND_MAX)*(Bottom-Top)+Top); //生成随机的初始坐标
double r=rand()/double(RAND_MAX)*5; //生成随机的半径
cir[i]=new circle(x,y,r);
}
void Platform::Delete(circle *c)
{
delete c;
}
void Platform::Run()
{
int i,j;
while(circle::iCirnum>1)
{
for(i=0;i<iCirnumber;i++)
if(bLiveCir[i])
{
int speed=int(rand()/double(RAND_MAX)*50);
cir[i]->Move(speed);
}
for(i=0;i<iCirnumber-1;i++)
for(j=i+1;j<iCirnumber;j++)
if(bLiveCir[i]&&bLiveCir[j])
if(CheckHit(*cir[i],*cir[j])==1)
{
bLiveCir[i]=false;
bLiveCir[j]=false;
Delete(cir[i]);
Delete(cir[j]);
cout<<endl;
system("pause");
cout<<endl;
break;
}
}
if(circle::iCirnum==1) //如果还有一个圆,则输出剩下一个圆的信息。
LastLive();
}
void Platform::LastLive()
{
for(int i=0;i<iCirnumber;i++)
{
if(bLiveCir[i])
{
cout<<endl<<"现在还剩下一个圆:"<<endl;
cir[i]->OutputState();
}
}
}
int main()
{
srand((unsigned)time(NULL));
int a;
cout<<"请输入圆的个数:";
cin>>a;
Platform p(a);
p.Run();
cout<<endl;
return 0;
}