⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 走迷宫程序.txt

📁 这是五个经典的c语言源程序
💻 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 + -