[C] 纯文本查看 复制代码 #include <graphics.h>//包含EGE的头文件
#include <time.h>//包含随机数,时间函数
#include<bits/stdc++.h>
using namespace std;
int width =800;
int height =600;
int num;
int count1;
int time_count;
struct ballon{
int x;//x坐标
int y;//y坐标
int vx;//x向速度
int vy;//y向速度
int radius;//半径
int health; //健康 1
}ball[1000];
int randx(int min,int max)
{
int r =rand()%(max-min+1)+min;
return r;
}
void startup()//初始化 函数
{
cout<<"请输入总人数(不大于1000):";
cin>>num;
srand(time(0));//随机种子函数
for(int i =0;i<num;i++)
{
ball[i].x = randx(30,width-30);
ball[i].y = randx(30,height-30);
ball[i].vx = randx(-2,2);
ball[i].vy = randx(2,5);
ball[i].radius = randx(5,10);
ball[i].health = 1;
}
ball[0].health = 0;//0号病人
count1=1;
initgraph(width, height); //初始化图形界面
setcolor(RED); //设置画图线为红色
setbkcolor(WHITE);//设置背景颜色为白色
setfillcolor(GREEN);//设置填充颜色为红色
setfont(25,0,"幼圆");//(字体高度,字体宽度(为0即为自适应),字形)设置字体为25,幼圆字体
setbkmode(TRANSPARENT); //设置文字背景色为透明(默认为有背景色)
}
void update() //更新函数
{
for(int i =0;i<num;i++)
{
ball[i].x += ball[i].vx;
ball[i].y += ball[i].vy;
if(ball[i].x<=ball[i].radius || ball[i].x>=width-ball[i].radius)
ball[i].vx = -ball[i].vx;
if(ball[i].y<=ball[i].radius || ball[i].y>=height-ball[i].radius)
ball[i].vy = -ball[i].vy;
}
}
void drawball() //绘制小球
{
cleardevice();
for(int i=0;i<num;i++)
{
if(ball[i].health == 0) setfillcolor(RED);
else setfillcolor(GREEN);
fillellipse(ball[i].x, ball[i].y, ball[i].radius, ball[i].radius); //画一个实心圆
}
xyprintf(20,20,"病人数量:%d",count1);//格式化输出文字
xyprintf(20,60,"耗时:%d",time_count);//格式化输出文字
Sleep(10);
time_count+=10;
}
int dis(int a,int b)
{
int t1=pow(abs(ball[a].x-ball[b].x),2);
int t2=pow(abs(ball[a].y-ball[b].y),2);
return sqrt(t1+t2);
}
void is_ill()
{
for(int i=0;i<num;i++)
for(int j=i;j<num;j++)
{
if((ball[i].health+ball[j].health==1)&& //或者用异或^
(dis(i,j)<(ball[i].radius+ball[j].radius)))//距离够近
{
int ran_a= randx(0,100);//rand()%100
if(ran_a<30)//戴口罩
{
ball[i].health = 0;//得病
ball[j].health = 0;
count1++;
}
}
}
// for(int i=0;i<num;i++)
// for(int j=i+1;j<num;j++)
// {
// if(ball[i].health+ball[j].health==1)
// {
// int x=abs(ball[i].x-ball[j].x);
// int y=abs(ball[i].y-ball[j].y);
// int s=sqrt(pow(x,2)+pow(y,2));
// if(s<=(ball[i].radius+ball[j].radius))
// {
// ball[i].health = 0;//得病
// ball[j].health = 0;
// }
// }
// }
}
int main()
{
startup();//初始化
while(1)
{
update(); //更新数据
is_ill();//判断生病
drawball();//绘制小球
if(count1==num) break;
}
getch();
return 0;
}
|