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

Рейтинг: -3Ответов: 1Опубликовано: 15.01.2023

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

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.

Ответы

Ответов пока нет.