#include<stdio.h>
#include<easyx.h>
#include<math.h>
#include<time.h>
#define FoodNum 200
#define PeerNum 20
#define distance(b1,b2) \
sqrt((b1.x-b2.x)*(b1.x-b2.x)+(b1.y-b2.y)*(b1.y-b2.y))
void chase(struct Ball* chase, struct Ball* run);
struct Ball
{
int x;
int y;
float r;
bool isLive;
COLORREF color;
};
struct Ball foods[FoodNum];
struct Ball gamer = { 50,50,10 };
struct Ball peers[PeerNum];
void init()
{
for (size_t i = 0; i < FoodNum; i++)
{
foods[i].x = rand() % getwidth();
foods[i].y = rand() % getheight();
foods[i].r = rand() % 5 + 1;
foods[i].isLive = true;
foods[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
}
for (size_t i = 0; i < PeerNum; i++)
{
peers[i].x = rand() % getwidth();
peers[i].y = rand() % getheight();
peers[i].r = rand() % 10 + 5;
peers[i].isLive = true;
peers[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
}
}
void draw()
{
for (size_t i = 0; i < FoodNum; i++)
{
if (foods[i].isLive)
{
setfillcolor(foods[i].color);
solidcircle(foods[i].x, foods[i].y, foods[i].r);
}
}
for (size_t i = 0; i < PeerNum; i++)
{
if (peers[i].isLive)
{
setfillcolor(peers[i].color);
solidcircle(peers[i].x, peers[i].y, peers[i].r);
}
}
setfillcolor(GREEN);
solidcircle(gamer.x, gamer.y, gamer.r);
}
void keyEvent(int speed)
{
if (GetAsyncKeyState(VK_UP) && gamer.y - gamer.r >= 0)
{
gamer.y-=speed;
}
if (GetAsyncKeyState(VK_DOWN) && gamer.y + gamer.r <= getheight())
{
gamer.y+=speed;
}
if (GetAsyncKeyState(VK_LEFT) && gamer.x - gamer.r >= 0)
{
gamer.x-=speed;
}
if (GetAsyncKeyState(VK_RIGHT) && gamer.x + gamer.r <= getwidth())
{
gamer.x+=speed;
}
}
void eatFood()
{
for (size_t i = 0; i < FoodNum; i++)
{
if (!foods[i].isLive)
continue;
if (distance(foods[i], gamer) < gamer.r)
{
foods[i].isLive = false;
gamer.r += foods[i].r / 4.0;
}
}
}
void peerMove()
{
for (size_t i = 0; i < PeerNum; i++)
{
if (!peers[i].isLive)
continue;
float 距离 = getheight();
for (size_t k = 0; k < PeerNum; k++)
{
if (peers[k].isLive && peers[i].r > peers[k].r &&
distance(peers[k], peers[i]) < 距离)
{
距离 = distance(peers[k], peers[i]);
chase(&peers[i], &peers[k]);
}
}
}
}
void peerEat()
{
for (size_t i = 0; i < PeerNum; i++)
{
if (!peers[i].isLive)
continue;
for (size_t k = 0; k < PeerNum; k++)
{
if (peers[k].isLive && i != k &&
peers[i].r > peers[k].r &&
distance(peers[i], peers[k]) < peers[i].r)
{
peers[i].r += peers[k].r / 4;
peers[k].isLive = false;
}
}
for (size_t m = 0; m < FoodNum; m++)
{
if (foods[i].isLive && distance(peers[i], foods[m]) < peers[i].r)
{
foods[m].isLive = false;
}
}
}
}
int main()
{
initgraph(1024, 640);
srand(time(NULL));
setbkcolor(WHITE);
cleardevice();
init();
BeginBatchDraw();
while (true)
{
cleardevice();
draw();
keyEvent(5);
eatFood();
peerMove();
peerEat();
Sleep(10);
FlushBatchDraw();
}
EndBatchDraw();
getchar();
return 0;
}
void chase(struct Ball* chase, struct Ball* run)
{
if (chase->x < run->x)
{
chase->x++;
}
else
{
chase->x--;
}
if (chase->y < run->y)
{
chase->y++;
}
else
{
chase->y--;
}
}