C语言迷宫源代码
- 格式:doc
- 大小:38.00 KB
- 文档页数:5
#include
#include
#include
/*定义几个功能按键*/
#define ESC 0x11b /*强行退出游戏*/
#define UP 0x4800 /*上下左右四个按键移动小人*/
#define DOWN 0x5000
#define LEFT 0x4b00
#define RIGHT 0x4d00
int a[50][50]={0}; /* 存放地图信息的数组 0:不可走的障碍物 1:可以走的路 */
int qdx=1,qdy=1,zdx=20,zdy=20; /* 起点和终点的坐标 */
int renx,reny; /* 小人坐标 */
int d=20; /* 小格子的间距 */
int kk=0,rr=2;
main()
{
int i,j,m=30,n=16,d=20,k;
int gdriver = DETECT, gmode;
randtu(200);
renx=qdx,reny=qdy;
registerbgidriver(gdriver);
initgraph(&gdriver, &gmode, "c:\\turboc2");
redraw();
while(1) /* 反复从键盘获得程序需要的按键 */
{
if(bioskey(1)) /* 判断是否有按键 */
{
k=bioskey(0); /* 将按键存入变量k */
switch(k) /* 对按键进行分情况处理 */
{
case ESC: /* ESC键 退出 */
printf("%d times\n",kk);
exit(0); break;
case UP: /* UP键向上移动光标 */
if(a[renx][reny-1]==1)
{
reny-=1;
redraw();
} break;
case DOWN: /* DOWN键向下移动光标 */
if(a[renx][reny+1]==1)
{
reny+=1;
redraw();
}
break;
case LEFT: /* LEFT键向左移动光标 */
if(a[renx-1][reny]==1)
{
renx-=1;
redraw();
}
break;
case RIGHT: /* RIGHT键向右移动光标 */
if(a[renx+1][reny]==1)
{
renx+=1;
redraw();
}
break;
}
}
}
getch();
closegraph();
}
/*
redraw重画函数在用户有操作后,重画游戏画面
*/
redraw()
{
int i,j;
for(i=qdx;i<=zdx;i++)
for(j=qdy;j<=zdy;j++)
{
if(irenx-rr && jreny-rr)
if(a[i][j]==0) geziza(i*d,j*d); else gezilu(i*d,j*d);
else gezibk(i*d,j*d);
}
drawren(renx*d,reny*d);
}
/*
随机地图(randlei)函数用于随机生成地图
*/
randtu(int num)
{
int i,j,xx,yy,sum,t,m,n;
srand(time(NULL));
loop: sum=0;
m=zdy-qdy+1;
n=zdx-qdx+1;
a[qdx][qdy]=1;
a[zdx][zdy]=1;
do
{
t=random(m*n);
xx=t/m+1;
yy=t%m+1;
if(a[xx][yy]==0)
{
a[xx][yy]=1;
sum++;
}
}while(sum
if(ok()) return;
for(i=0;i<50;i++)
for(j=0;j<50;j++)
a[i][j]=0;
kk++;
goto loop;
}
ok()
{ int b[50][50]={0};
b[qdx][qdy]=1;
tansuo(qdx,qdy,b);
return(b[zdx][zdy]);
}
tansuo(int x,int y,int *b[50][50]) /* 如果当前格子为空白无雷情况,向周围探索相类似的情况,并打开周围的数字 */
{
if(a[x][y-1]==1 && b[x][y-1]==0)
{
b[x][y-1]=1;
tansuo(x,y-1,b);
}
if(a[x+1][y]==1 && b[x+1][y]==0)
{
b[x+1][y]=1;
tansuo(x+1,y,b);
}
if(a[x-1][y]==1 && b[x-1][y]==0)
{
b[x-1][y]=1;
tansuo(x-1,y,b);
}
if(a[x][y+1]==1 && b[x][y+1]==0)
{
b[x][y+1]=1;
tansuo(x,y+1,b);
}
}
/*
绘制障碍物小格子(geziza)
int x : 格子左上角点横坐标
int y :格子左上角点纵坐标
*/
geziza(int x,int y)
{
int i;
setcolor(8);
rectangle(x,y,x+d,y+d);
setcolor(RED);
setfillstyle(2,RED);
bar(x+1,y+1,x+d-1,y+d-1);
/* 设置深灰色为格子边框 */
}
/*
绘制障碍物小格子(geziza)
int x : 格子左上角点横坐标
int y :格子左上角点纵坐标
*/
gezibk(int x,int y)
{
int i;
setcolor(8);
rectangle(x,y,x+d,y+d);
setcolor(BLUE);
setfillstyle(2,BLUE);
bar(x+1,y+1,x+d-1,y+d-1);
/* 设置深灰色为格子边框 */
}
gezilu(int x,int y)
{
int i;
setcolor(8); /* 设置深灰色为格子边框 */
rectangle(x,y,x+d,y+d);
setcolor(BLUE);
setfillstyle(8,BLUE);
bar(x+1,y+1,x+d-1,y+d-1);
}
/*
画小人(drawren)函数用于绘制给定坐标位置的小人
小人画在格子的正中心 格子背景色为红色
int x : 所在格子左上角点横坐标
int y :所在格子左上角点纵坐标
*/
drawren(int x,int y)
{
int i;
setcolor(8); /* 设置深灰色为格子边框 */
rectangle(x,y,x+d,y+d);
setcolor(YELLOW);
for(i=1;i
circle(x+d/2,y+d/2,i);
}/*
over(over)函数用于判断游戏是否结束
*/
over()
{
}