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
НАШЕЛ мать его за ногу
http://www.nesterova.ru/bibl/algorithm_ ... imer2.html

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
вобщем-то да, если файла нет - создаем автоматом, если есть - работаем с ним