В задаче по массиву-лабиринту передвигается человек в виде циферки. А можно ли как то сделать так, чтобы именно рисунок человечка передвигался в нем, т.е. что-то нарисованное, а не простая цифра? Если можно, то примерно как это реализовать?
klem4
28.03.2006 10:06
Можно, отрисовывать фигуру относительно базовой точки, проверяя условие выхода за границы массива.
GoodWind
28.03.2006 11:08
подозреваю, что сделать это нужно в текстовом режиме. Если так, то придется перепрограммировать знакогенератор... вечером посмотрю как это делается...
klem4
28.03.2006 14:41
Вот накатал
Управление
w - up s - down a - left d - right
escape - exit
uses crt; const FIELD_SIZE = 20;
type
TField = array [1..FIELD_SIZE, 1..FIELD_SIZE] of byte;
row, col : integer; coords : array [0..7] of record row, col : byte; end; end;
constructor TMan.Init; begin row := FIELD_SIZE div 2; col := row; Move(0, 0); end;
destructor TMan.Done; begin end;
function TMan.CanMove(dRow, dCol : integer) : boolean; var stop : boolean; begin
row := row + dRow; col := col + dCol;
// столкновение с "бортами" возможно в 4-х точках, проверим их
stop := false;
stop := ((row - 1) < 1); if not stop then stop := ((row + 3) > FIELD_SIZE); if not stop then stop := ((col - 1) < 1); if not stop then stop := ((col + 1) > FIELD_SIZE);
if stop then begin row := row - dRow; col := col - dCol; end; CanMove := not stop;
procedure PrintField(f : TField; m : TMan); var i, j : byte; begin FillChar(f, sizeof(f), 0); with m do begin for i := 1 to 7 do with coords[i] do f[row, col] := 1; end;
for i := 1 to FIELD_SIZE do begin writeln; for j := 1 to FIELD_SIZE do begin case f[i,j] of 0 : TextColor(White); 1 : TextColor(Blue); end; write(f[i,j] : 2); end; end; end;
var man : TMan; field : TField; ch : char; dr, dc : integer;
begin
Clrscr;
man.Init;
repeat dr := 0; dc := 0; clrscr; PrintField(field, man); ch := readkey; case ch of 'w' : begin dr := -1; dc := 0; end; 's' : begin dr := +1; dc := 0; end; 'a' : begin dc := -1; dr := 0; end; 'd' : begin dc := +1; dr := 0; end; end; if man.CanMove(dr, dc) then man.Move(dr, dc); until ch = #27;
man.Done;
end.
С лабиринтом конечно будет похуже ... но если человека делать просто как циферку, то все еще вроще.
DFooz
28.03.2006 17:05
спасибо, будем разбираться с объектами=) жалко, что разрешение экрана маленькое и шрифт большой, а то в самый раз бы.
Цитата
подозреваю, что сделать это нужно в текстовом режиме. Если так, то придется перепрограммировать знакогенератор... вечером посмотрю как это делается...
посмотри пж-та, если это не тяжело
А если напр. с помощью Graph нарисовать какого-то стикмена, сделать его объектом и где стоит человек, в эту область экрана помещать этого стикмена. Или это очень трудно реализовать, что пытаться даже не стоит? Или тогда надо чисто в графическом режиме работать, лабиринт в нем отрисовать и т.д.?