VS2022 C++ EasyX EGE 游戏开发之吃豆人1.0

本文介绍了使用VS2022和EGE库开发吃豆人游戏的1.0版本,整个项目耗时约2小时,完全原创。开发过程中需要注意安装VS2022和EGE库,同时游戏素材需与代码同目录。作者呼吁读者点赞、关注并期待吃豆人2.0版的发布,将引入奖励豆元素。
摘要由CSDN通过智能技术生成

朋友们啊!终于来了啊!

VS2022 EGE 的吃豆人1.0版本

耗时大约2小时,完完全全自己写的!

这里注意!

1. VS2022 和 EGE 都需要自己安装!

2. 图片素材和音乐文件可以自己找,也可以加我好友问我要!

3. 图片和音乐必须和代码放在同一目录下!

4. VS2022 标准的安装必须有 “空项目” 可以创建!

上代码!

#include<time.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<graphics.h>
#include<mmsystem.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
int b=255;
int m=0, n=0;
int life = 999999;
int score = 0;
bool canGo = true;
bool isChange = true;
IMAGE img[8];
IMAGE Enemy[4];
IMAGE bean;
COLORREF color = RGB(0, 0, 0);
enum DIR {
	UP,
	DOWN,
	LEFT,
	RIGHT,
	NONE
};
enum TOOLS {
	WALL,
	PLAYER,
	SPACE,
	ENEMY,
	BEAN,
	ENEMYBEAN
};
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 x, y, spaceH;
	settextcolor(RGB(60, 10, b));
	settextstyle(25, 0, "华文行楷");
	sprintf_s(ch, "生命: %d          得分: %d", life, score);
	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);

	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] = ENEMYBEAN;
	}
}
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 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 movePlayer() {
	char c;
	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:
		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;
		}
	case BEAN:
		score++;
		map[player.x][player.y] = SPACE;
		player = next2;
		map[player.x][player.y] = PLAYER;
		player.flag = !player.flag;
		canGo = true;
		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:
		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;
		}
	case BEAN:
		score++;
		map[player.x][player.y] = SPACE;
		player = next;
		map[player.x][player.y] = PLAYER;
		player.flag = !player.flag;
		canGo = true;
		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] = PLAYER;
			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] = PLAYER;
			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] = PLAYER;
			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] = PLAYER;
			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] = PLAYER;
			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] = PLAYER;
			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 {
				map[enemy[i].x][enemy[i].y] = SPACE;
			}
			enemy[i] = next2;
			map[enemy[i].x][enemy[i].y] = ENEMY;
			break;
		case ENEMY:
		case ENEMYBEAN:
			break;
		case PLAYER:
			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;
			}
		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;
			}
			enemy[i] = next2;
			map[enemy[i].x][enemy[i].y] = ENEMYBEAN;
			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 {
					map[enemy[i].x][enemy[i].y] = SPACE;
				}
				enemy[i] = next;
				map[enemy[i].x][enemy[i].y] = ENEMY;
				break;
			case ENEMY:
			case ENEMYBEAN:
				break;
			case PLAYER:
				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;
				}	
			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;
				}
				enemy[i] = next;
				map[enemy[i].x][enemy[i].y] = ENEMYBEAN;
				break;
		}
	}
}
void enemyControl() {
	srand((unsigned int)time(NULL));
	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;
		}
	}
}
bool isWin() {
	for (int i = 0; i < ROW; i++) {
		for (int j = 0; j < COL; j++) {
			if (map[i][j] == BEAN) return false;
		}
	}
}
int main() {
	initgraph(WIDTH, HEIGHT);
	mciSendString("open 1.mp3", 0, 0, 0);
	mciSendString("play 1.mp3 repeat", 0, 0, 0);
	DWORD t1 = 0, t2 = 0;
	DWORD t3 = 0, t4 = 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 (1) {
		drawMap();
		do {
			m = rand() % ROW;
			n = rand() % COL;
		} while (map[m][n] == WALL);
		if (t1 - t2 >= 150) {
			movePlayer();
			t2 = t1;
		}
		if (t3 - t4 >= 600) {
			moveEnemy();
			t4 = t3;
		}
		t1 = GetTickCount();
		t3 = GetTickCount();
		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();
	char m = getchar();
	return 0;
}

600多行,谅解一下吧,开个VIP文章也没人会说我吧……

真心希望大家点个赞,加个关注,收个藏啊!

吃豆人2.0将会加入奖励豆哦!

敬请期待下一篇吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

C++小盆友

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

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

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

打赏作者

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

抵扣说明:

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

余额充值