Page 1 of 1

GotoXY: Cannot reach location!

Posted: 21.09.2009 13:06
by Kozak
Вот кусочек макроса на мининг. Выбивает ошибку GotoXY: Cannot reach location!. Что это за LDC не шарю (( Подскажите, будьте добры..

Code: Select all

procedure GotoXY(x,y,prec : integer; runflag : boolean); 
   var ld, ldc, dx, dy, mx, my, tmpdir : Integer; 
   begin 
      ld := 0; ldc := 0; 
      while true do 
      begin 
         waitconnection(3000); 
         DropOre; 
         dx := GetX(self) - x; if dx < 0 then dx := 0 - dx; 
         dy := GetY(self) - y; if dy < 0 then dy := 0 - dy; 
         if dy > dx then dx := dy; 
         if dx <= prec then exit; 
         mx := GetX(self); my := GetY(self); 
         dx := mx - x; if dx < 0 then dx := 0 - dx; 
         dy := my - y; if dy < 0 then dy := 0 - dy; 
         if dy > dx then dx := dy; 
         if dx <= prec then exit; 
         if ld = dx then begin 
            ldc := ldc + 1; 
            if ldc > 10 then 
           begin 
             tmpdir := Random(8); 
             DropOre; 
             Raw_Move(tmpdir,runflag); 
             DropOre; 
             Raw_Move(tmpdir,runflag); 
             DropOre; 
             Raw_Move(tmpdir,runflag); 
           end; 
            if ldc > 200 then begin addtosystemjournal( 'GotoXY: Cannot reach location!' ); { exit; } end; 
         end 
         else ld := dx; 
         waitconnection(5000); 
         if mx = x then begin 
            if my = y then exit; 
            // North 
            if my > y then begin Raw_Move(0,runflag); continue; end; 
            // South 
            DropOre; 
            Raw_Move(4,runflag); continue; 
         end; 
         if mx < x then begin 
            // Northeast 
            if my > y then begin DropOre; Raw_Move(1,runflag); continue; end; 
            // East 
            if my = y then begin DropOre; Raw_Move(2,runflag); continue; 
            end; 
            // Southeast 
            DropOre; Raw_Move(3,runflag); continue; 
         end; 
         // Southwest 
         if my < y then begin DropOre; Raw_Move(5,runflag); continue; end; 
         // West 
         if my = y then begin DropOre; Raw_Move(6,runflag); continue; end; 
         // Nortwest 
         DropOre; Raw_Move(7,runflag); continue; 
      end; 
   end; 

Posted: 21.09.2009 15:12
by WladL
что то какая-то мутная ходилка, двойные присваивания

Code: Select all

dx := GetX(self) - x;
...
mx := GetX(self); my := GetY(self); 
dx := mx - x;
обход в рандомном направлении

Code: Select all

tmpdir := Random(8);
это можно вообще удалить

Code: Select all

         waitconnection(3000); 
         DropOre; 
         dx := GetX(self) - x; if dx < 0 then dx := 0 - dx; <=== Del
         dy := GetY(self) - y; if dy < 0 then dy := 0 - dy; <=== Del
         if dy > dx then dx := dy;<=== Del 
         if dx <= prec then exit;<=== Del
а ldc это счетчик попыток обхода препятствий, после того как чар совершает больше 200 попыток (ldc > 200 ) вываливается это сообщение.Типа "Пошли Вы все на.., я сам заблудился"

Если есть возможность подключить мулы(клиентские), то используй вместо своей GotoXY встроенную ходилку
function MoveXY(Xdst,Ydst: Word; Optimized: Boolean; Accuracy: Integer; Running: Boolean): Boolean; // Поиск пути.
Accuracy - точность приближения: 0 - прямо на точку, 1 - рядом в радиусе одного тайла и т.д. длина ограничена 1000 точек(тайлов).
Optimized - включать настоятельно рекомендуется только на поиске пути длиной до 200 точек.

и забудь про все эти проблемы.