📄 走迷宫程序.txt
字号:
走迷宫程序
#include <vcl.h>
#pragma hdrstop
#include "UnitMaze.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
struct pace{
int pre;
int ri;
int rj;
} ;
int bg[8][8];
int M ;
int N ;
int step ;
int dir ;
int i ;
int j ;
int x ;
int y ;
int w ;
int h ;
int count ;
int le ;
pace road[64] ;
pace bestroad[64] ;
int runnum ;
void __fastcall TForm1::init(TObject *Sender)
{
int i,j;
for (i=0;i<8;i++)
for (j=0;j<8;j++)
bg[i][j]=1;
step=30;
dir=2;
M=8;N=8;
x=5;y=5;
w=8;h=8;
setBg();
//--------
drawMaze(Sender);
findShortRoad(Sender);
count=0;
runnum=0;
}
void __fastcall TForm1::drawMaze(TObject *Sender)
{
int i,j;
//Canvas->Polyline([Point(0,30),Point(0,240),Point(210,240)]);
//Canvas->Polyline([Point(240,210),Point(240,0),Point(30,0)]);
Canvas->MoveTo(0,30);
Canvas->LineTo(0,240);
Canvas->LineTo(210,240);
Canvas->MoveTo(240,210);
Canvas->LineTo(240,0);
Canvas->LineTo(30,0);
for (i=0 ;i<= 7;i++)
for (j=0;j<= 7;j++)
{
if( bg[i][j]==1)
{
Canvas->Brush->Color=clGreen;
Canvas->Rectangle(j*step,i*step,j*step+step,i*step+step);
}
}
}
void __fastcall TForm1::setBg()
// 随机生成代表迷宫地图的数组 /
{
int i,j ;
int ran ;
int dir ;
int a,b ;
// 初始化迷宫地图 /
b=w-1;
a=h-1;
for( i=0 ;i<= a;i++)
for (j=0;j<= b;j++)
bg[i][j]=1;
// 随机生成迷宫通路 */
randomize();
i=0;j=0;dir=2;
while(true)
{
bg[i][j]=0;
if((i>=a) && (j>=b))
break;
ran=(int)random(4);
// dir =0,1,2,3 分别表示上次运动方向:向西,向北,向东,向南.
if(ran<=2) { // 向南
if((dir!=1) && (i<a)) //上次运动方向不是向北并且未到南边界
{
i=i+1; //向南运动
dir=3;
}
}
/*else if(ran<=2) {
if((dir!=2) && (j>0))
{
j=j-1;//向西
dir=0;
}
}
else if(ran<=3) {
if((dir!=3) && (i>0))
{
i=i-1;//向北
dir=1;
}
} */
else
{
if((dir!=0) && (j<b))
{
j=j+1;//向东
dir=2;
}
}
}
// 随机生成迷宫其余部分 */
for (i=0;i<=a;i++)
for (j=0;j<=b;j++)
if(bg[i][j]==1)
{
ran=(int)random(10);
if(ran<4)
bg[i][j]=0;
}
}
void __fastcall TForm1::N2Click(TObject *Sender)
{
ClearCanvas(Sender);
init(Sender);
man->Left=5;
man->Top= 5;
i=0;
j=0;
}
void __fastcall TForm1::ClearCanvas(TObject *Sender)
{
Canvas->Brush->Style=bsSolid;
Canvas->Brush->Color=clBtnFace;
Canvas->FillRect(ClientRect);
}
void __fastcall TForm1::runByLeft(TObject *Sender)
{
N6->Checked=true;
N7->Checked=false;
if((i<M-1) || (j<N-1))
{
switch( dir ){
case 0:
//* 以3,0,1的次序尝试 */
if((i<M-1) && (bg[i+1][j]==0))
{
y=y+step;i=i+1;
dir=3;
}
else if((j>0) && (bg[i][j-1]==0))
{
x=x-step;j=j-1;
dir=0;
}
else if((i>0) && (bg[i-1][j]==0))
{
y=y-step;i=i-1;
dir=1;
}
else
{
x=x+step;j=j+1;
dir=2;
}
break;
case 1:
if((j>0) && (bg[i][j-1]==0))
{
x=x-step;j=j-1;
dir=0;
}
else if((i>0) && (bg[i-1][j]==0))
{
y=y-step;i=i-1;
dir=1;
}
else if((j<N-1) && (bg[i][j+1]==0))
{
x=x+step;j=j+1;
dir=2;
}
else
{
y=y+step;i=i+1;
dir=3;
} ;
break;
case 2:
if((i>0) && (bg[i-1][j]==0))
{
y=y-step;i=i-1;
dir=1;
}
else if((j<N-1) && (bg[i][j+1]==0))
{
x=x+step;j=j+1;
dir=2;
}
else if((i<M-1) && (bg[i+1][j]==0))
{
y=y+step;i=i+1;
dir=3;
}
else
{
x=x-step;j=j-1;
dir=0;
} ;
break;
case 3:
if((j<N-1) && (bg[i][j+1]==0))
{
x=x+step;j=j+1;
dir=2;
}
else if((i<M-1) && (bg[i+1][j]==0))
{
y=y+step;i=i+1;
dir=3;
}
else if((j>0) && (bg[i][j-1]==0))
{
x=x-step;j=j-1;
dir=0;
}
else
{
y=y-step;i=i-1;
dir=1;
}
break;
}
man->Left=x;
man->Top=y;
}
//--------
drawMaze(Sender);
}
void __fastcall TForm1::runShort(TObject *Sender)
{
N7->Checked=true;
N6->Checked=false;
if ((bestroad[runnum].rj<=7) && (bestroad[runnum].ri<=7) )
{
man->Left=bestroad[runnum].rj*step;
man->Top=bestroad[runnum].ri*step;
} ;
count=count+1;
drawMaze(Sender);
runnum=runnum+1;
}
void __fastcall TForm1::clkLeft(TObject *Sender)
{
N6->Checked=true;
N7->Checked=false;
}
void __fastcall TForm1::clkShort(TObject *Sender)
{
N7->Checked=true;
N6->Checked=false;
}
void __fastcall TForm1::findShortRoad(TObject *Sender)
{
int aa[8][8];
int step ;
int len ;
int size;
int x ;
int y ;
int i ;
int j ;
int dir ;
int dj[4];
int di[4];
int routelen ;
int bgin ;
int ed ;
int k ;
int t ;
int num ;
int suc ;
int cnt ;
int x0 ;
int y0 ;
int tmp ;
step=20;
len=10;
size=20;
x=0;
y=0;
i=0;
j=0;
routelen=0;
dj[0]=-1;
dj[1]=1;
dj[2]=0;
dj[3]=0;
di[0]=0;
di[1]=0;
di[2]=-1;
di[3]=1;
x=x+len;
y=y+len;
x0=x;
y0=y;
i=0;
j=0;
for (i=0 ;i<8;i++)
{
for(j=0 ;j<8;j++)
{
aa[i][j]=bg[i][j];
}
}
aa[0][0]=1;
bgin=0;
ed=0;
road[0].ri=0;
road[0].rj=0;
road[0].pre=-1;
le=0;
suc=0;
while(true)
{
cnt=0;
for (k=bgin ;k<=ed;k++)
{
for (t=0;t<4;t++)
{
i=road[k].ri+di[t];
j=road[k].rj+dj[t];
if((i<8) && (i>=0) && (j<8) && (j>=0) && (aa[i][j]==0))
{
cnt=cnt+1;
le=le+1;
aa[i][j]=le;
road[ed+cnt].pre=k;
road[ed+cnt].ri=i;
road[ed+cnt].rj=j;
if ((i==7) && (j==7))
{
suc=1;
break;
}
}
} ;
if (suc==1) break;
}
bgin=ed+1;
ed=ed+cnt;
if (suc==1) break;
}
i=ed;
j=0;
while (i!=-1)
{
bestroad[j].ri=road[i].ri;
bestroad[j].rj=road[i].rj;
i=road[i].pre;
j=j+1;
}
for (i=0;i<=j/2;i++)
{
tmp=bestroad[i].rj;
bestroad[i].rj=bestroad[j-i].rj;
bestroad[j-i].rj=tmp;
tmp=bestroad[i].ri;
bestroad[i].ri=bestroad[j-i].ri;
bestroad[j-i].ri=tmp;
}
}
void __fastcall TForm1::N3Click(TObject *Sender)
{
count=0;
runnum=0;
step=30;
dir=2;
M=8;N=8;
x=5;y=5;
w=8;h=8;
i=0;j=0;
man->Left=0;
man->Top=0;
Timer1->Enabled=true;
Timer1Timer(Sender);
}
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if (N6->Checked)
runByLeft(Sender);
else if (N7->Checked)
runShort(Sender) ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N4Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N8Click(TObject *Sender)
{
ShowMessage("作者: **\n);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -