VS2022 C++ EasyX EGE 吃豆人升级版

我是可爱的C++小盆友(不要脸了),嘻嘻,等了这么久,吃豆人终于升级啦!

更新日志:

1.修复奇奇怪怪的bug

2.把敌人AI增强了一(hen)(duo)

3.加入了奖励豆,吃完有特殊的东西

        1)万物复苏 玩家生命值+3

        2)极致严寒 敌人移动速度降低

        3)无限牢笼 送一个敌人到地图四个角落种一个

本小盆友很想破1000粉丝,求大家四连(点赞,关注,收藏,转发)

对了,提醒一句,如果要改我的代码,千万不要加using namespace std这一行,整个程序会炸,不信自己试,逝世了我可不负责昂

好啦,下面是大家最喜欢的代码环节!

#include<bits/stdc++.h>
#include<queue>
#include<conio.h>
#pragma comment(lib,"winmm.lib")
#define _CRT_SECURE_NO_WARNINGS
#define WIDTH				15*25
#define HEIGHT				22*25
#define GRID				25
#define ROW					20
#define COL					15
using std::cout;
using std::endl;
int b = 255;
int m = 0, n = 0;
int speed = 400;
int life = 5;
int score = 0;
bool willGo = true;
bool canGo = true;
bool isChange = true;
long long min = 99999999, timesa = 1, v[ROW][COL];
DWORD t1 = 0, t2 = 0;
DWORD t3 = 0, t4 = 0;
DWORD t5 = 0, t6 = 0;//奖励函数特用
IMAGE img[8];
IMAGE Enemy[4];
IMAGE bean, bean2;
COLORREF color = RGB(0, 0, 0);
enum DIR {
	NONE,
	UP,
	DOWN,
	LEFT,
	RIGHT,
	WAITING
};
enum TOOLS {
	WALL,
	PLAYER,
	SPACE,
	ENEMY,
	BEAN,
	ENEMYBEAN,
	ENEMYSBEAN,
	SBEAN
};
struct Point {
	int x, y;
};
struct Player {
	int x, y;
	bool flag;
	DIR dir;
}player;
struct ENEmy {
	int x, y;
	int flag;
	DIR dir;
}enemy[4];
int map[ROW][COL] = {
	WALL,WALL,WALL,WALL,WALL,WALL,WALL,BEAN,WALL,WALL,WALL,WALL,WALL,WALL,WALL,
	WALL,BEAN,BEAN,BEAN,BEAN,WALL,BEAN,BEAN,BEAN,WALL,BEAN,BEAN,BEAN,BEAN,WALL,
	WALL,BEAN,WALL,WALL,BEAN,WALL,BEAN,WALL,BEAN,WALL,BEAN,WALL,WALL,BEAN,WALL,
	BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,
	WALL,WALL,BEAN,WALL,WALL,WALL,WALL,BEAN,WALL,WALL,WALL,WALL,BEAN,WALL,WALL,
	WALL,WALL,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,WALL,WALL,
	WALL,WALL,BEAN,WALL,WALL,BEAN,WALL,WALL,WALL,BEAN,WALL,WALL,BEAN,WALL,WALL,
	WALL,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,WALL,
	WALL,BEAN,WALL,WALL,BEAN,WALL,WALL,BEAN,WALL,WALL,BEAN,WALL,WALL,BEAN,WALL,
	WALL,BEAN,WALL,WALL,BEAN,WALL,BEAN,BEAN,BEAN,WALL,BEAN,WALL,WALL,BEAN,WALL,
	WALL,BEAN,WALL,WALL,BEAN,WALL,WALL,BEAN,WALL,WALL,BEAN,WALL,WALL,BEAN,WALL,
	WALL,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,WALL,
	WALL,WALL,BEAN,WALL,WALL,BEAN,WALL,BEAN,WALL,BEAN,WALL,WALL,BEAN,WALL,WALL,
	WALL,WALL,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,WALL,WALL,
	WALL,BEAN,BEAN,BEAN,BEAN,WALL,WALL,BEAN,WALL,WALL,BEAN,BEAN,BEAN,BEAN,WALL,
	WALL,WALL,BEAN,WALL,WALL,WALL,WALL,BEAN,WALL,WALL,WALL,WALL,BEAN,WALL,WALL,
	BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,BEAN,
	WALL,BEAN,WALL,WALL,BEAN,WALL,BEAN,WALL,BEAN,WALL,BEAN,WALL,WALL,BEAN,WALL,
	WALL,BEAN,BEAN,BEAN,BEAN,WALL,BEAN,BEAN,BEAN,WALL,BEAN,BEAN,BEAN,BEAN,WALL,
	WALL,WALL,WALL,WALL,WALL,WALL,WALL,BEAN,WALL,WALL,WALL,WALL,WALL,WALL,WALL,
};
void drawText() {
	if (b <= 1) {
		isChange = false;
	}
	else if (b >= 255 - 8) {
		isChange = true;
	}
	char ch[1000];
	int spaceH;
	settextcolor(RGB(60, 10, b));
	settextstyle(25, 0, "华文行楷");
	sprintf_s(ch, "生命: %d          得分: %d", life, score);
	spaceH = (getwidth() - textwidth(ch)) / 2;
	outtextxy(spaceH, 20 * 25, ch);
	sprintf_s(ch, "x:%d   y:%d", player.x, player.y);
	spaceH = (getwidth() - textwidth(ch)) / 2;
	outtextxy(spaceH, 21 * 25, ch);
	if (isChange) {
		b -= 7;
	}
	else {
		b += 7;
	}
}
void initMap() {
	loadimage(&Enemy[0], "01.png", GRID, GRID);
	loadimage(&Enemy[1], "02.png", GRID, GRID);
	loadimage(&Enemy[2], "03.png", GRID, GRID);
	loadimage(&Enemy[3], "04.png", GRID, GRID);

	loadimage(&img[0], "UP_CLOSE.jpg", 24, 24);
	loadimage(&img[1], "UP_OPEN.jpg", 24, 24);
	loadimage(&img[2], "DOWN_CLOSE.jpg", 24, 24);
	loadimage(&img[3], "DOWN_OPEN.jpg", 24, 24);
	loadimage(&img[4], "LEFT_CLOSE.jpg", 24, 24);
	loadimage(&img[5], "LEFT_OPEN.jpg", 24, 24);
	loadimage(&img[6], "RIGHT_CLOSE.jpg", 24, 24);
	loadimage(&img[7], "RIGHT_OPEN.jpg", 24, 24);

	loadimage(&bean, "bean.png", 15, 15);
	loadimage(&bean2, "sbean.png", 15, 15);

	map[m][n] = PLAYER;
	player.flag = true;
	player.x = m;
	player.y = n;
	srand((unsigned int)time(NULL));
	for (int i = 0; i < 4; i++) {
		int a = rand() % (ROW - 2) + 1;
		int b = rand() % (COL - 2) + 1;
		while (map[a][b] == WALL || map[a][b] == PLAYER) {
			a = rand() % (ROW - 2) + 1;
			b = rand() % (COL - 2) + 1;
		}
		enemy[i].x = a;
		enemy[i].y = b;
		map[a][b] = ENEMYSBEAN;
	}
}
void drawMap() {
	setbkmode(TRANSPARENT);
	setbkcolor(RGB(83, 55, 213));
	cleardevice();
	for (int i = 0; i < ROW; i++) {
		for (int j = 0; j < COL; j++) {
			switch (map[i][j]) {
			case SPACE:
				color = RGB(81, 55, 213);
				setlinecolor(color);
				setfillcolor(color);
				fillrectangle(j * GRID, i * GRID, j * GRID + GRID, i * GRID + GRID);
				break;
			case WALL:
				color = RGB(150, 0, 255);
				setlinecolor(color);
				setfillcolor(color);
				setlinecolor(WHITE);
				setlinestyle(PS_SOLID, 1);
				fillroundrect(j * GRID, i * GRID, j * GRID + GRID, i * GRID + GRID, 6, 6);
				break;
			case PLAYER:
				switch (player.flag) {
				case true:
					switch (player.dir) {
					case UP:
						putimage(j * GRID, i * GRID, &img[1]);
						break;
					case DOWN:
						putimage(j * GRID, i * GRID, &img[3]);
						break;
					case LEFT:
						putimage(j * GRID, i * GRID, &img[5]);
						break;
					case RIGHT:
						putimage(j * GRID, i * GRID, &img[7]);
						break;
					}
					break;
				case false:
					switch (player.dir) {
					case UP:
						putimage(j * GRID, i * GRID, &img[0]);
						break;
					case DOWN:
						putimage(j * GRID, i * GRID, &img[2]);
						break;
					case LEFT:
						putimage(j * GRID, i * GRID, &img[4]);
						break;
					case RIGHT:
						putimage(j * GRID, i * GRID, &img[6]);
						break;
					}
					break;
				}
				break;
			case ENEMY:
				for (int k = 0; k < 4; k++) {
					if (enemy[k].x == i && enemy[k].y == j) {
						putimage(j * GRID, i * GRID, &Enemy[k]);
					}
				}
				break;
			case BEAN:
				putimage(j * GRID + 5, i * GRID + 5, &bean);
				break;
			case SBEAN:
				putimage(j * GRID + 5, i * GRID + 5, &bean2);
				break;
			case ENEMYSBEAN:
				for (int k = 0; k < 4; k++) {
					if (enemy[k].x == i && enemy[k].y == j) {
						putimage(j * GRID, i * GRID, &Enemy[k]);
					}
				}
				break;
			case ENEMYBEAN:
				for (int k = 0; k < 4; k++) {
					if (enemy[k].x == i && enemy[k].y == j) {
						putimage(j * GRID, i * GRID, &Enemy[k]);
					}
				}
				break;
			}
		}
	}
	for (int i = 0; i < ROW; i++) {
		for (int j = 0; j < COL; j++) {
			switch (map[i][j]) {
			case WALL:
				color = RGB(150, 0, 255);
				setlinecolor(color);
				setfillcolor(color);
				setlinecolor(WHITE);
				setlinestyle(PS_SOLID, 1);
				fillroundrect(j * GRID, i * GRID, j * GRID + GRID, i * GRID + GRID, 6, 6);
				break;
			}
		}
	}
	drawText();
}
void drawText2(char ch[100]) {
	mciSendString("pause 1.mp3", 0, 0, 0);
	//setbkcolor(BLACK);
	//cleardevice();
	//setfillcolor(BLACK);
	//fillrectangle(0, 0, WIDTH, HEIGHT);
	settextcolor(RED);
	settextstyle(45, 0, "华文行楷");
	int spaceH = (getwidth() - textwidth(ch)) / 2;
	int spaceV = (getheight() - textheight(ch)) / 2;
	outtextxy(spaceH, spaceV, ch);
	FlushBatchDraw();
	Sleep(1250);
	drawMap();
	mciSendString("play 1.mp3 repeat", 0, 0, 0);
}
void movePlayer() {
	int sp;
	char c;
	char ch1[22] = "万   物   复   苏";
	char ch2[22] = "极   致   严   寒";
	char ch3[22] = "无   限   牢   笼";
	Player next = player;
	switch (player.dir) {
	case UP:
		next.x--;
		break;
	case DOWN:
		next.x++;
		break;
	case LEFT:
		next.y--;
		break;
	case RIGHT:
		next.y++;
		break;
	}
	if (player.x == 16 && player.y == 0 && canGo) {
		map[player.x][player.y] = SPACE;
		player.x = 16;
		player.y = COL - 1;
		player.dir = LEFT;
		map[player.x][player.y] = PLAYER;
		player.flag = !player.flag;
		canGo = false;
	}
	else if (player.x == 16 && player.y == COL - 1 && canGo) {
		map[player.x][player.y] = SPACE;
		player.x = 16;
		player.y = 0;
		player.dir = RIGHT;
		map[player.x][player.y] = PLAYER;
		player.flag = !player.flag;
		canGo = false;
	}

	if (player.x == 3 && player.y == 0 && canGo) {
		map[player.x][player.y] = SPACE;
		player.x = 3;
		player.y = COL - 1;
		player.dir = LEFT;
		map[player.x][player.y] = PLAYER;
		player.flag = !player.flag;
		canGo = false;
	}
	else if (player.x == 3 && player.y == COL - 1 && canGo) {
		map[player.x][player.y] = SPACE;
		player.x = 3;
		player.y = 0;
		player.dir = RIGHT;
		map[player.x][player.y] = PLAYER;
		player.flag = !player.flag;
		canGo = false;
	}

	if (player.x == 0 && player.y == 7 && canGo) {
		map[player.x][player.y] = SPACE;
		player.x = ROW - 1;
		player.y = 7;
		player.dir = UP;
		map[player.x][player.y] = PLAYER;
		player.flag = !player.flag;
		canGo = false;
	}
	else if (player.x == ROW - 1 && player.y == 7 && canGo) {
		map[player.x][player.y] = SPACE;
		player.x = 0;
		player.y = 7;
		player.dir = DOWN;
		map[player.x][player.y] = PLAYER;
		player.flag = !player.flag;
		canGo = false;
	}
	/*
	Player next2 = player;
	switch (map[next2.x][next2.y]) {
	case WALL:
		break;
	case SPACE:
		map[player.x][player.y] = SPACE;
		player = next2;
		map[player.x][player.y] = PLAYER;
		player.flag = !player.flag;
		canGo = true;
		break;
	case ENEMY:
	case ENEMYBEAN:
	case ENEMYSBEAN:
		for (int i = 0; i < 4; i++) {
			if (next2.x == enemy[i].x && next2.y == enemy[i].y) {
				life--;
				if (life == 0) {
					mciSendString("close 1.mp3", 0, 0, 0);
					c = getchar();
					exit(0);
				}
				else {
					map[player.x][player.y] = SPACE;
					player.x = m;
					player.y = n;
					break;
				}
			}
		}
		break;
	case BEAN:
		score++;
		map[player.x][player.y] = SPACE;
		player = next2;
		map[player.x][player.y] = PLAYER;
		player.flag = !player.flag;
		canGo = true;
		break;
	case SBEAN:
		score += 10;
		map[player.x][player.y] = SPACE;
		player = next2;
		map[player.x][player.y] = PLAYER;
		player.flag = !player.flag;
		canGo = true;
		srand((unsigned int)time(NULL));
		sp = rand() % 3 + 1;
		switch (sp) {
		case 1:
			break;
		case 2:
			break;
		case 3:
			break;
		}
		break;
	}
	*/
	switch (map[next.x][next.y]) {
	case WALL:
		break;
	case SPACE:
		map[player.x][player.y] = SPACE;
		player = next;
		map[player.x][player.y] = PLAYER;
		player.flag = !player.flag;
		canGo = true;
		break;
	case ENEMY:
	case ENEMYBEAN:
	case ENEMYSBEAN:
		for (int i = 0; i < 4; i++) {
			if (next.x == enemy[i].x && next.y == enemy[i].y) {
				life--;
				if (life == 0) {
					mciSendString("close 1.mp3", 0, 0, 0);
					c = getchar();
					exit(0);
				}
				else {
					map[player.x][player.y] = SPACE;
					player.x = m;
					player.y = n;
					break;
				}
			}
		}
		break;
	case BEAN:
		score++;
		map[player.x][player.y] = SPACE;
		player = next;
		map[player.x][player.y] = PLAYER;
		player.flag = !player.flag;
		canGo = true;
		break;
	case SBEAN:
		score += 10;
		map[player.x][player.y] = SPACE;
		player = next;
		map[player.x][player.y] = PLAYER;
		player.flag = !player.flag;
		canGo = true;
		srand((unsigned int)time(NULL));
		sp = rand() % 4 + 1;
		if (sp == 1) {
			drawText2(ch1);
			life += 3;
		}
		else if (sp == 2) {
			drawText2(ch2);
			speed += 200;
		}
		else {
			drawText2(ch3);
			for (int i = 0; i < 4; i++) {
				if (enemy[i].x != 0 && enemy[i].y != 0 && map[0][0] != ENEMY) {
					map[enemy[i].x][enemy[i].y] = SBEAN;
					enemy[i].x = 0;
					enemy[i].y = 0;
					map[enemy[i].x][enemy[i].y] = ENEMY;
					break;
				}
				else if (enemy[i].x != 0 && enemy[i].y != 0 && map[0][COL - 1] != ENEMY) {
					map[enemy[i].x][enemy[i].y] = SBEAN;
					enemy[i].x = 0;
					enemy[i].y = COL - 1;
					map[enemy[i].x][enemy[i].y] = ENEMY;
					break;
				}
				else if (enemy[i].x != 0 && enemy[i].y != 0 && map[ROW - 1][0] != ENEMY) {
					map[enemy[i].x][enemy[i].y] = SBEAN;
					enemy[i].x = ROW - 1;
					enemy[i].y = 0;
					map[enemy[i].x][enemy[i].y] = ENEMY;
					break;
				}
				else if (enemy[i].x != 0 && enemy[i].y != 0 && map[ROW - 1][COL - 1] != ENEMY) {
					map[enemy[i].x][enemy[i].y] = SBEAN;
					enemy[i].x = ROW - 1;
					enemy[i].y = COL - 1;
					map[enemy[i].x][enemy[i].y] = ENEMY;
					break;
				}
			}
		}
		break;
	}
}
void keyDown() {
	if (_kbhit()) {
		canGo = true;
		switch (_getch()) {
		case 72:
			player.dir = UP;
			break;
		case 80:
			player.dir = DOWN;
			break;
		case 75:
			player.dir = LEFT;
			break;
		case 77:
			player.dir = RIGHT;
			break;
		}
	}
}
void moveEnemy() {
	char c;
	for (int i = 0; i < 4; i++) {
		ENEmy next = enemy[i];
		switch (enemy[i].dir) {
		case UP:
			next.x--;
			break;
		case DOWN:
			next.x++;
			break;
		case LEFT:
			next.y--;
			break;
		case RIGHT:
			next.y++;
			break;
		}
		if (enemy[i].x == 16 && enemy[i].y == 0 && canGo) {
			map[enemy[i].x][enemy[i].y] = SPACE;
			enemy[i].x = 16;
			enemy[i].y = COL - 1;
			enemy[i].dir = LEFT;
			map[enemy[i].x][enemy[i].y] = ENEMY;
			canGo = false;
		}
		else if (enemy[i].x == 16 && enemy[i].y == COL - 1 && canGo) {
			map[enemy[i].x][enemy[i].y] = SPACE;
			enemy[i].x = 16;
			enemy[i].y = 0;
			enemy[i].dir = RIGHT;
			map[enemy[i].x][enemy[i].y] = ENEMY;
			canGo = false;
		}

		if (enemy[i].x == 3 && enemy[i].y == 0 && canGo) {
			map[enemy[i].x][enemy[i].y] = SPACE;
			enemy[i].x = 3;
			enemy[i].y = COL - 1;
			enemy[i].dir = LEFT;
			map[enemy[i].x][enemy[i].y] = ENEMY;
			canGo = false;
		}
		else if (enemy[i].x == 3 && enemy[i].y == COL - 1 && canGo) {
			map[enemy[i].x][enemy[i].y] = SPACE;
			enemy[i].x = 3;
			enemy[i].y = 0;
			enemy[i].dir = RIGHT;
			map[enemy[i].x][enemy[i].y] = ENEMY;
			canGo = false;
		}

		if (enemy[i].x == 0 && enemy[i].y == 7 && canGo) {
			map[enemy[i].x][enemy[i].y] = SPACE;
			enemy[i].x = ROW - 1;
			enemy[i].y = 7;
			enemy[i].dir = UP;
			map[enemy[i].x][enemy[i].y] = ENEMY;
			canGo = false;
		}
		else if (enemy[i].x == ROW - 1 && enemy[i].y == 7 && canGo) {
			map[enemy[i].x][enemy[i].y] = SPACE;
			enemy[i].x = 0;
			enemy[i].y = 7;
			enemy[i].dir = DOWN;
			map[enemy[i].x][enemy[i].y] = ENEMY;
			canGo = false;
		}
		/*
		ENEmy next2 = enemy[i];
		switch (map[next2.x][next2.y]) {
		case WALL:
			break;
		case SPACE:
			if (map[enemy[i].x][enemy[i].y] == ENEMYBEAN) {
				map[enemy[i].x][enemy[i].y] = BEAN;
			}
			else if (map[enemy[i].x][enemy[i].y] == ENEMYSBEAN) {
				map[enemy[i].x][enemy[i].y] = SBEAN;
			}
			else {
				map[enemy[i].x][enemy[i].y] = SPACE;
			}
			enemy[i] = next2;
			map[enemy[i].x][enemy[i].y] = ENEMY;
			break;
		case ENEMY:
		case ENEMYBEAN:
		case ENEMYSBEAN:
			break;
		case PLAYER:
			for (int i = 0; i < 4; i++) {
				if (next2.x == enemy[i].x && next2.y == enemy[i].y) {
					for (int i = 0; i < ROW; i++) {
						for (int j = 0; j < COL; j++) {
							printf("%d ", map[i][j]);
						}
						printf("\n");
					}
					printf("\n");
					life--;
					if (life == 0) {
						mciSendString("close 1.mp3", 0, 0, 0);
						c = getchar();
						exit(0);
					}
					else {
						map[player.x][player.y] = SPACE;
						player.x = m;
						player.y = n;
						break;
					}
				}
			}
			break;
		case BEAN:
			if (map[enemy[i].x][enemy[i].y] == ENEMY) {
				map[enemy[i].x][enemy[i].y] = SPACE;
			}
			else if (map[enemy[i].x][enemy[i].y] == ENEMYBEAN) {
				map[enemy[i].x][enemy[i].y] = BEAN;
			}
			else if (map[enemy[i].x][enemy[i].y] == ENEMYSBEAN) {
				map[enemy[i].x][enemy[i].y] = SBEAN;
			}
			enemy[i] = next2;
			map[enemy[i].x][enemy[i].y] = ENEMYBEAN;
			break;
		case SBEAN:
			if (map[enemy[i].x][enemy[i].y] == ENEMY) {
				map[enemy[i].x][enemy[i].y] = SPACE;
			}
			else if (map[enemy[i].x][enemy[i].y] == ENEMYBEAN) {
				map[enemy[i].x][enemy[i].y] = BEAN;
			}
			else if (map[enemy[i].x][enemy[i].y] == ENEMYSBEAN) {
				map[enemy[i].x][enemy[i].y] = SBEAN;
			}
			enemy[i] = next2;
			map[enemy[i].x][enemy[i].y] = ENEMYSBEAN;
			break;
		}
		*/
		switch (map[next.x][next.y]) {
		case WALL:
			break;
		case SPACE:
			if (map[enemy[i].x][enemy[i].y] == ENEMYBEAN) {
				map[enemy[i].x][enemy[i].y] = BEAN;
			}
			else if (map[enemy[i].x][enemy[i].y] == ENEMYSBEAN) {
				map[enemy[i].x][enemy[i].y] = SBEAN;
			}
			else {
				map[enemy[i].x][enemy[i].y] = SPACE;
			}
			enemy[i] = next;
			map[enemy[i].x][enemy[i].y] = ENEMY;
			break;
		case ENEMY:
		case ENEMYBEAN:
		case ENEMYSBEAN:
			break;
		case PLAYER:
			for (int i = 0; i < 4; i++) {
				if (next.x == player.x && next.y == player.y) {
					life--;
					if (life == 0) {
						mciSendString("close 1.mp3", 0, 0, 0);
						c = getchar();
						exit(0);
					}
					else {
						map[player.x][player.y] = SPACE;
						player.x = m;
						player.y = n;
						break;
					}
				}
			}
			break;
		case BEAN:
			if (map[enemy[i].x][enemy[i].y] == ENEMY) {
				map[enemy[i].x][enemy[i].y] = SPACE;
			}
			else if (map[enemy[i].x][enemy[i].y] == ENEMYBEAN) {
				map[enemy[i].x][enemy[i].y] = BEAN;
			}
			else if (map[enemy[i].x][enemy[i].y] == ENEMYSBEAN) {
				map[enemy[i].x][enemy[i].y] = SBEAN;
			}
			enemy[i] = next;
			map[enemy[i].x][enemy[i].y] = ENEMYBEAN;
			break;
		case SBEAN:
			if (map[enemy[i].x][enemy[i].y] == ENEMY) {
				map[enemy[i].x][enemy[i].y] = SPACE;
			}
			else if (map[enemy[i].x][enemy[i].y] == ENEMYBEAN) {
				map[enemy[i].x][enemy[i].y] = BEAN;
			}
			else if (map[enemy[i].x][enemy[i].y] == ENEMYSBEAN) {
				map[enemy[i].x][enemy[i].y] = SBEAN;
			}
			enemy[i] = next;
			map[enemy[i].x][enemy[i].y] = ENEMYSBEAN;
			break;
		}
	}
}
DIR EnemyBFS(int xx,int xy) {
	int dx[4], dy[4];
	int rnd[4];
	DIR vis[ROW][COL] = { NONE };
	int oridx[4] = { 0,0,-1,1 };
	int oridy[4] = { 1,-1,0,0 };
	DIR oridir[4] = { RIGHT,LEFT,UP,DOWN };
	DIR dr[4];
	Point v[ROW][COL];
	rnd[0] = rand() % 4;
	for (int i = 1; i < 4; i++) {
		bool x = 1;
		while (x) {
			rnd[i] = rand() % 4, x = 0;
			for (int j = 0; j < i; j++) if (rnd[i] == rnd[j]) x = 1;
		}
	}
	for (int i = 0; i < 4; i++) dx[i] = oridx[rnd[i]], dy[i] = oridy[rnd[i]], dr[i] = oridir[rnd[i]];
	std::queue<Point> q;
	q.push({ xx,xy });
	for (int i = 0; i < ROW; i++)
		for (int j = 0; j < COL; j++)
			if (map[i][j] != WALL) vis[i][j] = WAITING;
			else vis[i][j] = NONE;
	vis[xx][xy] = NONE;
	v[xx][xy] = { xx,xy };
	while (!q.empty()) {
		int _x_ = q.front().x, _y_ = q.front().y; q.pop();
		if (_x_ == player.x && _y_ == player.y) {
			Point t = { player.x,player.y }, lst = t;
			while (v[t.x][t.y].x!=t.x||v[t.x][t.y].y!=t.y) {
				lst = t;
				t = v[t.x][t.y];
			}
			int gox = lst.x, goy = lst.y;
			for (int i = 0; i < 4; i++) {
				if (xx + oridx[i] == gox && xy + oridy[i] == goy) return oridir[i];
			}
			return NONE;
		}
		for (int i = 0; i < 4; i++) {
			int nx = _x_ + dx[i], ny = _y_ + dy[i];
			if (vis[nx][ny] == WAITING) {
				vis[nx][ny] = dr[i];
				v[nx][ny] = { _x_,_y_ };
				q.push({ nx,ny });
			}
		}
	}
	return NONE;
}
void enemyControl() {
	srand((unsigned int)time(NULL));
	while (1) {
		for (int i = 0; i < 4; i++) {
			/*int r = player.x;
			int c = player.y;
			int r2 = enemy[i].x;
			int c2 = enemy[i].y;
			int m = rand() % 2 + 1;
			switch (m) {
			case 1:
				if (r < r2 && map[r2 - 1][c2] != WALL) {
					enemy[i].dir = UP;
				}
				else if (r > r2 && map[r2 + 1][c2] != WALL) {
					enemy[i].dir = DOWN;
				}
				else if (c < c2 && map[r2][c2 - 1] != WALL) {
					enemy[i].dir = LEFT;
				}
				else if (c > c2 && map[r2][c2 + 1] != WALL) {
					enemy[i].dir = RIGHT;
				}
				else {
					int n = rand() % 4 + 1;
					switch (n) {
					case 1:
						enemy[i].dir = UP;
						break;
					case 2:
						enemy[i].dir = DOWN;
						break;
					case 3:
						enemy[i].dir = LEFT;
						break;
					case 4:
						enemy[i].dir = RIGHT;
					}
				}
				break;
			case 2:
				if (r < r2 && map[r2 - 1][c2] != WALL) {
					enemy[i].dir = UP;
				}
				else if (r > r2 && map[r2 + 1][c2] != WALL) {
					enemy[i].dir = DOWN;
				}
				else if (c < c2 && map[r2][c2 - 1] != WALL) {
					enemy[i].dir = LEFT;
				}
				else if (c > c2 && map[r2][c2 + 1] != WALL) {
					enemy[i].dir = RIGHT;
				}
				else {
					int n = rand() % 4 + 1;
					switch (n) {
					case 1:
						enemy[i].dir = UP;
						break;
					case 2:
						enemy[i].dir = DOWN;
						break;
					case 3:
						enemy[i].dir = LEFT;
						break;
					case 4:
						enemy[i].dir = RIGHT;
					}
				}
				break;
			}*/
			enemy[i].dir = EnemyBFS(enemy[i].x, enemy[i].y);
			Sleep(300);
		}
	}
}
bool isWin() {
	for (int i = 0; i < ROW; i++) {
		for (int j = 0; j < COL; j++) {
			if (map[i][j] == BEAN  || map[i][j] == SBEAN) return false;
		}
	}
}
int main() {
	initgraph(WIDTH, HEIGHT);
	CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)enemyControl, NULL, NULL, NULL);
	mciSendString("open 1.mp3", 0, 0, 0);
	mciSendString("play 1.mp3 repeat", 0, 0, 0);
	int s = 0;
	srand((unsigned int)time(NULL));
	do {
		m = rand() % ROW;
		n = rand() % COL;
	} while (map[m][n] == WALL || map[m][n] == ENEMY);
	BeginBatchDraw();
	initMap();
	while (life) {
		drawMap();
		do {
			m = rand() % ROW;
			n = rand() % COL;
		} while (map[m][n] == WALL);
		if (t1 - t2 >= 150) {
			movePlayer();
			t2 = t1;
		}
		if (t3 - t4 >= speed) {
			moveEnemy();
			t4 = t3;
		}
		if (t5 - t6 >= 10000 && willGo == false) {
			willGo = true;
			t6 = t5;
		}
		t1 = GetTickCount64();
		t3 = GetTickCount64();
		t5 = GetTickCount64();
		keyDown();
		//enemyControl();
		if (isWin()) {
			s++;
			if (s == 3) {
				mciSendString("close 1.mp3", 0, 0, 0);
				mciSendString("open 2.mp3", 0, 0, 0);
				mciSendString("play 2.mp3", 0, 0, 0);
				break;
			}
		}
		FlushBatchDraw();
	}
	EndBatchDraw();
	closegraph();
	return 0;
}

嘿嘿,竟然真的有人看完了整篇博客?欸嘿,那肯定要送一点福利呀,简单给个预告,下一篇很可能是关于flappy bird的游戏的,大家敬请期待

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++小盆友

你的鼓励将是我创作的最大动力呦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值