编辑
2024-12-10
test
00
请注意,本文编写于 92 天前,最后修改于 92 天前,其中某些信息可能已经过时。

目录

代码说明文档
1. 代码运行方法
输入数据
输出数据
2. 核心功能介绍
3. 算法思想描述
深度优先搜索(DFS)
4. 程序结构
主要类和函数
5. 测试结果
测试环境
测试用例

代码说明文档

1. 代码运行方法

输入数据

  1. 迷宫地图文件

    • 格式:每行以空格分隔,值表示迷宫的组成元素。
      • 1:墙壁
      • 0:通路
    • 文件的最后一行提供起点 (sx, sy) 和终点 (ex, ey) 的坐标。
    • 示例文件内容:
      plaintext
      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 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
    • 代码片段:读取地图文件
      cpp
      Map(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; }
  2. 角色图片

    • 文件:reeshiram.jpg
    • 用途:用于在迷宫界面中显示角色。
    • 代码片段:加载角色图片
      cpp
      Roler(const char imageName[20]) { img = newimage(); if (!getimage(img, imageName)) { cerr << "角色图片加载失败!" << endl; exit(1); } }

输出数据

  1. 游戏结果

    • 输出到图形界面,显示 "GAME SUCCESS" 或 "GAME OVER"。
    • 代码片段:显示结果
      cpp
      void 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(); }
  2. 动态探索过程

    • 动态显示迷宫的探索状态,包括墙壁、通路、访问路径和回退路径。

2. 核心功能介绍

  1. 迷宫绘制

    • 动态绘制迷宫结构,颜色区分不同状态。
    • 代码片段:动态绘制迷宫
      cpp
      void 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); } } }
  2. 角色动态显示

    • 使用角色图片表示当前探索位置。
    • 代码片段:绘制角色
      cpp
      void drawRoler() { putimage(x * 20, y * 20, 20, 20, img, 0, 0, getwidth(img), getheight(img)); }
  3. 自动求解功能

    • 利用栈和深度优先搜索(DFS)实现迷宫求解。
    • 代码片段:自动求解
      cpp
      int 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; }

3. 算法思想描述

深度优先搜索(DFS)

  • 数据结构:利用栈记录当前路径。
  • 探索过程
    1. 从起点出发,沿一个方向前进,找到可通行的路径时,标记为访问过。
    2. 如果无路可走,回退到上一个节点并尝试其他方向。
    3. 终止条件:到达终点或栈为空。

4. 程序结构

主要类和函数

  1. Map 类:读取迷宫文件并绘制地图。
  2. Roler 类:加载角色图片并动态显示角色。
  3. GameInfo 类:显示游戏信息和结果。
  4. 核心函数 AutoSearch:实现迷宫求解。

5. 测试结果

测试环境

  • 系统:Windows 11
  • 工具:EGE 图形库,Dev-C++ 5.15
  • 输入:mazeMap1.txtmazeMap2.txtreeshiram.jpg

测试用例

  1. 正确迷宫:输出 "GAME SUCCESS"。
  2. 无解迷宫:输出 "GAME OVER"。
  3. 错误文件路径:程序退出并显示错误信息。

本文作者:Reeshiram

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!