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.