迷宫地图文件
1
:墙壁0
:通路(sx, sy)
和终点 (ex, ey)
的坐标。plaintext1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 ... 1 1 27 27
cppMap(const char mapFile[20]) {
ifstream fp;
fp.open(mapFile, ios::in);
if (!fp.is_open()) {
cerr << "地图文件打开失败!" << endl;
exit(1);
}
for (int j = 0; j <= M + 1; j++) {
for (int i = 0; i <= N + 1; i++) {
fp >> mg[i][j]; // 读取地图数据
}
}
fp >> sx >> sy >> ex >> ey; // 读取起点和终点坐标
fp.close();
x = sx;
y = sy;
}
角色图片
reeshiram.jpg
cppRoler(const char imageName[20]) {
img = newimage();
if (!getimage(img, imageName)) {
cerr << "角色图片加载失败!" << endl;
exit(1);
}
}
游戏结果
cppvoid showFinishInfo(int status) {
char temp[20];
setfont(24, 0, "微软雅黑");
setcolor(EGERGB(255, 255, 255));
cleardevice();
const int centerX = 400; // 窗口宽度的一半
const int centerY = 300; // 窗口高度的一半
if (status == GAMEOVER) {
outtextxy(centerX - textwidth("GAME OVER") / 2, centerY - textheight("GAME OVER") / 2, "GAME OVER");
} else if (status == GAMESUCCESS) {
outtextxy(centerX - textwidth("GAME SUCCESS") / 2, centerY - textheight("GAME SUCCESS") / 2, "GAME SUCCESS");
}
getch();
}
动态探索过程
迷宫绘制
cppvoid drawMap() {
int cellSize = 20; // 单元格大小
for (int n = 0; n <= N + 1; n++) {
for (int m = 0; m <= M + 1; m++) {
if (mg[m][n] == 1) {
setfillcolor(EGERGB(80, 80, 80)); // 墙壁颜色
} else if (mg[m][n] == 0) {
setfillcolor(EGERGB(100, 150, 200)); // 通路颜色
} else if (mg[m][n] == 2) {
setfillcolor(EGERGB(200, 100, 100)); // 访问路径
} else if (mg[m][n] == 3) {
setfillcolor(EGERGB(150, 50, 50)); // 回退路径
}
bar(m * cellSize + 1, n * cellSize + 1, m * cellSize + cellSize - 1, n * cellSize + cellSize - 1);
}
}
}
角色动态显示
cppvoid drawRoler() {
putimage(x * 20, y * 20, 20, 20, img, 0, 0, getwidth(img), getheight(img));
}
自动求解功能
cppint AutoSearch(Map *map, Roler *roler) {
Stack s;
Point pStart(map->sx, map->sy), pEnd(map->ex, map->ey), p;
s.Push(pStart);
map->mg[map->sx][map->sy] = 2;
int i, j, next;
while (!s.isEmpty()) {
s.getTop(p);
next = p.next;
if (p == pEnd) {
return 1; // 迷宫成功
}
while (next < 4) {
next++;
i = p.i;
j = p.j;
switch (next) {
case 0: j--; break; // 左
case 1: i--; break; // 上
case 2: j++; break; // 右
case 3: i++; break; // 下
}
if (map->mg[i][j] == 0) break; // 有新路径
}
if (next < 4) {
s.setNext(next);
p.i = i; p.j = j; p.next = -1;
s.Push(p);
map->mg[i][j] = 2;
} else {
s.Pop(p);
map->mg[p.i][p.j] = 3; // 回退路径
}
map->drawMap();
roler->drawRoler();
}
return 0;
}
Map
类:读取迷宫文件并绘制地图。Roler
类:加载角色图片并动态显示角色。GameInfo
类:显示游戏信息和结果。AutoSearch
:实现迷宫求解。mazeMap1.txt
、mazeMap2.txt
和 reeshiram.jpg
本文作者:Reeshiram
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!