走迷宫程序含自动迷宫生成.docx
《走迷宫程序含自动迷宫生成.docx》由会员分享,可在线阅读,更多相关《走迷宫程序含自动迷宫生成.docx(17页珍藏版)》请在冰豆网上搜索。
走迷宫程序含自动迷宫生成
走迷宫程序(含自动迷宫生成)
迷宫程序。
执行效果如下:
程序间有足够多的注释,就不多作介绍了。
代码如下:
///////////////////////////////////////////////////
//程序名称:
迷宫游戏
//编译环境:
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);move