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