smirnvlad
Full Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору не хорошо использовать графические координаты для управления логикой, лучше было бы, инициализировать объекты их координатами в поле, а при рисовании рассчитывать графические координаты, это позволит быстро менять размеры как поля, так и ящиков и проще определять на своем ли месте ящики ещё можно завести двумерный массив размером с поле, и вписывать в него ссылки на объекты или числами тип объекта (-1 за пределом поля, 0 пустое место, 1 стена, 2 ящик) тогда, если поле в направлении движения = 2, а следующее за ним 0, то двигать ящик, иначе если поле рядом =0, то двигать себя Код: procedure checkleft(var m:mas;var l:maz;n,k:integer; var cub:pcube); var i,j,v:integer; f,f1:boolean; a1,b1,a2,b2:integer; begin F:=false; f1:=false; i:=1; j:=1; cub^.getxy(a1, b1); if (a1=120) then {main wall ! } f:=true else if (a1 > 120) then {not main wall} while (f=false) and (i <= n) do {wall?} begin m[i]^.getxy(a2,b2); if (a2=a1-41) and (b1=b2) then f:=true; i:=i+1; end; if f=false then {if no wall to the left} while (f1=false) and (j <= k) do {box?} begin l[j]^.getxy(a2,b2); if (a2=a1-41) and (b1=b2) then begin f1:=true;v:=j; end; j:=j+1; end; i:=1; if (f1=true) then {if box} if a1=120+41 then {main wall!} f:=true else while (f=false) and (i <= n) do {wall undo box} begin m[i]^.getxy(a2,b2); if (a2=a1-82) and (b1=b2) then f:=true; i:=i+1; end; if (f=false) and (f1=false) then cub^.move(-41,0); if (f=false) and (f1=true)then begin l[v]^.move(-41,0); cub^.move(-41,0); end; end; |
|