Page 1 of 1
					
				Сортировка тайлов по координатам?
				Posted: 20.06.2011 11:20
				by SuperPups
				Добрый день!
Есть процедура, которая ищет несколько типов деревьев па площади 60х60 квадратов. Не удобность в том, что чар бегает от одного угла к другому, тем самым увеличивая время добычи ресурсов.
Code: Select all
Procedure CheckLumberTiles;
begin
  totalSum := 0;
  for i:=0 to 5 do begin                                           
    CheckTiles := GetStaticTilesArray(LumberX-SqFL, LumberY-SqFL, LumberX+SqFL, LumberY+SqFL, WorldNum, LumberTile[i], a);
    if CheckTiles>0 then begin
      for k:=0 to CheckTiles-1 do LTCoords[totalSum+k]:=a[k];
    end;
    totalSum:=totalSum+CheckTiles;
  end;
end;
Как посортировать LTCoords, по Х или Y, чтобы чар ходил к ближайшему дереву? Нигде в примерах и мануалах ничего подобного не нашел 

 
			 
			
					
				Re: Сортировка тайлов по координатам?
				Posted: 20.06.2011 13:37
				by Alex
				тебе поможет 
сортировка пузырьком, только её нужно модифицировать что бы переворачивал учитывая вторую координату
 
			 
			
					
				Re: Сортировка тайлов по координатам?
				Posted: 20.06.2011 18:30
				by shinma
				о помню помню  учили  кадато сто лет  назад сортировка матрицы методом пузырька там чото с J замута связана вспоминать лень. и так  рубит нормаьно
			 
			
					
				Re: Сортировка тайлов по координатам?
				Posted: 20.06.2011 18:34
				by Alex
				особых замут не должно быть, всего один if добавить надо в эту реализацию сортировки)
			 
			
					
				Re: Сортировка тайлов по координатам?
				Posted: 20.06.2011 18:56
				by shinma
				
			 
			
					
				Re: Сортировка тайлов по координатам?
				Posted: 20.06.2011 19:30
				by grundick
				А я как-то иначе делал...Из центра(координаты чара) проверял все тайлы по спирали, нужные метил и уже спиралькой бегал и рубил.
			 
			
					
				Re: Сортировка тайлов по координатам?
				Posted: 20.06.2011 20:01
				by CFA
				я делал массив структур с координатами и таймерами когда этот тайл был вырублен, и когда очередное дерево вырубалось полностью, искал ближайший тайл в котором логи уже реснулись. Впрочем это тоже не самый оптимальный вариант.
			 
			
					
				Re: Сортировка тайлов по координатам?
				Posted: 20.06.2011 21:34
				by SuperPups
				Спасибо за помощь!
Я перебрал все предложенные варианты и даже просчитывал расстояние между двумя точками по цепочке. Но остановился на этом:
Code: Select all
  for k:=0 to totalsum do begin
    for i:=0 to totalsum-1 do begin
      if LTCoords[i].X > LTCoords[i+1].X then begin
        a[0].tile := LTCoords[i].tile;
        a[0].X := LTCoords[i].X;
        a[0].Y := LTCoords[i].Y;
        a[0].Z := LTCoords[i].Z;
        LTCoords[i].tile := LTCoords[i+1].tile;
        LTCoords[i].X := LTCoords[i+1].X;
        LTCoords[i].Y := LTCoords[i+1].Y;
        LTCoords[i].Z := LTCoords[i+1].Z;
        LTCoords[i+1].tile := a[0].tile;
        LTCoords[i+1].X := a[0].X;
        LTCoords[i+1].Y := a[0].Y;
        LTCoords[i+1].Z := a[0].Z;
      end;
    end;
  end;
  for k:=0 to totalsum do begin
    for i:=0 to totalsum-1 do begin
      if LTCoords[i].X = LTCoords[i+1].X then begin
        if LTCoords[i].Y > LTCoords[i+1].Y then begin
          a[0].tile := LTCoords[i].tile;
          a[0].X := LTCoords[i].X;
          a[0].Y := LTCoords[i].Y;
          a[0].Z := LTCoords[i].Z;
          LTCoords[i].tile := LTCoords[i+1].tile;
          LTCoords[i].X := LTCoords[i+1].X;
          LTCoords[i].Y := LTCoords[i+1].Y;
          LTCoords[i].Z := LTCoords[i+1].Z;
          LTCoords[i+1].tile := a[0].tile;
          LTCoords[i+1].X := a[0].X;
          LTCoords[i+1].Y := a[0].Y;
          LTCoords[i+1].Z := a[0].Z;
        end;
      end;
    end;
  end;
Сейчас оптимизирую код и будет все ОК!
 
			 
			
					
				Re: Сортировка тайлов по координатам?
				Posted: 20.06.2011 21:53
				by Vizit0r
				Code: Select all
type
ArrayType = Array[0..100] of Cardinal;
var 
StrubsList: TStringList;
A : ArrayType;
flag : Boolean;
i,j  : Integer;
tempValue: Cardinal;
....
....
//сортировка пузырьковым методом
  j := StrubsList.Count-1;
  flag := True;
  while ((j >= 1) and flag) do
  begin
        j := j - 1;
        flag := False;
        for i := 0 to j - 1 do
         begin
            if ((i < (StrubsList.Count -2)) and ((GetX(A[i]) > GetX(A[i+1])) or ((GetX(A[i]) = GetX(A[i+1])) and (GetY(A[i]) > GetY(A[i+ 1]))))) then
            begin
	  tempValue := A[I];
	  A[I] := A[i+1];
	  A[i+1] := tempValue;
               flag := True;
	  end
	end
  end
  end;
//конец сортировки
выдрал с одного из своих допотопных скриптов (в те далекие времена, когда я их еще писал 

)
автор не я, кто - не помню.
 
			 
			
					
				Re: Сортировка тайлов по координатам?
				Posted: 21.06.2011 11:13
				by Miralex
				Сортировка врядле нужна, все делается гораздо проще:
Делаем ф-цию определения след. дерева в которой есть свой массив деревьев, которых еще не рубили. В ф-ции пробегаетесь по всему массиву и определяете ближайшее от текущих координат персонажа. Возвращаете скрипту координаты следующего дерева и удаляете его с массива. Если массив пустой - перегоняете в него с основного все координаты деревьев.
Принцип такой, что если персонаж периодически забегает на лодку (или кудато еще) скинуть важные доски - вы не будете возвращаться к след. в массиве дереву, а будете идти к ближайшему тоже ...
			 
			
					
				Re: Сортировка тайлов по координатам?
				Posted: 21.06.2011 16:54
				by Vizit0r
				зачем делать массив деревьев, если можно определять их динамически?
			 
			
					
				Re: Сортировка тайлов по координатам?
				Posted: 21.06.2011 16:58
				by Fenix
				Думается, в этом случае проще контролировать диапазон "лесозаготовки". А то ещё уйдет куда-нить, пока будет лес валить.
			 
			
					
				Re: Сортировка тайлов по координатам?
				Posted: 21.06.2011 17:00
				by Vizit0r
				а куда-то ненадо, функция определения статики задается параметрами X1-Y1,X2-Y2, так что дальше заданного квадрата ничего не найдет, и соответственно не уйдет.
			 
			
					
				Re: Сортировка тайлов по координатам?
				Posted: 21.06.2011 18:47
				by Fenix
				Ну так ведь нет особого смысла постоянно терзать GetStaticTilesArray, если можно все нужные данные единоразово выбрать в массив.
			 
			
					
				Re: Сортировка тайлов по координатам?
				Posted: 21.06.2011 19:31
				by Vizit0r
				вобщем-то да, если файла нет - создаем автоматом, если есть - работаем с ним