#include<stdio.h>
#include<conio.h>
#include<time.h>
#include<math.h>
#include<wchar.h>
#include<graphics.h>
#define WIDTH 1024
#define HEIGHT 576
#define MAPW (WIDTH*4)
#define MAPH (HEIGHT*4)
#define AINUM 100
#define FNUM 2000
#define DISTANCE(x1,y1,x2,y2) (sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)))
struct FOOD {
bool eat;
COLORREF color;
int x, y;
char type;
};
struct BALL {
bool life;
COLORREF color;
int x, y;
float r;
};
FOOD food[FNUM];
BALL mover = { 1,RGB(0,0,0),0,0,0 };
BALL ai[AINUM] = { 1,RGB(0,0,0),0,0,0 };
void move(BALL* ball);
void draw();
void start();
void setall();
void AI();
void Food();
void delay(DWORD ms);
DWORD* pBuffer;
int eaten = 0;
int ai_eaten = 0;
float asp = 1;
float Time = 0;
int main() {
initgraph(WIDTH, HEIGHT);
start();
setall();
BeginBatchDraw();
while (true) {
move(&mover);
AI();
Food();
draw();
FlushBatchDraw();
delay(20);
}
}
void move(BALL* ball) {
if (ball->r <= 0)
ball->life = false;
if (ball->life == false) {
HWND hwnd = GetHWnd();
MessageBox(hwnd, _T("你被吃了"), _T("游戏结束"), MB_ICONEXCLAMATION);
closegraph();
exit(0); //可以增加重新游戏功能
}
if (eaten + ai_eaten == AINUM)
{
HWND hwnd = GetHWnd();
MessageBox(hwnd, _T("恭喜过关"), _T("游戏结束"), MB_OK | MB_ICONEXCLAMATION); // 结束
closegraph();
exit(0);
}
for (int i = 0; i < AINUM; i++) {
if (ball->r >= ai[i].r) {
if (ai[i].life == 0) continue;
if (DISTANCE(ball->x, ball->y, ai[i].x, ai[i].y) < (4 / 5.0 * (ball->r + ai[i].r))) {
ai[i].life = 0;
ball->r = sqrt(ai[i].r*ai[i].r + ball->r*ball->r);
eaten++;
}
}
}
for (int n = 0; n < FNUM; n++) {
if (food[n].eat == 0) continue;
if (DISTANCE(ball->x, ball->y, food[n].x, food[n].y) < ball->r) {
ball->r += 4 / ball->r;
food[n].eat = 0;
}
}
static int mx = 0, my = 0;
if (GetAsyncKeyState(VK_UP) && (ball->y - ball->r > 0 && ball->y <= (MAPH - ball->r + 10))) {
ball->y -= 4;
my += 4;
}
if (GetAsyncKeyState(VK_DOWN) && (ball->y - ball->r >= -10 && ball->y < (MAPH - ball->r))) {
ball->y += 4;
my -= 4;
}
if (GetAsyncKeyState(VK_LEFT) && ball->x - ball->r > 0 && (ball->x <= (MAPW - ball->r + 10))) {
ball->x -= 4;
mx += 4;
}
if (GetAsyncKeyState(VK_RIGHT) && ball->x - ball->r >= -10 && (ball->x < (MAPW - ball->r))) {
ball->x += 4;
mx -= 4;
}
setorigin(mx, my);
}
void AI() {
for (int i = 0; i < AINUM; i++) {
if (ai[i].r > mover.r) {
if (DISTANCE(mover.x, mover.y, ai[i].x, ai[i].y) < (ai[i].r + mover.r)) {
ai[i].r = sqrt(ai[i].r*ai[i].r + mover.r*mover.r);
mover.life = 0;
mover.r = 0;
}
}
for (int j = 0; j < AINUM; j++) {
if (ai[i].r > ai[j].r) {
if (ai[j].life == 0) continue;
if (DISTANCE(ai[i].x, ai[i].y, ai[j].x, ai[j].y) < (ai[i].r + ai[j].r)) {
ai[i].r = sqrt(ai[i].r*ai[i].r + ai[j].r*ai[j].r);
ai[j].life = 0;
ai[j].r = 0;
ai_eaten++;
}
}
}
double min_DISTANCE = 100000;
int min = -1;
for (int k = 0; k < AINUM; k++) {
if (ai[i].r > ai[k].r&&ai[k].life != 0) {
if (DISTANCE(ai[i].x, ai[i].y, ai[k].x, ai[k].y) < min_DISTANCE) {
min_DISTANCE = DISTANCE(ai[i].x, ai[i].y, ai[k].x, ai[k].y);
min = k;
}
}
}
if ((min != -1) && (rand() % 2 == 1)) {
if (rand() % 2) {
if (ai[i].x < ai[min].x)
ai[i].x++;
else
ai[i].x--;
}
else {
if (ai[i].y < ai[min].y)
ai[i].y++;
else
ai[i].y--;
}
}
for (int n = 0; n < FNUM; n++) {
if (food[n].eat == 0) continue;
if (DISTANCE(ai[i].x, ai[i].y, food[n].x, food[n].y) < ai[i].r) {
ai[i].r += 4 / ai[i].r;
food[n].eat = 0;
}
}
}
}
void Food() {
for (int i = 0; i < FNUM; i++) {
if (food[i].eat == 0) {
food[i].eat = 1;
food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
food[i].x = rand() % MAPW;
food[i].y = rand() % MAPH;
food[i].type = rand() % 10 + 1;
}http://www.biyezuopin.vip
}
}
void draw() {
clearcliprgn();
setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 20);
setlinecolor(RGB(0, 100, 0));
line(-20, MAPH + 20, -20, -20);
line(-20, MAPH + 20, MAPW + 20, MAPH + 20);
line(-20, -20, MAPW + 20, -20);
line(MAPW + 20, -20, MAPW + 20, MAPH + 20);
setfillcolor(GREEN);
if (mover.x - 0.5 * WIDTH / asp < -20)
floodfill(-20 - 11, mover.y, RGB(0, 100, 0));
if (mover.x + 0.5 * WIDTH / asp > MAPW + 20)
floodfill(MAPW + 20 + 11, mover.y, RGB(0, 100, 0));
if (mover.y - 0.5 * HEIGHT / asp < -20)
floodfill(mover.x, -20 - 11, RGB(0, 100, 0));
if (mover.y + 0.5 * HEIGHT / asp > MAPH + 20)
floodfill(mover.x, MAPH + 20 + 11, RGB(0, 100, 0));
setlinecolor(WHITE);
setlinestyle(PS_NULL);
for (int i = 0; i < FNUM; i++) {
if (food[i].eat == 0) continue;
setfillcolor(food[i].color);
switch (food[i].type) {
case 1: solidellipse(food[i].x, food[i].y, food[i].x + 2, food[i].y + 4); break;
case 2: solidellipse(food[i].x, food[i].y, food[i].x + 4, food[i].y + 2); break;
case 3: solidrectangle(food[i].x, food[i].y, food[i].x + 4, food[i].y + 2); break;
case 4: solidrectangle(food[i].x, food[i].y, food[i].x + 2, food[i].y + 4); break;
case 5: solidroundrect(food[i].x, food[i].y, food[i].x + 2, food[i].y + 4, 2, 2); break;
case 6: solidroundrect(food[i].x, food[i].y, food[i].x + 4, food[i].y + 2, 2, 2); break;
case 7: solidroundrect(food[i].x, food[i].y, food[i].x + 4, food[i].y + 2, 4, 2); break;
case 8: solidroundrect(food[i].x, food[i].y, food[i].x + 4, food[i].y + 2, 2, 4); break;
case 9: solidroundrect(food[i].x, food[i].y, food[i].x + 4, food[i].y + 2, 1, 1); break;
case 10: fillcircle(food[i].x, food[i].y, 4); break;
}
}
for (int i = 0; i < AINUM; i++) {
if (ai[i].life == 0) continue;
setfillcolor(ai[i].color);
fillcircle(ai[i].x, ai[i].y, int(ai[i].r + 0.5));
}
setfillcolor(mover.color);
fillcircle(mover.x, mover.y, int(mover.r + 0.5));
IMAGE map(150, 100);
SetWorkingImage(&map);
setbkcolor(RGB(120, 165, 209));
cleardevice();
for (int i = 0; i < AINUM; i++)
{
if (ai[i].life == 0) continue;
setfillcolor(ai[i].color);
fillcircle(ai[i].x * 150 / WIDTH / 4, ai[i].y * 100 / HEIGHT / 4, int(ai[i].r / 28 + 0.5));
}
setfillcolor(mover.color);
fillcircle(mover.x * 150 / WIDTH / 4, mover.y * 100 / HEIGHT / 4, int(mover.r / 28 + 0.5));
setlinecolor(RGB(0, 100, 0));
SetWorkingImage();
putimage(mover.x + int(0.5 * WIDTH) - 150, mover.y - int(0.5 * HEIGHT), 150, 100, &map, 0, 0);
setlinecolor(LIGHTBLUE);
setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 4);
line(mover.x + int(0.5 * WIDTH) - 151, mover.y - int(0.5 * HEIGHT), mover.x + int(0.5 * WIDTH) - 151, mover.y - int(0.5 * HEIGHT) + 99);
line(mover.x + int(0.5 * WIDTH) - 151, mover.y - int(0.5 * HEIGHT) + 99, mover.x + int(0.5 * WIDTH), mover.y - int(0.5 * HEIGHT) + 99);
setlinestyle(PS_NULL);
TCHAR str[32];
swprintf_s(str, _T("质量:%.1fg 击杀:%d"), mover.r, eaten);
settextcolor(BLUE);
outtextxy(mover.x - int(0.5 * WIDTH), mover.y - int(0.5 * HEIGHT), str);
settextcolor(BLUE);
outtextxy(mover.x - 36, mover.y - 8, _T("user name"));
}
void setall() {
srand((unsigned)time(NULL));
mover.color = RGB(rand() % 256, rand() % 256, rand() % 256);
mover.life = 1;
mover.x = int(WIDTH*0.5);
mover.y = int(HEIGHT*0.5);
mover.r = 20;
for (int i = 0; i < AINUM; i++) {
ai[i].life = 1;
ai[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
ai[i].r = float(rand() % 10 + 10);
ai[i].x = rand() % (MAPW - int(ai[i].r + 0.5)) + int(ai[i].r + 0.5);
ai[i].y = rand() % (MAPH - int(ai[i].r + 0.5)) + int(ai[i].r + 0.5);
}
for (int i = 0; i < FNUM; i++)
{
food[i].eat = 1;
food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
food[i].x = rand() % MAPW;
food[i].y = rand() % MAPH;
food[i].type = rand() % 10 + 1;
}
pBuffer = GetImageBuffer(NULL);
setbkcolor(WHITE);
cleardevice();
settextcolor(LIGHTRED);
setbkmode(TRANSPARENT);
settextstyle(16, 0, _T("宋体"));
}
void delay(DWORD ms)
{
static DWORD oldtime = GetTickCount();
while (GetTickCount() - oldtime < ms)
Sleep(1);
oldtime = GetTickCount();
}
void start()
{
setbkcolor(WHITE);
cleardevice();
settextcolor(RED);
setbkmode(TRANSPARENT);
settextstyle(128, 0, _T("宋体"));
outtextxy(320, 40, _T("贪婪球"));
settextstyle(32, 0, _T("宋体"));
outtextxy(740, 135, _T("Ver 1.0"));
settextcolor(BLUE);
outtextxy(170, 240, _T(" ↑ 上移 ↓ 下移 ← 左移 → 右移 "));
settextcolor(GREEN);
outtextxy(112, 340, _T("躲避大球 追补小球 贪吃食物 增强实力"));
settextcolor(BLACK);
settextstyle(32, 0, _T("宋体"));
outtextxy(384, 500, _T("按任意键开始游戏"));
settextstyle(20, 0, _T("宋体"));
outtextxy(810, 10, _T("2018级软件工程1班"));
outtextxy(810, 30, _T("贺巍"));
outtextxy(810, 50, _T("201810414113"));
_getch();
}http://www.biyezuopin.vip