Pascal полноэкранная программа в терминале

смотрите, есть код программы. Она рисует арену звёздочек и по контуру ходит символ решётка, пока пользователь не нажмёт какую-либо клавишу. Работает не совсем так как мне хотелось бы. Помогите улучшить, а именно чтобы после каждого прохождения символа решётки по всей траектории, второй и последующие циклы этого прохождения делались бы точно на тех же координатах, а не со смещением вниз. Если это конечно возможно сделать в терминале. И когда сейчас нажимаю любую кнопку, программа в принципе останавливается, но с большой задержкой, помогите сделать без задержки. И в целом оптимизировать код, если получится. Заранее благодарю.

program ClearScreen;
uses crt, sysutils;

const
  width = 12;
  height = 12;
  delay = 100;

var
  x, y, i, j : Integer;
  ch : Char;
  x_coord, y_coord : Integer;

procedure DrawGrid(x, y : Integer);
begin
  for i := 0 to 9 do
  begin
    for j := 0 to 9 do
    begin
      gotoxy(x + i, y + j);
      write('*');
    end;
  end;
end;

procedure MoveGrid(var x, y : Integer);
var
  dirX, dirY : Integer;
begin
  dirX := 1;
  dirY := 1;
  x_coord:= x;
  y_coord:= y;
  while not keypressed do
  begin
    for i := 0 to 9 do
    begin
      gotoxy(x_coord + i, y_coord);
      write('#');
      sleep(delay);
      gotoxy(x_coord + i, y_coord);
      write('*');
    end;
    for i := 0 to 9 do
    begin
      gotoxy(x_coord + 9, y_coord + i);
      write('#');
      sleep(delay);
      gotoxy(x_coord + 9, y_coord + i);
      write('*');
    end;
    for i := 9 downto 0 do
    begin
      gotoxy(x_coord + i, y_coord + 9);
      write('#');
      sleep(delay);
      gotoxy(x_coord + i, y_coord + 9);
      write('*');
    end;
    for i := 9 downto 0 do
    begin
      gotoxy(x_coord, y_coord + i);
      write('#');
      sleep(delay);
      gotoxy(x_coord, y_coord + i);
      write('*');
    end;

    if (x_coord = 0) or (y_coord = 0) or (x_coord = width-10) or (y_coord = height-10) then
    begin
      if (x_coord = width-10) then
        dirX := -1;
      if (x_coord = 0) then
        dirX := 1;
      if (y_coord = height-10) then
        dirY := -1;
      if (y_coord = 0) then
        dirY := 1;
    end;
    x_coord := x_coord + dirX;
    y_coord := y_coord + dirY;
    gotoxy(1,1);
    writeln('X:', x, ' Y:', y);
  end;
end;

begin
  clrscr;
  x := (ScreenWidth div 2) - 5;
  y := (ScreenHeight div 2) - 5;
  repeat
    DrawGrid(x, y);
    MoveGrid(x, y);
    ch := readkey;
  until ord(ch) <> 0;
  clrscr;
end.

Ответы (1 шт):

Автор решения: Илья
uses Crt, SysUtils;

const
  Width = 12;
  Height = 12;
  Delay = 100;
  GridWidth = 10;
  GridHeight = 10;
  GridBack = '*';
  GridRunner = '#';

procedure DrawGrid(x, y: Integer);
var
  i, j: Integer;
begin
  for i := 0 to GridHeight - 1 do begin
    GotoXY(x, y + i);
    for j := 0 to GridWidth - 1 do
      Write(GridBack);
  end;
end;

procedure MoveGrid(x, y: Integer);

  procedure Animate;
  var
    i: Integer;
  begin
    for i := 0 to GridWidth - 1 do begin
      GotoXY(x + i, y);
      Write(GridRunner);
      GotoXY(x + i, y);
      Sleep(Delay);
      Write(GridBack);
      if KeyPressed then Exit;
    end;
    for i := 0 to GridHeight - 1 do begin
      GotoXY(x + GridWidth - 1, y + i);
      Write(GridRunner);
      GotoXY(x + GridWidth - 1, y + i);
      Sleep(Delay);
      Write(GridBack);
      if KeyPressed then Exit;
    end;
    for i := GridWidth - 1 downto 0 do begin
      GotoXY(x + i, y + GridHeight - 1);
      Write(GridRunner);
      GotoXY(x + i, y + GridHeight - 1);
      Sleep(Delay);
      Write(GridBack);
      if KeyPressed then Exit;
    end;
    for i := GridHeight - 1 downto 0 do begin
      GotoXY(x, y + i);
      Write(GridRunner);
      GotoXY(x, y + i);
      Sleep(Delay);
      Write(GridBack);
      if KeyPressed then Exit;
    end;
  end;

begin
  while not KeyPressed do begin
    GotoXY(1, 1);
    Animate;
  end;
  if ReadKey = #0 then ReadKey;
end;

var
  x, y: Integer;
begin
  ClrScr;
  x := (ScreenWidth - GridWidth) div 2;
  y := (ScreenHeight - GridHeight) div 2;
  DrawGrid(x, y);
  MoveGrid(x, y);
  ClrScr;
end.
→ Ссылка