В задаче по массиву-лабиринту передвигается человек в виде циферки. А можно ли как то сделать так, чтобы именно рисунок человечка передвигался в нем, т.е. что-то нарисованное, а не простая цифра? Если можно, то примерно как это реализовать?
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;
TMan = objectpublicconstructor Init;
destructor Done;
function CanMove(dRow, dCol : integer) : boolean;
procedure Move(dRow, dCol : integer);
procedure Show;
private
row, col : integer;
coords : array [0..7] ofrecord row, col : byte; end;
end;
constructor TMan.Init;
begin
row := FIELD_SIZE div2;
col := row;
Move(0, 0);
end;
destructor TMan.Done;
beginend;
function TMan.CanMove(dRow, dCol : integer) : boolean;
var
stop : boolean;
begin
row := row + dRow;
col := col + dCol;
// столкновение с "бортами" возможно в 4-х точках, проверим их
stop := false;
stop := ((row - 1) < 1);
ifnot stop then stop := ((row + 3) > FIELD_SIZE);
ifnot stop then stop := ((col - 1) < 1);
ifnot stop then stop := ((col + 1) > FIELD_SIZE);
if stop thenbegin
row := row - dRow;
col := col - dCol;
end;
CanMove := not stop;
end;
procedure TMan.Move(dRow, dCol : integer);
begin
coords[0].row := row;
coords[0].col := col;
coords[1].row := row - 1;
coords[1].col := col;
coords[2].row := row;
coords[2].col := col - 1;
coords[3].row := row;
coords[3].col := col + 1;
coords[4].row := row + 1;
coords[4].col := col;
coords[5].row := row + 2;
coords[5].col := col;
coords[6].row := row + 3;
coords[6].col := col - 1;
coords[7].row := row + 3;
coords[7].col := col + 1end;
procedure TMan.Show;
beginend;
procedure PrintField(f : TField; m : TMan);
var
i, j : byte;
begin
FillChar(f, sizeof(f), 0);
with m dobeginfor i := 1to7dowith coords[i] do
f[row, col] := 1;
end;
for i := 1to FIELD_SIZE dobegin
writeln;
for j := 1to FIELD_SIZE dobegincase f[i,j] of0 : 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 нарисовать какого-то стикмена, сделать его объектом и где стоит человек, в эту область экрана помещать этого стикмена. Или это очень трудно реализовать, что пытаться даже не стоит? Или тогда надо чисто в графическом режиме работать, лабиринт в нем отрисовать и т.д.?