问题描述
我不知道如何正确地写标题,但我想知道是否有什么办法可以使我从控制台中清除单个空间,而不是清除整个内容以再次重写?例如,假设我要画出一个3×3的正方形,数字从1到9一直递减,是否有办法让我更改最后9个而不清除所有先前的数字。当我清除整个控制台时,会产生闪烁的效果,这很烦人。如果您想在代码中看到此示例,那么我打算在以下位置使用它:
program randomPath;
uses crt,sysutils;
type StrMultiArray = array of array of String;
var
finishedBoard : StrMultiArray;
size,i,j : integer;
regenerate : boolean;
function generateMap(size : integer) : StrMultiArray;
var
posx,posy,choice,counter : integer;
ongoing : boolean;
board : StrMultiArray;
begin
setLength(board,size,size);
for i := 0 to (size-1) do
begin
for j := 0 to (size-1) do
begin
board[i,j] := '#';
end;
end;
posx := (size div 2);
posy := (size div 2);
board[posx,posy] := ' ';
ongoing := true;
counter := 0;
while ongoing = true do
begin
choice := random(2);
if (choice = 0) then
begin
choice := random(2);
if (choice = 0) then
begin
if (posx > 0) then
begin
posx := posx - 1;
end;
end
else
begin
if (posx < size-1) then
begin
posx := posx + 1;
end;
end;
end
else
begin
choice := random(2);
if (choice = 0) then
begin
if (posy > 0) then
begin
posy := posy - 1;
end;
end
else
begin
if (posy < size-1) then
begin
posy := posy + 1;
end;
end;
end;
counter := counter + 1;
board[posx,posy] := ' ';
if counter = (size * 12) then
begin
ongoing := false;
end;
end;
generateMap := board;
end;
procedure printBoard(board : StrMultiArray; size : integer);
begin
textColor(Cyan);
write('+');
for i := 0 to (size-1) do
begin
write('-');
end;
writeLn('+');
for i := 0 to (size-1) do
begin
textColor(Cyan);
write('|');
textColor(White);
for j := 0 to (size-1) do
begin
if (board[i,j] = '#') then
begin
textBackground(White);
end;
if (board[i,j] = '@') then
begin
textBackground(Red);
end;
//write(board[i,j]);
write(' ');
textBackground(Black);
end;
textColor(Cyan);
writeLn('|');
end;
textColor(Cyan);
write('+');
for i := 0 to (size-1) do
begin
write('-');
end;
writeLn('+');
textColor(White);
end;
procedure movePlayer(board : StrMultiArray; size : integer);
var
ongoing : boolean;
posx,prevx,prevy : integer;
input : char;
begin
ongoing := true;
posx := (size div 2);
posy := (size div 2);
while (ongoing = true) do
begin
board[posx,posy] := '@';
prevx := posx;
prevy := posy;
printBoard(board,size);
input := readKey();
clrscr();
case input of
'w' :
if (posx > 0) then
begin
if (board[posx-1,posy] = ' ') then
posx := posx - 1;
end;
'a' :
if (posy > 0) then
begin
if (board[posx,posy-1] = ' ') then
posy := posy - 1;
end;
's' :
if (posx < (size-1)) then
begin
if (board[posx+1,posy] = ' ') then
posx := posx + 1;
end;
'd' :
if (posy < (size-1)) then
begin
if (board[posx,posy+1] = ' ') then
posy := posy + 1;
end;
'x' :
begin
regenerate := false;
ongoing := false;
end;
else
ongoing := false;
end;
board[prevx,prevy] := ' ';
end;
end;
begin
size := 10;
regenerate := true;
randomize;
while (regenerate = true) do
begin
finishedBoard := generateMap(size);
movePlayer(finishedBoard,size);
end;
end.
解决方法
我在Pascal中发现了一个有用的功能,该功能允许您在控制台中选择一个位置以将“光标”移动到可以在该位置进行书写的位置。该函数称为GoToXY()
。文档可以在这里找到:https://www.freepascal.org/docs-html/rtl/crt/gotoxy.html。