走迷宫程序(含自动迷宫生成)_第1页
走迷宫程序(含自动迷宫生成)_第2页
走迷宫程序(含自动迷宫生成)_第3页
走迷宫程序(含自动迷宫生成)_第4页
走迷宫程序(含自动迷宫生成)_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、迷宫程序。执行效果如下:程序间有足够多的注释,就不多作介绍了。代码如下:/ 程序名称:迷宫 游戏/ 编译环境:Visual C+ 6.0 / 2010,EasyX 2011惊蛰版/ 作者:krissi / 最后修改:2011-3-12/#include #include #include / 定义全局变量/BYTE*g_imgMap = NULL;/ 迷宫地图SIZEg_szMap;/ 迷宫地图的尺寸IMAGEg_imgSight(360, 280);/ 游戏的视野RECTg_rtSight;/ 游戏的视野的范围IMAGEg_imgItem(180, 20);/ 地图元素IMAGEg_imgG

2、PS;/ 迷你地图,用于显示游戏者在地图中的位置POINTg_ptGPS;/ 迷你地图的显示位置SIZEg_szGPS;/ 迷你地图的尺寸POINTg_ptPlayer;/ 游戏者的位置/ 枚举地图元素,兼做元素位置的 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 ;/ 枚举用户的控制命

3、令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 ;/ 函数声明/voidWelcome();/ 绘制游戏界面voidInitImage();/ 初始化游戏图片voidInitGame();/ 初始化游戏数据voidGetMazeSize();/ 提示用户输入迷宫大小voidMakeMaze(int width, int hei

4、ght);/ 生成迷宫:初始化(注:宽高必须是奇数)voidTravelMaze(int x, int y);/ 生成迷宫:遍历 (x, y) 四周MAPITEMGetMazeItem(int x, int y);/ 获取指定坐标的迷宫元素voidPaint();/ 绘制视野范围内的迷宫intGetCmd(int* c);/ 获取用户输入的命令voidDispatchCmd(int cmd);/ 处理用户输入的命令voidOnUp();/ 向上移动voidOnLeft();/ 向左移动voidOnRight();/ 向右移动voidOnDown();/ 向下移动voidOnMark(MAPIT

5、EM value);/ 在地图中做标记boolCheckWin();/ 检查是否到出口boolQuit();/ 询问用户是否退出游戏/ 函数定义/ 主程序void main()/ 初始化initgraph(640, 480);/ 创建绘图窗口srand(unsigned)time(NULL);/ 设置随机种子/ 显示主界面Welcome();/ 初始化InitImage();InitGame();/ 游戏过程int c;while( !(GetCmd(&c) = CMD_QUIT) & Quit() )DispatchCmd(c);Paint();if (CheckWin()break;/ 延

6、时Sleep(100);/ 清理迷宫地图占用的内存for(int x = 0; x g_szMap.cx + 2; x+)delete g_imgMapx;delete g_imgMap;/ 关闭图形模式closegraph();/ 绘制游戏界面void Welcome()/ 绘制渐变色外框for(int i=0; i128; i+)setcolor(RGB(0, 0, (127 - i) 1), 490 + i, 370 + (i 1);/ 设置字体样式setcolor(WHITE);setbkmode(TRANSPARENT);/ 绘制标题setfont(36, 0, _T(宋体);out

7、textxy(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:退出程序);/ 初始化游戏图片void InitImage()/ 预绘制游戏图片到 IMAGE 缓存(可以修改为加载图片以获得更好效果)SetW

8、orkingImage(&g_imgItem);cleardevice();/ 绘制 PLAYERsetorigin(MAP_PLAYER, 0);setfillstyle(YELLOW);setcolor(YELLOW);fillellipse(2, 2, 17, 17);setcolor(BLACK);line(7, 7, 7, 8);line(12, 7, 12, 8);arc(5, 6, 14, 14, 3.34, 6.08);/ 绘制墙壁setorigin(MAP_WALL, 0);setfillstyle(BROWN, PATTERN_FILL, x20x20x20xffx04x0

9、4x04xff);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);

10、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(出);/ 绘制迷宫外面的空地se

11、torigin(MAP_OUTSIDE, 0);setfillstyle(GREEN, PATTERN_FILL, x50x55x22x20x05x55x22x02);bar(0, 0, 19, 19);/ 恢复坐标系setorigin(0, 0);/ 显示作者SetWorkingImage();setcolor(BLUE);TCHAR author = _T(Powered by zhaoh1987);outtextxy(471, 4, author);setcolor(LIGHTBLUE);outtextxy(470, 3, author);/ 初始化游戏数据void InitGame()

12、/ 提示用户输入迷宫大小GetMazeSize();/ 初始化参数if (g_imgMap != NULL)/ 清理迷宫地图占用的内存for(int x = 0; x g_szMap.cy)g_szGPS.cx = 100; g_szGPS.cy = (int)(100.0 * g_szMap.cy / g_szMap.cx + 0.5);elseg_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

13、.x = 530 + 50 - g_szGPS.cx / 2;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);/ 画迷你地图入口和出口setcolor(YELLOW);moveto(g_ptGPS.x - 8, g_ptGPS.y + g_szGPS.cy / g_szMap.cy);linerel(7, 0);linerel(-3, -3);mo

14、verel(3, 3);linerel(-3, 3);moveto(g_ptGPS.x + g_szGPS.cx, g_ptGPS.y + g_szGPS.cy - g_szGPS.cy / g_szMap.cy);linerel(7, 0);linerel(-3, -3);moverel(3, 3);linerel(-3, 3);/ 绘制游戏区Paint();/ 提示用户输入迷宫大小void GetMazeSize()g_szMap.cx = g_szMap.cy = 0;/ 获取用户输入的宽高TCHAR s4;while(g_szMap.cx 200)InputBox(s, 4, _T(请

15、输入迷宫的宽度n范围:20200), _T(输入), _T(25);g_szMap.cx = _ttoi(s);while(g_szMap.cy 200)InputBox(s, 4, _T(请输入迷宫的高度n范围:20200), _T(输入), _T(25);g_szMap.cy = _ttoi(s);/ 确保宽高为奇数if (g_szMap.cx % 2 != 1) g_szMap.cx+;if (g_szMap.cy % 2 != 1) g_szMap.cy+;/ 生成迷宫:初始化(注:宽高必须是奇数)void MakeMaze(int width, int height)if (widt

16、h % 2 != 1 | height % 2 != 1)return;int x, y;/ 定义迷宫尺寸,并分配迷宫内存g_imgMap = new BYTE*width + 2;for(x = 0; x width + 2; x+)g_imgMapx = new BYTEheight + 2;memset(g_imgMapx, MAP_WALL, height + 2);/ 定义边界for (x = 0; x = width + 1; x+)g_imgMapx0 = g_imgMapxheight + 1 = MAP_GROUND;for (y = 1; y = height; y+)g_

17、imgMap0y = g_imgMapwidth + 1y = MAP_GROUND;/ 定义入口和出口g_imgMap12 = MAP_ENTRANCE;g_imgMapwidthheight - 1 = MAP_EXIT;/ 从任意点开始遍历生成迷宫TravelMaze(rand() % (width - 1) & 0xfffe) + 2, (rand() % (height - 1) & 0xfffe) + 2);/ 将边界标记为迷宫外for (x = 0; x = width + 1; x+)g_imgMapx0 = g_imgMapxheight + 1 = MAP_OUTSIDE;

18、for (y = 1; y = height; y+)g_imgMap0y = g_imgMapwidth + 1y = MAP_OUTSIDE;/ 生成迷宫:遍历 (x, y) 四周void TravelMaze(int x, int y)/ 定义遍历方向int d42 = 0, 1, 1, 0, 0, -1, -1, 0;/ 将遍历方向乱序int n, t, i;for(i = 0; i 4; i+)n = rand() % 4;t = di0, di0 = dn0, dn0 = t;t = di1, di1 = dn1, dn1 = t;/ 尝试周围四个方向g_imgMapxy = MA

19、P_GROUND;for(i = 0; i 4; i+)if (g_imgMapx + 2 * di0y + 2 * di1 = 0)g_imgMapx + di0y + di1 = MAP_GROUND;TravelMaze(x + di0 * 2, y + di1 * 2);/ 递归/ 获取指定坐标的迷宫元素MAPITEM GetMazeItem(int x, int y)return (MAPITEM)g_imgMapxy;/ 绘制视野范围内的迷宫void Paint()int x1, y1;/ 绘制视野内的迷宫SetWorkingImage(&g_imgSight);for(int x

20、 = g_rtSight.left; x = g_rtSight.right; x+)for(int y = g_rtSight.top; y 1 & GetMazeItem(g_ptPlayer.x, g_ptPlayer.y - 1) != MAP_WALL)g_ptPlayer.y-;if (g_ptPlayer.y - g_rtSight.top 0)g_rtSight.top-;g_rtSight.bottom-;/ 向左移动void OnLeft()if (g_ptPlayer.x 1 & GetMazeItem(g_ptPlayer.x - 1, g_ptPlayer.y) !=

21、 MAP_WALL & GetMazeItem(g_ptPlayer.x - 1, g_ptPlayer.y) != MAP_ENTRANCE)g_ptPlayer.x-;if (g_ptPlayer.x - g_rtSight.left 0)g_rtSight.left-;g_rtSight.right-;/ 向右移动void OnRight()if (g_ptPlayer.x g_szMap.cx & GetMazeItem(g_ptPlayer.x + 1, g_ptPlayer.y) != MAP_WALL)g_ptPlayer.x+;if (g_rtSight.right - g_ptPlayer.x 5 & g_rtSight.right = g_szMap.cx)g_rtSigh

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论