版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026届湖南省邵阳市邵东一中化学高二上期末达标测试试题含答案
- 广东省惠州市2026届高一化学第一学期期中统考模拟试题含解析
- 2026届山东历城二中化学高一第一学期期中复习检测试题含解析
- 儿童节活动策划程序方案
- 电源产品质量风险分析与控制改进方案
- 2026年液体空分装置项目提案报告范稿
- IT服务外包合同范本解析
- 餐饮店节假日促销方案策划
- 2025中国教育地产行业市场开发策略及投资回报分析报告
- 产品故障解决方案设计框架模板
- 《安宁疗护》高职护理专业全套教学课件
- 神经符号融合推理机制-洞察阐释
- 口腔科一病一品护理汇报
- 学堂在线 不朽的艺术:走进大师与经典 章节测试答案
- 腹部损伤考试试题及答案
- 寝室卫生评比活动方案
- 2025储能电站全钒液流电池储能系统管理指南
- 信息软件业内部控制质量、股权结构与审计费用的关系研究
- 沪教版2024 九年级化学上册-《义务教育教材(2024版)》内容解读
- T/CMAM W-3-2022维吾尔医常见病诊疗指南外科
- 终止供暖协议书
评论
0/150
提交评论