版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、迷宫程序。执行效果如下:16Powered by zha.olil9o7qq. com迷 宫.gAJSMMMWMME ix需iv冬£«焉丸彭多£%策«彭w篦«幕V VYVYV wv vvozzrIZ存OZ控制说明:方向键或A/S/D/W :移动空格、Y、G :在地甸上做红“萤、绿色M标记C:涪除地因上的标记ESC :退出程序程序间有足够多的注释,就不多作介绍了。代码如下:/程序名称:迷宫游戏/ 编译环境:Visual C+ 6. 0 / 2010, EasyX 2011 惊蛰版/ 作 者:krissi zhaohl987>/最后修改:20
2、11-3-12/include <graphicsh荐include <conio h>include <time. h>/定义全局变量BYTE*g.imgMap = NULL;/迷宫地图SIZEg.szMap;/迷宫地图的尺寸IMAGEg.imgSight(360, 280);/游戏的视野RECTg.rtSight;/游戏的视野的范圉IMAGEg_imgItem(180, 20);/地图元素IMAGEg.imgGPS;/迷你地图,用于显示游戏者在地图中的位置POINTjptGPS;/迷你地图的显示位置SIZEg.szGPS;/迷你地图的尺寸POINTg_j)tP
3、layer;/游戏者的位置/枚举地图元素,兼做元素位置的X坐标enum MAPITEM MAP.WALL = 0, MAP_PLAYER = 20, MAP_GR0UND = 40, NfAPJIARKRED = 60, MAP.MARKGREEN = 80, NfAP.MARKYELLOW = 100, MAP.ENTRANCE = 120, MAP_EXIT = 140, NtAP.OUTSIDE =160 ;/枚举用户的控制命令enum CMD CMD_QUIT = 1, CMDJJP = 2、CMD_D0WN = 4, CMD.LEFT = & CMD.RIGHT = 16,
4、CMDJIARKRED =32, CMD_MARKGREEN = 64, CNfD.MARKYELLOW = 128, CMD.CLEARMARK = 256 ;/函数声明voidWelcome 0;/绘制游戏界面void游戏图片InitlmageO ;/ 初始化voidInitGameO ;/初始化游戏数据voidGetMazeSize 0 ;/ 捉示用户输入迷宫人小voidMakeMaze(int width, int height);/生成迷宫:初始化(注:宽高必须是奇voidTravelMaze(int x, int y);MAPITEMGetMazeItem(int x, int y
5、)voidPaint 0;野范围内的迷宫intGetCmd(int* c);/获取用户输入的命令voidDispatchCmd(int cmd);命令voidOnUp ();/向上移动voidOnLeft0;动voidOnRight0;/向右移动voidOnDown ();动voidOnMark(MAPITEM value);boolCheckWin ();/检查是否到岀口boolQuitO;/询问用户是否退出游戏数)/生成迷宫:遍历(x, y)四周/获取指定坐标的迷宫元素/绘制视/处理用户输入的/向左移/向下移/在地图中做标记I/I/I/I/III/II/I/I/I/I/I/I/I/I/I/
6、I/I/I/函数定义/主程序void mainO/初始化initgraph (640, 180);srand(unsigned)time(NULL);/创建绘图窗口/设置随机种r显示主界面Welcome ();/初始化InitlmageO ;InitGameO;/游戏过程int c;while( !(GetCmd(&c) = CMD.QUIT) && QuitO)DispatchCmd(c);Paint ();if (CheckWin 0)break;/延时Sleep(100);/淸理迷宫地图占用的内存for(int x = 0; x < g_szMapex +
7、2; x+牛)deleted g.imgMapx;delete g.imgMap;/关闭图形模式closegraph();/绘制游戏界面void Welcome ()/绘制渐变色外框for(int i=0; i<128; i卄)setcolor (RGB (0, 0, (127 - i) « D);rectangle(149 - i, 109 一 (i » 1), 490 + i, 370 + (i » D); /设置字体样式setcolor(raiTE);setbkmode仃RANSPARENT);/绘制标题setfont (36, 0,("宋体
8、");outtextxy(24& 40, _T("迷宫");setfont (12, 0,("宋体");outtextxy(50, 382,outtextxy(74, 400,outtextxy(74, 41&outtextxy(74, 436,outtextxy(74, 454,/绘制操作说明_TC控制说明:0);_T("方向键或A/S/D/W:移动");("空格、Y、G:在地图上做红、黄、绿色M标记");_T("C:清除地图上的标记");_T("ESC:退
9、出程序");/初始化游戏图片void InitImage()/预绘制游戏图片到IMAGE缓存(可以修改为加载图片以获得更好效果)SetWorkinglmage(&g_imgltem);cleardevice 0;/ 绘制 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);
10、/绘制墙壁setorigin(MAP_WALL, 0);setfillstyle(BROWN, PATTERN.FILL, setcolor(BROWN);bar(l, 1, 1& 18);rectangle (0, 0, 19, 19);/绘制红色标记setorigin(MAP.MARKRED, 0); setcolor(RED);moveto(5, 15);linerel(0, TO); linerel(5, 5);10);/绘制绿色标记setorigin(MAPJfARKGREEN, 0); setcolor(GREEN);moveto(5, 15);linerel(0, TO)
11、; linerel(5, 5); 10);/绘制黄色标记setorigin(MAP.MARKYELLOW, 0); setcolor(YELLOW);moveto(5, 15);linerel(0, TO); linerel (5, 5);10);/绘制入口setorigin(MAP.ENTRANCE, 0); setcolor(GREEN);setfont (12, 0, _T("宋体"); outtextxy (4, 4, _T ("入"); /绘制出口setorigin(MAP_EXIT, 0);outtextxy(4, 4, _T("出
12、");/绘制迷宫外面的空地setorigin(NfAP.OUTSIDE, 0); setfillstyle(GREEN, PATTERN.FILL, bar (0, 0, 19, 19);"x20x20x20xffx04x04x04xff");linerel(5,-5);linerel(0linerel(5,-5);linerel(0linerel(5,-5);linerel(0"x50x55x22x20x05x55x22x02");/恢复坐标系setorigin(0, 0);/显示作者SetWorkinglmage();setcolor(BL
13、UE);TCHAR author = _T ("'Powered by zhaohl987qq. com,z); outtextxy(471, 4, author);setcolor(LIGHTBLUE);outtextxy(470, 3, author);/初始化游戏数据void InitGameO/提示用户输入迷宫大小GetMazeSize ();/初始化参数if (g.imgMap != NULL)/清理迷宫地图占用的内存for(int x = 0; x < g_szMapex + 2; x+)delete g_imgMaplx;delete g_imgMap:M
14、akeMaze(g_szMap. ex, g_szMap. cy);/ 创建迷宫/设置游/设置视g_ptPlayerx = 2; 戏者的位置gptPlayery=2;g.rtSightleft=0;野范围g_rtSight .top=0;g_rtSight .right=17;g_rtSightbottom二 13;/设置GPS显示区 setfillstyle(BLUE);bar (522, 36& 637, 471);if (g.szMap ex > g_szMap cy)g_szGPS ex = 100; g_szGPS cy =(int) (100. 0 * g_szMap
15、. cy / g_szMap. ex + 0 5); elseg_szGPS cy = 100; g_szGPS ex = (int) (100. 0 * g_szMap. ex / g.szMap. cy + 0. 5); Resize(&g_imgGPS, g_szGPS ex, g.szGPS cy);g_ptGPS. x = 530 + 50 - g_szGPSex / 2;g_ptGPS. y = 370 + 50 - g_szGPScy / 2;/画迷你地图外框setcolor(RED);rectangle (g_ptGPS. x - 1, g_ptGPS. y - 1,
16、g_ptGPS. x + g_szGPS. ex, g_ptGPS. y + jszGPS. cy);/画迷你地图入口和出口setcolor(YELLOW);moveto(g_ptGPSx - 8, gptGPSy + g.szGPScy / g_szMapcy);linerel (7, 0); linerel(-3, -3); moverel(3, 3); linerel (-3, 3);moveto(g_ptGPSx + g_szGPSex, g_ptGPSy + g_szGPScy 一 g_szGPScy / g.szMap cy);linerel (7, 0); linerel (-3
17、, -3); moverel (3, 3); linerel (-3, 3);/绘制游戏区Paint 0;/提示用户输入迷宫人小void GetMazeSizeOg.szMapex = g_szMapcy = 0;/获取用户输入的宽高TCHAR s4;while(g.szMap. ex < 20 g_szMap. ex > 200)InputBox(s, 4, _T("请输入迷宫的宽度n范围:20200"), _TC输入TC25"); g_szMap ex = _ttoi(s);while(g.szMap. cy < 20 g_szMap. ex
18、 > 200)InputBox(s, 4, _T(*请输入迷宫的高度n范围:20200"), _T("输入"), _TC25*);g_szMap cy = _ttoi(s);/确保宽高为奇数if (g.szMapex % 2 != 1) g_szMapcx+;if (g.szMapcy % 2 != 1) g_szMapcy+;/生成迷宫:初始化(注:宽髙必须是奇数)void MakeMazeCint width, int height)if (width % 2 != 1 height % 2 != 1)return;int x, y;/定义迷宫尺寸,并分
19、配迷宫内存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_imgMap0y = g_imgMapwidth + 1y = MAP_GROUND;/
20、定义入口和出口g.imgMa讥12 = MAP_EXTRANCE;g.imgMapwidthheight - 1 = MAP.EXIT:/从任总点开始遍历生成迷宫TravelMaze(randO % (width - 1) & Oxfffe) + 2, (randO % (height - 1) & Oxfffe) + 2);/将边界标记为迷宫外for (x = 0; x <= width + 1: x+)g_imgMapx01 = g_imgMaplxheight + 1 = MAP_OUTSIDE;for (y = 1; y <= height; y+)g_im
21、gMap0y = g_imgMapwidth + 1y = MAP_OUTSIDE;/生成迷宫:遍历( y)四周void TravelMaze(int x, int y)/定义遍历方向int d4 2 = 0, 1, 1, 0, 0, -1, -1, 0;/将遍历方向乱序int n, t, i;for(i = 0; i < 4; i+)n = randO % 4;t = di 0, di 0 = dn 0, dn 0 = t;t = dil, dil = dn 1, dnl = t;/尝试周圉四个方向g.imgMapZxZy = MAP_GROUND;for(i = 0; i <
22、4; i+)if (g.imgMapx + 2 * di0y + 2 * di1 = 0) g_imgMapx + di 0叮y + dil = MAP.GROUXD; TravelMaze(x + di0 * 2, y + di1 * 2);/递归/获取指定坐标的迷宫元素MAPITEM GetMazeItem(int x, int y)return (MAPITEM)g.imgMaplxZy;/绘制视野范圉内的迷宫void Paint ()int xl, yl;/绘制视野内的迷宫SetWorkinglmage(&g_imgSight);for(int x = g_rtSight1ef
23、t; x <= g_rtSight .right; x+)for(int y = g_rtSight.top; y <= g_rtSight.bottom; y+)xl = (x - g_rtSight. left) * 20;yl = (y - g_rtSight. top) * 20;putimage(xl, yl, 20, 20, &g_imgltem, GetMazeItem(x, y), 0): /绘制游戏者xl = (g_ptPlayer. x - grtSight. left) * 20;yl = (gptPlayery 一 g_rtSighttop) * 2
24、0;putimage(xl, yl, 20, 20, &g.imgltem, MAP_PLAYER, 0);/绘制迷你地图SetWorkinglmage(&g_imgGPS); cleardevice 0;int tx = (int)(g_ptPlayerx 一 1) * g_szGPSex / (double)(g_szMapex 一 1) + 0. 5);int ty = (int)(g_ptPlayer y 一 1) * g_szGPS cy / (double)(g_szMap cy 一 1) +0. 5);setcolor(YELLOW);circle (tx, ty
25、, 1);/更新到绘图窗口SetWorkinglmage 0;putimage(150, 110, 340, 260, &g.imgSight, 10, 10);putimage(g_ptGPS x, g_ptGPS y, &g.imgGPS);/获取用户输入的命令 int GetCmd(int *c)*c = 0;if(GetAsyncKeyState(VK_LEFT)&0x8000)*c1=CMD_LEFT;if(GetAsyncKeyState(VK_RIGHT)&0x8000)*c=CMD_RIGHT;if(GetAsyncKeyState(VK_IT)
26、&0x8000)*c1=CMD_IT;if(GetAsyncKeyState(VK_D0WN)&0x8000)*c=CMD_D0WN;if(GetAsyncKeyState (' A')&0x8000)*c1=CMD_LEFT;if(GetAsyncKeyState (' D)&0x8000)*c=CMD_RIGHT;if(GetAsyncKeyState (' W)&0x8000)*c1=CMD_IT;if(GetAsyncKeyState (' S')&0x8000)*c=CMD_D0WN;if
27、(GetAsyncKeyState(?')&0x8000)*c1=CMD_MARKRED;if(GetAsyncKeyState (' G)&0x8000)*c=CMD.MARKGREEN;if(GetAsyncKeyState (? Y')&0x8000)*c1=CNfD.MARKYELLOW;if(GetAsyncKeyState (? C)&0x8000)*c1=CMD_CLEARMARK;if(GetAsyncKeyState(VK_ESCAPE)&0x8000)*c1=CMD_QUIT;return *c;/处理用户输入
28、的命令void DispatchCmd(int cmd)OnUp 0 ;OnDown ();OnLeft0;OnRightO;OnMark(MAP.MARKRED);OnMark (MAPJIARKGREEN);OnMark (MAPJIARKLLOW);OnMark(MAP.GROUND);if (cmd & CMD_UP)if (cmd & CMD.DOWN)if (cmd & CMD.LEFT)if (cmd & CMD.RIGHT)if (cmd & CMDJfARKRED)if (cmd & CMDJtARKGREEN)if (cmd
29、& CMDJfARKYELLOW)if (cmd & CMD.CLEARMARK)/向上移动void OnUp 0if (gj>tPlayery > 1 && GetMazeItem(g_ptPlayer x, g_ptPla5rery - 1) !=MAP.WALL)g_ptPlayer y;if (gjtPlayer y 一 g_rtSight top 4 && g_rtSight top > 0)g_rtSight top;g_rtSight bottom-一;/向左移动void OnLeft 0 if (g_ptPlayerx > 1 && GetMazeItem(g_ptPlayerx - 1, g_ptPlayery) !=MAP.WALL && GetMazeItem(g_ptPlayer. x - 1, gj?tPlayer. y) != MAP.ENTRANCE)g_ptPlayer x;if (gptPlayer. x - g_rtSight. left < 5 && g_rtSight. left > 0)g_rtSightleft;g_rtSight ri
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 开源软件在数字教育资源开发中的技术创新与教育信息化投资研究教学研究课题报告
- 汉字笔画节奏与建筑立面韵律的跨学科研究课题报告教学研究课题报告
- 2025年工作地在合川备考题库重庆一国企招聘有答案详解
- 3D打印导板在颅骨修补术中的辅助设计
- 2026年德州市第六人民医院公开招聘备案制工作人员45人备考题库完整参考答案详解
- 2025年芒市国富备考题库科技有限公司招聘备考题库及1套完整答案详解
- 人工智能编程教育在中小学的跨学科课程体系构建与实施研究教学研究课题报告
- 广东翁源2026年第一批公开招聘教师暨公开选聘教师备考题库参考答案详解
- 2025年人和中学招聘非编教师备考题库带答案详解
- 2025年复旦大学经济学院招聘经济学院院务办公室行政秘书岗位1名备考题库及答案详解一套
- 钢筋桁架楼承板专项施工方案
- 非开挖顶管合同范本
- 专家讲座的协议书
- 雨课堂学堂在线学堂云民族学导论专题中央民族大学单元测试考核答案
- 【语文】小学一年级上册期末质量试卷
- 2026元旦班级联欢晚会活动主题班会:星光闪耀迎新夜 课件
- 2025年内蒙古行政执法人员资格认证考试题库真题库及答案
- 急性胰腺炎重症患者白蛋白输注方案
- 《产业经济学》课程论文选题、要求和评分标准
- 影视音乐赏析智慧树知到期末考试答案2024年
- 2021-2022学年北京市西城区五年级(上)期末数学试卷及参考答案
评论
0/150
提交评论