Advertisement
EasternTime

function ListAllSets

May 1st, 2016
28
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 5.19 KB | None | 0 0
  1. function ListAllSets(minweight,maxweight: single):integer;
  2. //Переменные здесь и везде используются аккурат того размера, который будет нужен.
  3. //Оперативка лишней не бывает.
  4. var SetWeight: single;
  5.     count,i1,i2,i3,i4:integer;
  6.     HeadLength,BodyLength,HandsLength,LegsLength: byte;
  7.     SpinValues: array [1..8] of integer;
  8.     //t : TDateTime;   //Использовалось для проверки скорости выполнения функции
  9. begin
  10.   //t:=Now;
  11.   //Обнуляем массив, маленький хак
  12.   SetLength(megatable,0);
  13.   //Переменная - счётчик длины MegaTable. Точно лучше, чем дёргать high().
  14.   count:=0;
  15.   //Выводим значения спинэдитов в отдельные переменные, чтобы не трогать форму из цикла.
  16.   SpinValues[1]:=Form1.SpinEdit1.Value;
  17.   SpinValues[2]:=Form1.SpinEdit2.Value;
  18.   SpinValues[3]:=Form1.SpinEdit3.Value;
  19.   SpinValues[4]:=Form1.SpinEdit4.Value;
  20.   SpinValues[5]:=Form1.SpinEdit5.Value;
  21.   SpinValues[6]:=Form1.SpinEdit6.Value;
  22.   SpinValues[7]:=Form1.SpinEdit7.Value;
  23.   SpinValues[8]:=Form1.SpinEdit8.Value;
  24.   //Заранее вычисляем нужные нам количества интеракций
  25.   HeadLength:=length(head)-1;
  26.   BodyLength:=length(body)-1;
  27.   HandsLength:=length(hands)-1;
  28.   LegsLength:=length(legs)-1;
  29.   //Начинаем циклы.
  30.   //Тут я составляю список всех возможных сочетаний кусков брони, находящихся в
  31.   //  распоряжении игрока, с ограничениями в максимуме веса. Это часть калькулятора для
  32.   //  оптимизации персонажа.
  33.   //Я пренебрёг оптимизацией развилок - отбрасывание целых ветвей потенциальных
  34.   //  вычислений показалось мне более эффективным
  35.   for i1 := 0 to HeadLength do
  36.     if head[i1].Active then           //Нам не нужно вычислять комбинации для того, чего у игрока нет
  37.     for i2 := 0 to BodyLength do
  38.       if body[i2].Active then
  39.       for i3 := 0 to HandsLength do
  40.         if hands[i3].Active then
  41.         for i4 := 0 to LegsLength do
  42.           if legs[i4].Active then
  43.           begin
  44.             //Вычисляем вес сета заранее, чтобы не делать это несколько раз.
  45.             SetWeight:=head[i1].Weight+body[i2].Weight+hands[i3].Weight+legs[i4].Weight;
  46.             //Оптимальный вариант, как правило, очень близко к maxweight -
  47.             //  так что мы отбрасываем слишком далёкие значения с помощью minweight
  48.             //  (он вычисляется в другом месте)
  49.             if (SetWeight<maxweight) and (SetWeight>=minweight) then
  50.             begin
  51.               //Увеличиваем длину динамического массива
  52.               SetLength(megatable,count+1);
  53.               //MegaTable - это массив кастомных записей (record)
  54.               //with даёт нам чуточку производительности
  55.               with megatable[count] do
  56.               begin
  57.                 //Записываем id предметов, составляющих сет
  58.                 id1:=i1;
  59.                 id2:=i2;
  60.                 id3:=i3;
  61.                 id4:=i4;
  62.                 //Вычисляем насколько сет нам подходит - перемножаем чистые статы на наши приоритеты
  63.                 quality:=(SpinValues[1]*(head[i1].Physical+body[i2].Physical+hands[i3].Physical+legs[i4].Physical))
  64.                   + (SpinValues[2]*(head[i1].Striking+body[i2].Striking+hands[i3].Striking+legs[i4].Striking))
  65.                   + (SpinValues[3]*(head[i1].Slashing+body[i2].Slashing+hands[i3].Slashing+legs[i4].Slashing))
  66.                   + (SpinValues[4]*(head[i1].Thrusting+body[i2].Thrusting+hands[i3].Thrusting+legs[i4].Thrusting))
  67.                   + (SpinValues[5]*(head[i1].Magic+body[i2].Magic+hands[i3].Magic+legs[i4].Magic))
  68.                   + (SpinValues[6]*(head[i1].Fire+body[i2].Fire+hands[i3].Fire+legs[i4].Fire))
  69.                   + (SpinValues[7]*(head[i1].Lightning+body[i2].Lightning+hands[i3].Lightning+legs[i4].Lightning))
  70.                   + (SpinValues[8]*(head[i1].Dark+body[i2].Dark+hands[i3].Dark+legs[i4].Dark));
  71.                 //Переиспользуем уже вычесленный вес
  72.                 Weight:=SetWeight;
  73.               end;
  74.               //Немножко хороших привычек кодинга
  75.               inc(count);
  76.             end;
  77.           end;
  78.   //Form1.Label26.Caption:=FormatDateTime('hh:nn:ss:zzz', Now-t);
  79.   //Возвращаем счётчик как результат - точно лучше, чем лишний раз дёргать high().
  80.   result:=count;
  81. end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement