home *** CD-ROM | disk | FTP | other *** search
/ CyberMycha Extra 2005 February / CMycha022005.iso / Setup / path.txt < prev    next >
Text File  |  2001-12-05  |  3KB  |  123 lines

  1. struct PozInfo
  2. {
  3. WORD X;
  4. WORD Y;
  5. };
  6.  
  7. const WORD komorka=20; 
  8. const WORD szer=640 div komorka-1;
  9. const WORD wys=480 div komorka-1;
  10.  
  11.     BYTE Mapa[szer+1,wys+1];
  12.     WORD LenMapa[szer+1,wys+1];
  13.     WORD LenWezly[501];
  14.     PozInfo WezlyPoz[501];
  15.  
  16.     WORD i,j;
  17.     PozInfo PozycjaStart;
  18.     PozInfo PozycjaKoniec;
  19.     PozInfo Pos;
  20.     WORD NrWezla;
  21.     WORD NajkrotszaDroga;
  22.     WORD NajkrKrok;
  23.     PozInfo NajkrPos;
  24.     BYTE Step;
  25.  
  26. void Czysc()
  27. {
  28.  for(int a=0;a<=szer;a++)
  29.   for(b=0;b<=wys;b++)
  30.    LenMapa [a,b]=0xFFFF;
  31. }
  32.  
  33. void TworzWezel (int x,int y)
  34. {
  35.  if((LenMapa[Pos.X+x,Pos.Y+y]==0xFFFF)&&(Mapa[Pos.X+x,Pos.Y+y]==0))
  36.  {
  37.   LenMapa [Pos.X+x,Pos.Y+y]=LenMapa [Pos.X,Pos.Y]+1;
  38.   WezlyPoz [NrWezla].X=Pos.X+x;
  39.   WezlyPoz [NrWezla].Y=Pos.Y+y;
  40.   LenWezly [NrWezla]=((Pos.X+x)-PozycjaKoniec.X)*((Pos.X+x)-PozycjaKoniec.X)+((Pos.Y+y)-PozycjaKoniec.Y)*((Pos.Y+y)-PozycjaKoniec.Y);
  41.   NrWezla++;
  42.   
  43.  }
  44. }
  45.  
  46. void Sprawdz (int x,int y)
  47. {
  48.  if(LenMapa[Pos.X+x,Pos.Y+y]<NajkrKrok)
  49.  {
  50.   NajkrKrok=LenMapa[Pos.X+x,Pos.Y+y];
  51.   NajkrPos.X=Pos.X+x;  NajkrPos.Y=Pos.Y+y;
  52.  }
  53. }
  54.  
  55. void FindPath()
  56. {
  57.     WezlyPoz [0]=PozycjaStart;
  58.     LenWezly [0]=(PozycjaStart.X-PozycjaKoniec.X)*(PozycjaStart.X-PozycjaKoniec.X)+(PozycjaStart.Y-PozycjaKoniec.Y)*(PozycjaStart.Y-PozycjaKoniec.Y);
  59.     LenMapa [PozycjaStart.X,PozycjaStart.Y]=0;
  60.     NrWezla=1;
  61. do
  62. {
  63.   NajkrotszaDroga=0;
  64.   for(int i=0;i<=NrWezla-1;i++)
  65.    if(LenWezly [i]<LenWezly[NajkrotszaDroga]) NajkrotszaDroga=i;
  66.  
  67.   Pos=WezlyPoz[NajkrotszaDroga];
  68.   WezlyPoz [NajkrotszaDroga]=WezlyPoz [NrWezla-1];
  69.   LenWezly [NajkrotszaDroga]=LenWezly [NrWezla-1];
  70.   NrWezla--;
  71.  
  72.   TworzWezel (0,-1); {góra}
  73.   TworzWezel (1,0);  {prawo}
  74.   TworzWezel (0,1);  {dóÆ}
  75.   TworzWezel (-1,0); {lewo}
  76.   TworzWezel (1,-1); {prawy-górny}
  77.   TworzWezel (1,1);  {prawy-dolny}
  78.   TworzWezel (-1,1); {lewy-dolny}
  79.   TworzWezel (-1,-1);{lewy-górny}
  80. }
  81.  while(((Pos.X!=PozycjaKoniec.X)&&(Pos.Y!=PozycjaKoniec.Y))||(NrWezla!=0));
  82.  
  83.  if(NrWezla!=0)
  84.  {
  85.  
  86.   Pos= PozycjaKoniec;
  87.   step=0;
  88.   while
  89.     (!((Pos.X==PozycjaStart.X)&&(Pos.Y==PozycjaStart.Y)))
  90. do
  91.   {
  92.    Step++;
  93.    NajkrKrok := 0xFFFF;
  94.    Sprawdz (0,-1); {góra}
  95.    Sprawdz (1,0);  {prawo}
  96.    Sprawdz (0,1);  {dóÆ}
  97.    Sprawdz (-1,0); {lewo}
  98.    Sprawdz (1,-1); {prawy-górny}
  99.    Sprawdz (1,1);  {prawy-dolny}
  100.    Sprawdz (-1,1); {lewy-dolny}
  101.    Sprawdz (-1,-1);{lewy-górny}
  102.     Pos=NajkrPos;
  103.     /*SetColor (6);
  104.    Circle (NajkrPos.X*komorka+komorka div 2,
  105.            NajkrPos.Y*komorka+komorka div 2,
  106.            komorka div 2-1);
  107.    Circle (NajkrPos.X*komorka+komorka div 2,
  108.            NajkrPos.Y*komorka+komorka div 2,
  109.            komorka div 2-2);*/
  110.    }
  111.  }
  112. else {}
  113.  
  114. }
  115.  
  116. Begin
  117.  Czysc();
  118.  PozycjaStart.X=3;  PozycjaStart.Y=10;
  119.  PozycjaKoniec.X=25;  PozycjaKoniec.Y=6;
  120.  FindPath();
  121.  
  122. End.
  123.