建材秒知道
登录
建材号 > 设计 > 正文

c语言程序设计的迷宫

玩命的咖啡豆
执着的雪碧
2023-03-02 02:22:43

c语言程序设计的迷宫

最佳答案
动人的红牛
火星上的裙子
2025-07-05 04:01:30

这个可行的

#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()

}

最新回答
含糊的小伙
拼搏的玉米
2025-07-05 04:01:30

//*********************

//迷宫

//*********************

#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++很简单。。。

可爱的火车
沉默的酸奶
2025-07-05 04:01:30
c#界面绘制的时候,底层重绘每次会清除画布背景,然后再全部重新绘制,这才是导致闪烁最主要的原因。于是重载消息发送函数操作,禁掉这条消息。代码如下:

protected override void WndProc(ref Message m)

{

if (m.Msg == 0x0014) // 禁掉清除背景消息

return

base.WndProc(ref m)

}

失眠的滑板
缓慢的咖啡
2025-07-05 04:01:30
是准备做成有界面的

还是命令行的

如果是有界面的麻烦一些

命令行的简单的多。

生成迷宫部分比较麻烦

要保证唯一通路。

迷宫的设计,可以考虑使用二维数组。

每个点作为一个结构体或者类。