走迷宫程序(含自动迷宫生成)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
////////////////////////////////////////////////////// // 函数声明 // void Welcome();
// 绘制游戏界面 void InitImage(); 游戏图片 void InitGame();
// 初始化游戏数据 void GetMazeSize(); 户输入迷宫大小
迷宫程序。执行效果如下:
程序间有足够多的注释,就不多作介绍了。代码如下: /////////////////////////////////////////////////// // 程序名称:迷宫 游戏 // 编译环境:Visual C++ 6.0 / 2010,EasyX 2011 惊蛰版 // 作 者:krissi <zhaoh1987@qq.com> // 最后修改:2011-3-12 // #include <graphics.h> #include <conio.h> #include <time.h>
// 设置游 // 设置视
g_rtSight.bottom= 13;
// 设置 GPS 显示区
setfillstyle(BLUE);
bar(522, 368, 637, 471);
if (g_szMap.cx > g_szMap.cy)
{
g_szGPS.cx = 100;
g_szGPS.cy = (int)(100.0 * g_szMap.cy / g_szMap.cx + 0.5); }
g_szMap.cy);
linerel(7, 0); linerel(-3, -3); moverel(3, 3); linerel(-3, 3);
setfillstyle(GREEN, PATTERN_FILL, "\x50\x55\x22\x20\x05\x55\x22\x02");
bar(0, 0, 19, 19); // 恢复坐标系 setorigin(0, 0);
// 显示作者 SetWorkingImage(); setcolor(BLUE); TCHAR author[] = _T("Powered by zhaoh1987@qq.com"); outtextxy(471, 4, author); setcolor(LIGHTBLUE); outtextxy(470, 3, author); }
// 设置字体样式 setcolor(WHITE); setbkmode(TRANSPARENT);
// 绘制标题 setfont(36, 0, _T("宋体")); outtextxy(248, 40, _T("迷 宫"));
// 绘制操作说明 setfont(12, 0, _T("宋体")); outtextxy(50, 382, _T("控制说明:")); outtextxy(74, 400, _T("方向键或 A/S/D/W:移动")); outtextxy(74, 418, _T("空格、Y、G:在地图上做红、黄、绿色 M 标记")); outtextxy(74, 436, _T("C:清除地图上的标记")); outtextxy(74, 454, _T("ESC:退出程序")); }
else
{
g_szGPS.cy = 100; g_szGPS.cx = (int)(100.0 * g_szMap.cx / g_szMap.cy
+ 0.5); }
Resize(&g_imgGPS, g_szGPS.cx, g_szGPS.cy);
g_ptGPS.x = 530 + 50 - g_szGPS.cx / 2;
setcolor(YELLOW);
moveto(g_ptGPS.x - 8, g_ptGPS.y + g_szGPS.cy / g_szMap.cy);
linerel(7, 0); linerel(-3, -3); moverel(3, 3); linerel(-3, 3);
moveto(g_ptGPS.x + g_szGPS.cx, g_ptGPS.y + g_szGPS.cy - g_szGPS.cy /
DispatchCmd(c); Paint(); if (CheckWin())
break;
// 延时 Sleep(100); }
// 清理迷宫地图占用的内存 for(int x = 0; x < g_szMap.cx + 2; x++)
delete[] g_imgMap[x]; delete [] g_imgMap;
பைடு நூலகம்
// 获取指定坐标的
迷宫元素
void Paint();
// 绘制视
野范围内的迷宫
int
GetCmd(int* c);
// 获取用户输入的命令
void DispatchCmd(int cmd);
// 处理用户输入的
命令
void OnUp();
// 向上移动
void OnLeft();
// 向左移动
void OnRight();
RECT g_rtSight;
// 游戏的视野的范
围
IMAGE g_imgItem(180, 20);
// 地图元素
IMAGE g_imgGPS;
// 迷你地图,用于显
示游戏者在地图中的位置
POINT g_ptGPS;
// 迷你地图的显示位置
SIZE g_szGPS;
// 迷你地图的尺寸
POINT g_ptPlayer;
// 初始化 // 提示用
void MakeMaze(int width, int height); // 生成迷宫:初始化(注:宽高必须是奇
数)
void TravelMaze(int x, int y);
// 生成迷宫:遍历
(x, y) 四周
MAPITEM GetMazeItem(int x, int y);
g_ptGPS.y = 370 + 50 - g_szGPS.cy / 2;
// 画迷你地图外框
setcolor(RED);
rectangle(g_ptGPS.x - 1, g_ptGPS.y - 1, g_ptGPS.x + g_szGPS.cx,
g_ptGPS.y + g_szGPS.cy);
// 画迷你地图入口和出口
delete [] g_imgMap;
}
MakeMaze(g_szMap.cx, g_szMap.cy);
// 创建迷宫
g_ptPlayer.x
= 2;
戏者的位置
g_ptPlayer.y
= 2;
g_rtSight.left = 0;
野范围
g_rtSight.top = 0;
g_rtSight.right = 17;
// 初始化游戏图片 void InitImage() {
// 预绘制游戏图片到 IMAGE 缓存(可以修改为加载图片以获得更好效果) SetWorkingImage(&g_imgItem); cleardevice(); // 绘制 PLAYER setorigin(MAP_PLAYER, 0); setfillstyle(YELLOW); setcolor(YELLOW); fillellipse(2, 2, 17, 17); setcolor(BLACK); line(7, 7, 7, 8);
// 初始化游戏数据 void InitGame() {
// 提示用户输入迷宫大小 GetMazeSize();
// 初始化参数
if (g_imgMap != NULL)
{
// 清理迷宫地图占用的内存
for(int x = 0; x < g_szMap.cx + 2; x++)
delete[] g_imgMap[x];
line(12, 7, 12, 8); arc(5, 6, 14, 14, 3.34, 6.08); // 绘制墙壁 setorigin(MAP_WALL, 0); setfillstyle(BROWN, PATTERN_FILL, "\x20\x20\x20\xff\x04\x04\x04\xff"); setcolor(BROWN); bar(1, 1, 18, 18); rectangle(0, 0, 19, 19); // 绘制红色标记 setorigin(MAP_MARKRED, 0); setcolor(RED); moveto(5, 15); linerel(0, -10); linerel(5, 5); linerel(5, -5); linerel(0, 10); // 绘制绿色标记 setorigin(MAP_MARKGREEN, 0); setcolor(GREEN); moveto(5, 15); linerel(0, -10); linerel(5, 5); linerel(5, -5); linerel(0, 10); // 绘制黄色标记 setorigin(MAP_MARKYELLOW, 0); setcolor(YELLOW); moveto(5, 15); linerel(0, -10); linerel(5, 5); linerel(5, -5); linerel(0, 10); // 绘制入口 setorigin(MAP_ENTRANCE, 0); setcolor(GREEN); setfont(12, 0, _T("宋体")); outtextxy(4, 4, _T("入")); // 绘制出口 setorigin(MAP_EXIT, 0); outtextxy(4, 4, _T("出")); // 绘制迷宫外面的空地 setorigin(MAP_OUTSIDE, 0);
// 游戏者的位置
// 枚举地图元素,兼做元素位置的 x 坐标 enum MAPITEM { MAP_WALL = 0, MAP_PLAYER = 20, MAP_GROUND = 40, MAP_MARKRED = 60, MAP_MARKGREEN = 80, MAP_MARKYELLOW = 100, MAP_ENTRANCE = 120, MAP_EXIT = 140, MAP_OUTSIDE = 160 }; // 枚举用户的控制命令 enum CMD { CMD_QUIT = 1, CMD_UP = 2, CMD_DOWN = 4, CMD_LEFT = 8, CMD_RIGHT = 16, CMD_MARKRED = 32, CMD_MARKGREEN = 64, CMD_MARKYELLOW = 128, CMD_CLEARMARK = 256 };
// 向右移动
void OnDown();
// 向下移动
void OnMark(MAPITEM value);
// 在地图中做标记
bool CheckWin();
// 检查是否到出口
bool Quit();
// 询问用户是否退出游戏
////////////////////////////////////////////////////// // 函数定义 //
// 主程序 void main() {
// 初始化
initgraph(640, 480); srand((unsigned)time(NULL));
// 创建绘图窗口 // 设置随机种子
// 显示主界面 Welcome();
// 初始化 InitImage(); InitGame();
// 游戏过程 int c; while( !((GetCmd(&c) == CMD_QUIT) && Quit()) ) {
// 关闭图形模式 closegraph(); }
// 绘制游戏界面 void Welcome() {
// 绘制渐变色外框
for(int i=0; i<128; i++) {
setcolor(RGB(0, 0, (127 - i) << 1)); rectangle(149 - i, 109 - (i >> 1), 490 + i, 370 + (i >> 1)); }
//////////////////////////////////////////////////////
// 定义全局变量
//
BYTE** g_imgMap = NULL;
// 迷宫地图
SIZE g_szMap;
// 迷宫地图的尺寸
IMAGE g_imgSight(360, 280);
// 游戏的视野