c语言程序设计的迷宫
这个可行的
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#define N 20
int oldmap[N][N]
int yes=0
int way[100][2],wayn=0
void Init(void)
void Close(void)
void DrawPeople(int *x,int *y,int n)
void PeopleFind(int (*x)[N])
void WayCopy(int (*x)[N],int (*y)[N])
int FindWay(int (*x)[N],int i,int j)
void MapRand(int (*x)[N])
void PrMap(int (*x)[N])
void Result(void)
void Find(void)
void NotFind(void)
void main(void)
{
int map[N][N]
char ch
clrscr()
printf("\n Please select hand(1) else auto\n")
scanf("%c",&ch)
Init()
MapRand(map)
PrMap(map)
if(ch=='1')
PeopleFind(map)
else
FindWay(map,1,1)
Result()
Close()
}
void Init(void)
{
int gd=DETECT,gm
initgraph(&gd,&gm,"c:\\tc")
}
void DrawPeople(int *x,int *y,int n)
{
setfillstyle(SOLID_FILL,WHITE)
bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6)
switch(n)
{
case 1: (*x)--break
case 2: (*x)--(*y)++break
case 3: (*y)++break
case 4: (*x)++(*y)++break
case 5: (*x)++break
case 6: (*x)++(*y)--break
case 7: (*y)--break
case 8: (*x)--(*y)--break
}
setfillstyle(SOLID_FILL,RED)
bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6)
}
void PeopleFind(int (*map)[N])
{
int x,y
char c=0
x=y=1
setcolor(11)
line(500,200,550,200)
outtextxy(570,197,"d")
line(500,200,450,200)
outtextxy(430,197,"a")
line(500,200,500,150)
outtextxy(497,130,"w")
line(500,200,500,250)
outtextxy(497,270,"x")
line(500,200,450,150)
outtextxy(445,130,"q")
line(500,200,550,150)
outtextxy(550,130,"e")
line(500,200,450,250)
outtextxy(445,270,"z")
line(500,200,550,250)
outtextxy(550,270,"c")
setcolor(YELLOW)
outtextxy(420,290,"Press 'Enter' to end")
setfillstyle(SOLID_FILL,RED)
bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x*15+6)
while(c!=13)
{
c=getch()
if(c=='w'&&map[x-1][y]!=1)
DrawPeople(&x,&y,1)
else
if(c=='e'&&map[x-1][y+1]!=1)
DrawPeople(&x,&y,2)
else
if(c=='d'&&map[x][y+1]!=1)
DrawPeople(&x,&y,3)
else
if(c=='c'&&map[x+1][y+1]!=1)
DrawPeople(&x,&y,4)
else
if(c=='x'&&map[x+1][y]!=1)
DrawPeople(&x,&y,5)
else
if(c=='z'&&map[x+1][y-1]!=1)
DrawPeople(&x,&y,6)
else
if(c=='a'&&map[x][y-1]!=1)
DrawPeople(&x,&y,7)
else if(c=='q'&&map[x-1][y-1]!=1)
DrawPeople(&x,&y,8)
}
setfillstyle(SOLID_FILL,WHITE)
bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x*15+6)
if(x==N-2&&y==N-2)
yes=1
}
void WayCopy(int (*oldmap)[N],int (*map)[N])
{
int i,j
for(i=0i<Ni++)
for(j=0j<Nj++)
oldmap[i][j]=map[i][j]
}
int FindWay(int (*map)[N],int i,int j)
{
if(i==N-2&&j==N-2)
{
yes=1
return
}
map[i][j]=1
WayCopy(oldmap,map)
if(oldmap[i+1][j+1]==0&&!yes)
{
FindWay(oldmap,i+1,j+1)
if(yes)
{
way[wayn][0]=i
way[wayn++][1]=j
return
}
}
WayCopy(oldmap,map)
if(oldmap[i+1][j]==0&&!yes)
{
FindWay(oldmap,i+1,j)
if(yes)
{
way[wayn][0]=i
way[wayn++][1]=j
return
}
}
WayCopy(oldmap,map)
if(oldmap[i][j+1]==0&&!yes)
{
FindWay(oldmap,i,j+1)
if(yes)
{
way[wayn][0]=i
way[wayn++][1]=j
return
}
}
WayCopy(oldmap,map)
if(oldmap[i-1][j]==0&&!yes)
{
FindWay(oldmap,i-1,j)
if(yes)
{
way[wayn][0]=i
way[wayn++][1]=j
return
}
}
WayCopy(oldmap,map)
if(oldmap[i-1][j+1]==0&&!yes)
{
FindWay(oldmap,i-1,j+1)
if(yes)
{
way[wayn][0]=i
way[wayn++][1]=j
return
}
}
WayCopy(oldmap,map)
if(oldmap[i+1][j-1]==0&&!yes)
{
FindWay(oldmap,i+1,j-1)
if(yes)
{
way[wayn][0]=i
way[wayn++][1]=j
return
}
}
WayCopy(oldmap,map)
if(oldmap[i][j-1]==0&&!yes)
{
FindWay(oldmap,i,j-1)
if(yes)
{
way[wayn][0]=i
way[wayn++][1]=j
return
}
}
WayCopy(oldmap,map)
if(oldmap[i-1][j-1]==0&&!yes)
{
FindWay(oldmap,i-1,j-1)
if(yes)
{
way[wayn][0]=i
way[wayn++][1]=j
return
}
}
return
}
void MapRand(int (*map)[N])
{
int i,j
cleardevice()
randomize()
for(i=0i<Ni++)
{
for(j=0j<Nj++)
{
if(i==0||i==N-1||j==0||j==N-1)
map[i][j]=1
else
if(i==1&&j==1||i==N-2&&j==N-2)
map[i][j]=0
else
map[i][j]=random(2)
}
}
}
void PrMap(int (*map)[N])
{
int i,j
for(i=0i<Ni++)
for(j=0j<Nj++)
if(map[i][j]==0)
{
setfillstyle(SOLID_FILL,WHITE)
bar(100+j*15-6,50+i*15-6,100+j*15+6,50+i*15+6)
}
else
{
setfillstyle(SOLID_FILL,BLUE)
bar(100+j*15-6,50+i*15-6,100+j*15+6,50+i*15+6)
}
}
void Find(void)
{
int i
setfillstyle(SOLID_FILL,RED)
wayn--
for(i=wayni>=0i--)
{
bar(100+way[i][1]*15-6,50+way[i][0]*15-6,100+
way[i][1]*15+6,50+way[i][0]*15+6)
sleep(1)
}
bar(100+(N-2)*15-6,50+(N-2)*15-6,100+
(N-2)*15+6,50+(N-2)*15+6)
setcolor(GREEN)
settextstyle(0,0,2)
outtextxy(130,400,"Find a way!")
}
void NotFind(void)
{
setcolor(GREEN)
settextstyle(0,0,2)
outtextxy(130,400,"Not find a way!")
}
void Result(void)
{
if(yes)
Find()
else
NotFind()
getch()
}
void Close(void)
{
closegraph()
}
//*********************
//迷宫
//*********************
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
char map[5][5] = {{'1','1','1','1','1'},{'0','0','0','1','1'},{'0','0','1','1','0'},{'1','1','1','0','0'},{'1','1','1','1','1'}}
//*************
//生成地图
//**************
void CreateMap()
{
for(int i =0i <5i++)
{
for(int j = 0j <5j++)
{
// printf("%c",map[i][j])
cout <<map[i][j]
}
cout <<endl
}
}
//*************************
//画出迷宫地图
//************************
void draw()
{
for(int i= 0i <5i++)
{
for(int j =0 j <5j++)
{
printf("%c",map[i][j])
}
putchar('\n')
}
}
//*********************
//判断下一步是否走得通
//********************
bool Judgenext(int row, int cloumn)
{
if(map[row][cloumn] == '1')
{
return 1
}
return 0
}
//******************
//离开迷宫
//******************
bool ExitMaze(int row, int cloumn)
{
bool done = 0
if(row == 4 &&cloumn == 4)
{
done = 1
}
else
{
if(Judgenext(row, cloumn) == 1)
{
map[row][cloumn] = 'B'
done = ExitMaze(row+1, cloumn)
if(done == 0)
{
done = ExitMaze(row, cloumn+1)
}
if(done == 0)
{
done = ExitMaze(row-1, cloumn)
}
if(done == 0)
{
done = ExitMaze(row, cloumn-1)
}
if(done == 1)
{
map[row][cloumn] = 'P'
}
}
}
return done
}
//***********************************
//解决问题
//***********************************
void slove()
{
bool done
done = ExitMaze(0,0)
if(done == 1)
{
printf("该迷宫可以走通!具体的步骤如下:\n")
draw()
}
else
{
printf("对不起,该迷宫无法走出!\n")
}
}
int main(void)
{
printf("This is a maze:\n")
CreateMap()
system("pause")
slove()
return 0
}
将C改为C++很简单。。。
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0014) // 禁掉清除背景消息
return
base.WndProc(ref m)
}
还是命令行的
如果是有界面的麻烦一些
命令行的简单的多。
生成迷宫部分比较麻烦
要保证唯一通路。
迷宫的设计,可以考虑使用二维数组。
每个点作为一个结构体或者类。