forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты на MidletPascal (http://forum.boolean.name/forumdisplay.php?f=88)
-   -   La Nuit Tombe (изометрический движок) (http://forum.boolean.name/showthread.php?t=12699)

_Nox_ 27.10.2010 01:09

Ответ: La Nuit Tombe (изометрический движок)
 
Код:

program heapsort;
const
        max_Heap = 10000;
type
        THeap = record
          h:array [1..max_heap] of integer;
          E:integer;         
        end; 

var
        Heap: theap;
        i,p:integer;
       
procedure create_heap;
begin

heap.E:=0;
 
end;

procedure in_heap (A:integer);
var
        cc:integer;
        cur:integer;
begin
inc (heap.e);
heap.h [heap.e]:=a;
cur:=heap.e;
while (heap.h [cur]<heap.h [cur div 2]) do
 begin
  cc:=heap.h [cur];
  heap.h [cur]:=heap.h [cur div 2];
  heap.h [cur div 2]:=cc;
  cur := cur div 2;
  if cur = 1 then break;
 end;
end;

PROCEDURE OUT_HEAP (var A:integer);
var
        cc,cur,next:integer;
begin
a:=heap.h[1];
heap.h [1]:=heap.h[heap.e];
dec (heap.E);
cur:=1;
while true do
 begin
  if heap.h [cur*2]<heap.h [cur*2+1] then next:=cur*2 else next:=cur*2+1;
  if heap.h [cur]>heap.h [next] then
  begin
    cc:=heap.h [cur];
    heap.h [cur]:=heap.h [next];
    heap.h [next]:=cc;
    cur := next;
    if cur * 2> heap.e then break;
  end else break;
 end;
end;


begin
create_heap;
for i:=1 to 1000 do
 IN_heap (random (10000));
for i:=1 to 1000 do
 begin
  Out_heap (P);
  write (p, ' ');
 end;
end.

Вот, только что написал, слегка протестировал, вроди работает, адаптируй код под себя, мне просто спать уже пора, нет времени, кстати, я бы тебе посоветовал, посчитать сразу один массив с суммами, чтобы сократить количество вычислений. И не забудь указать кто код писал:)

cherepets 27.10.2010 12:01

Ответ: La Nuit Tombe (изометрический движок)
 
я так понял Е - число заполненных элементов массива?
тогда у меня выходит вот чего:


и вот:

(слева твоя, справа пузырьковая)

Судя по тому что в игре стены отрисованы правильно, то при первом пробеге массив отсортировался правильно, но когда значения меняются - он их не сортирует((

Вообще есть мысль сделать массив boolean'ов и туда загонять индексы изменившихся элементов. Тогда, надеюсь выйдет ускорить сортировку)

_Nox_ 27.10.2010 16:39

Ответ: La Nuit Tombe (изометрический движок)
 
На таких маленьких числах, пузырьковая сортировка по любому выигрывает, Если бы размерность была хотя бы более тысяч чисел, то тогда действительно, имеет смысл использовать другие виды сортировок,

Кстати, что-то на первой картинке, мужыки как-то не правильно стоят, то от сортировки зависит?

cherepets 27.10.2010 19:49

Ответ: La Nuit Tombe (изометрический движок)
 
У меня и стены и враги в одном массиве.
Враги уже перешли на новое место, а в массиве их положение не изменилось.

Просто на реальном телефоне пузырьковая тратит ~30мс, а не 1 как эмулятор. А это уже не очень-то хорошо(

psih1 27.10.2010 22:08

Ответ: La Nuit Tombe (изометрический движок)
 
а можеш дать свою формулу формиравания тайлов на карте

cherepets 28.10.2010 20:06

Ответ: La Nuit Tombe (изометрический движок)
 
Как-то так, но вообще зависит от реализации всего остального:

drawimage(tile,tile_x*21-tile_y*21-hero_x*21-hero_x2*2+hero_y*21+hero_y2*2+100,i*10+j*10-hero_x*10-hero_x2-hero_y*10-hero_y2+160+r);


Часовой пояс GMT +4, время: 06:15.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot