走迷宫程序含自动迷宫生成.docx
- 文档编号:26742435
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:18
- 大小:19.98KB
走迷宫程序含自动迷宫生成.docx
《走迷宫程序含自动迷宫生成.docx》由会员分享,可在线阅读,更多相关《走迷宫程序含自动迷宫生成.docx(18页珍藏版)》请在冰豆网上搜索。
走迷宫程序含自动迷宫生成
迷宫程序。
执行效果如下:
程序间有足够多的注释,就不多作介绍了。
代码如下:
///////////////////////////////////////////////////
//程序名称:
迷宫游戏
//编译环境:
VisualC++/2010,EasyX2011惊蛰版
//作 者:
krissi>
//最后修改:
2011-3-12
//
#include<>
#include<>
#include<>
//////////////////////////////////////////////////////
//定义全局变量
//
BYTE**g_imgMap=NULL;//迷宫地图
SIZEg_szMap;//迷宫地图的尺寸
IMAGEg_imgSight(360,280);//游戏的视野
RECTg_rtSight;//游戏的视野的范围
IMAGEg_imgItem(180,20);//地图元素
IMAGEg_imgGPS;//迷你地图,用于显示游戏者在地图中的位置
POINTg_ptGPS;//迷你地图的显示位置
SIZEg_szGPS;//迷你地图的尺寸
POINTg_ptPlayer;//游戏者的位置
//枚举地图元素,兼做元素位置的x坐标
enumMAPITEM{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};
//枚举用户的控制命令
enumCMD{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(intwidth,intheight);//生成迷宫:
初始化(注:
宽高必须是奇数)
voidTravelMaze(intx,inty);//生成迷宫:
遍历(x,y)四周
MAPITEMGetMazeItem(intx,inty);//获取指定坐标的迷宫元素
voidPaint();//绘制视野范围内的迷宫
intGetCmd(int*c);//获取用户输入的命令
voidDispatchCmd(intcmd);//处理用户输入的命令
voidOnUp();//向上移动
voidOnLeft();//向左移动
voidOnRight();//向右移动
voidOnDown();//向下移动
voidOnMark(MAPITEMvalue);//在地图中做标记
boolCheckWin();//检查是否到出口
boolQuit();//询问用户是否退出游戏
//////////////////////////////////////////////////////
//函数定义
//
//主程序
voidmain()
{
//初始化
initgraph(640,480);//创建绘图窗口
srand((unsigned)time(NULL));//设置随机种子
//显示主界面
Welcome();
//初始化
InitImage();
InitGame();
//游戏过程
intc;
while(!
((GetCmd(&c)==CMD_QUIT)&&Quit()))
{
DispatchCmd(c);
Paint();
if(CheckWin())
break;
//延时
Sleep(100);
}
//清理迷宫地图占用的内存
for(intx=0;x<+2;x++)
delete[]g_imgMap[x];
delete[]g_imgMap;
//关闭图形模式
closegraph();
}
//绘制游戏界面
voidWelcome()
{
//绘制渐变色外框
for(inti=0;i<128;i++)
{
setcolor(RGB(0,0,(127-i)<<1));
rectangle(149-i,109-(i>>1),490+i,370+(i>>1));
}
//设置字体样式
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:
退出程序"));
}
//初始化游戏图片
voidInitImage()
{
//预绘制游戏图片到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);
line(12,7,12,8);
arc(5,6,14,14,,;
//绘制墙壁
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);
setfillstyle(GREEN,PATTERN_FILL,"\x50\x55\x22\x20\x05\x55\x22\x02");
bar(0,0,19,19);
//恢复坐标系
setorigin(0,0);
//显示作者
SetWorkingImage();
setcolor(BLUE);
TCHARauthor[]=_T("Poweredby");
outtextxy(471,4,author);
setcolor(LIGHTBLUE);
outtextxy(470,3,author);
}
//初始化游戏数据
voidInitGame()
{
//提示用户输入迷宫大小
GetMazeSize();
//初始化参数
if(g_imgMap!
=NULL)
{//清理迷宫地图占用的内存
for(intx=0;x<+2;x++)
delete[]g_imgMap[x];
delete[]g_imgMap;
}
MakeMaze,;//创建迷宫
=2;//设置游戏者的位置
=2;
=0;//设置视野范围
=0;
=17;
=13;
//设置GPS显示区
setfillstyle(BLUE);
bar(522,368,637,471);
if>{=100;=(int)*/+;}
else{=100;=(int)*/+;}
Resize(&g_imgGPS,,;
=530+50-/2;
=370+50-/2;
//画迷你地图外框
setcolor(RED);
rectangle-1,-1,+,+;
//画迷你地图入口和出口
setcolor(YELLOW);
moveto-8,+/;
linerel(7,0);linerel(-3,-3);moverel(3,3);linerel(-3,3);
moveto+,+-/;
linerel(7,0);linerel(-3,-3);moverel(3,3);linerel(-3,3);
//绘制游戏区
Paint();
}
//提示用户输入迷宫大小
voidGetMazeSize()
{
==0;
//获取用户输入的宽高
TCHARs[4];
while<20||>200)
{
InputBox(s,4,_T("请输入迷宫的宽度\n范围:
20~200"),_T("输入"),_T("25"));
=_ttoi(s);
}
while<20||>200)
{
InputBox(s,4,_T("请输入迷宫的高度\n范围:
20~200"),_T("输入"),_T("25"));
=_ttoi(s);
}
//确保宽高为奇数
if%2!
=1)++;
if%2!
=1)++;
}
//生成迷宫:
初始化(注:
宽高必须是奇数)
voidMakeMaze(intwidth,intheight)
{
if(width%2!
=1||height%2!
=1)
return;
intx,y;
//定义迷宫尺寸,并分配迷宫内存
g_imgMap=newBYTE*[width+2];
for(x=0;x { g_imgMap[x]=newBYTE[height+2]; memset(g_imgMap[x],MAP_WALL,height+2); } //定义边界 for(x=0;x<=width+1;x++) g_imgMap[x][0]=g_imgMap[x][height+1]=MAP_GROUND; for(y=1;y<=height;y++) g_imgMap[0][y]=g_imgMap[width+1][y]=MAP_GROUND; //定义入口和出口 g_imgMap[1][2]=MAP_ENTRANCE; g_imgMap[width][height-1]=MAP_EXIT; //从任意点开始遍历生成迷宫 TravelMaze(((rand()%(width-1))&0xfffe)+2,((rand()%(height-1))&0xfffe)+2); //将边界标记为迷宫外 for(x=0;x<=width+1;x++) g_imgMap[x][0]=g_imgMap[x][height+1]=MAP_OUTSIDE; for(y=1;y<=height;y++) g_imgMap[0][y]=g_imgMap[width+1][y]=MAP_OUTSIDE; } //生成迷宫: 遍历(x,y)四周 voidTravelMaze(intx,inty) { //定义遍历方向 intd[4][2]={0,1,1,0,0,-1,-1,0}; //将遍历方向乱序 intn,t,i; for(i=0;i<4;i++) { n=rand()%4; t=d[i][0],d[i][0]=d[n][0],d[n][0]=t; t=d[i][1],d[i][1]=d[n][1],d[n][1]=t; } //尝试周围四个方向 g_imgMap[x][y]=MAP_GROUND; for(i=0;i<4;i++) if(g_imgMap[x+2*d[i][0]][y+2*d[i][1]]==0) { g_imgMap[x+d[i][0]][y+d[i][1]]=MAP_GROUND; TravelMaze(x+d[i][0]*2,y+d[i][1]*2);//递归 } } //获取指定坐标的迷宫元素 MAPITEMGetMazeItem(intx,inty) { return(MAPITEM)g_imgMap[x][y]; } //绘制视野范围内的迷宫 voidPaint() { intx1,y1; //绘制视野内的迷宫 SetWorkingImage(&g_imgSight); for(intx=;x<=;x++) for(inty=;y<=;y++) { x1=(x-*20; y1=(y-*20; putimage(x1,y1,20,20,&g_imgItem,GetMazeItem(x,y),0); } //绘制游戏者 x1=-*20; y1=-*20; putimage(x1,y1,20,20,&g_imgItem,MAP_PLAYER,0); //绘制迷你地图 SetWorkingImage(&g_imgGPS); cleardevice(); inttx=(int)(-1)*/(double)-1)+; intty=(int)(-1)*/(double)-1)+; setcolor(YELLOW); circle(tx,ty,1); //更新到绘图窗口 SetWorkingImage(); putimage(150,110,340,260,&g_imgSight,10,10); putimage,,&g_imgGPS); } //获取用户输入的命令 intGetCmd(int*c) { *c=0; if(GetAsyncKeyState(VK_LEFT)&0x8000)*c|=CMD_LEFT; if(GetAsyncKeyState(VK_RIGHT)&0x8000)*c|=CMD_RIGHT; if(GetAsyncKeyState(VK_UP)&0x8000)*c|=CMD_UP; if(GetAsyncKeyState(VK_DOWN)&0x8000)*c|=CMD_DOWN; if(GetAsyncKeyState('A')&0x8000)*c|=CMD_LEFT; if(GetAsyncKeyState('D')&0x8000)*c|=CMD_RIGHT; if(GetAsyncKeyState('W')&0x8000)*c|=CMD_UP; if(GetAsyncKeyState('S')&0x8000)*c|=CMD_DOWN; if(GetAsyncKeyState('')&0x8000)*c|=CMD_MARKRED; if(GetAsyncKeyState('G')&0x8000)*c|=CMD_MARKGREEN; if(GetAsyncKeyState('Y')&0x8000)*c|=CMD_MARKYELLOW; if(GetAsyncKeyState('C')&0x8000)*c|=CMD_CLEARMARK; if(GetAsyncKeyState(VK_ESCAPE)&0x8000)*c|=CMD_QUIT; return*c; } //处理用户输入的命令 voidDispatchCmd(intcmd) { if(cmd&CMD_UP)OnUp(); if(cmd&CMD_DOWN)OnDown(); if(cmd&CMD_LEFT)OnLeft(); if(cmd&CMD_RIGHT)OnRight(); if(cmd&CMD_MARKRED)OnMark(MAP_MARKRED); if(cmd&CMD_MARKGREEN)OnMark(MAP_MARKGREEN); if(cmd&CMD_MARKYELLOW)OnMark(MAP_MARKYELLOW); if(cmd&CMD_CLEARMARK)OnMark(MAP_GROUND); } //向上移动 voidOnUp() { if>1&&GetMazeItem,-1)! =MAP_WALL) { ; if-<4&&>0) { ; ; } } } //向左移动 voidOnLeft() { if>1&&GetMazeItem-1,! =MAP_WALL&&GetMazeItem-1,! =MAP_ENTRANCE) { ; if-<5&&>0) { ; ; } } } //向右移动 voidOnRight() { if<&&GetMazeItem+1,! =MAP_WALL) { ++; if-<5&&<= { ++; ++; } } } //向下移动 voidOnDown() { if<&&GetMazeItem,+1)! =MAP_WALL) { ++; if-<4&&<= { ++; ++; } } } //在地图中做标记 voidOnMark(MAPITEMvalue) { g_imgMap[][]=value; } //检查是否到出口 boolCheckWin() { if==&&==-1) { HWNDhwnd=GetHWnd(); if(MessageBox(hwnd,_T("恭喜你走出来了! \n您想再来一局吗"),_T("恭喜"),MB_YESNO|MB_ICONQUESTION)==IDYES) { InitGame(); returnfalse; } else returntrue; } returnfalse; } //询问用户是否退出游戏 boolQuit() { HWNDhwnd=GetHWnd(); return(MessageBox(hwnd,_T("您确定要退出游戏吗"),_T("询问"),MB_OKCANCEL|MB_ICONQUESTION)==IDOK); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 迷宫 程序 自动 生成
![提示](https://static.bdocx.com/images/bang_tan.gif)