朋友们啊!终于来了啊!
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将会加入奖励豆哦!
敬请期待下一篇吧!