如何停止我的嵌套循环?它一遍又一遍地循环。我只想要 18 个结果而不是 81
How do I stop my nested loop? It loops over and over again. I only want 18 results not 81
var
arrGame: array [1 .. 9, 1 .. 9] of char;
arrPlanets: array [1 .. 9, 1 .. 9] of char;
implementation
{$R *.dfm}
{$R+}
procedure TfrmQ3.btnQ3_1StartGameClick(Sender: TObject);
var
i, j: integer;
cGame: char;
begin
btnQ2Play.Enabled := true;
redQ3GameBoard.Clear;
redQ3incorrect.Clear;
for i := 1 to 9 do
begin
for j := 1 to 9 do
arrGame[i,j] := '-';
end;
for i := 1 to 9 do
begin
for j := 1 to 5 do
begin
redQ3GameBoard.Lines.Add(arrGame[i,j]+ ' ' + arrGame[i,
j] + ' ' + arrGame[i,j] + ' ' + arrGame[i,j] + ' ' + arrGame[i,
j] + ' ' + arrGame[i,j] + ' ' + arrGame[i,j] + ' ' + arrGame[i,
j] + ' ' + arrGame[i,j]);
end;
end;
end;
end.
左上角是我的代码生成的内容。我试图得到的结果在左下角。
你基本上有这个代码:
for i = 1 to 9 do
for j = 1 to 9 do
List.Lines.Add(...)
声明
List.Lines.Add(...)
会运行9×9=81次。由于此语句添加了一行,因此您将得到 81 行。 (此外,每行有九个相同的值!例如,当 i = 4 且 j = 6 时,您将在该行打印值 arrGame[4, 6]
九次。您能看出这是怎么回事吗?)
这是你的逻辑错误。您只需要 9 行,但每行应包含 9 个组件。因此,您需要重新设计代码。
由于这似乎是作业,因此我不会详细给出解决方案。相反,我会给你下面的命令行程序来学习:
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
var
Grid: array of array of Char;
const
N = 9;
var
i, j: Integer;
s: string;
function GetRandomLetter: Char;
begin
Result := Chr(Ord('A') + Random(Ord('Z') - Ord('A') + 1));
end;
begin
try
try
Randomize;
SetLength(Grid, N, N);
// Build grid
for i := 0 to N - 1 do
for j := 0 to N - 1 do
Grid[i, j] := GetRandomLetter;
// Draw grid
for i := 0 to N - 1 do
begin
s := Grid[i, 0];
for j := 1 to N - 1 do
s := s + #32 + Grid[i, j];
Writeln(s);
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
finally
Writeln('Press Return to exit.');
Readln;
end;
end.
var
arrGame: array [1 .. 9, 1 .. 9] of char;
arrPlanets: array [1 .. 9, 1 .. 9] of char;
implementation
{$R *.dfm}
{$R+}
procedure TfrmQ3.btnQ3_1StartGameClick(Sender: TObject);
var
i, j: integer;
cGame: char;
begin
btnQ2Play.Enabled := true;
redQ3GameBoard.Clear;
redQ3incorrect.Clear;
for i := 1 to 9 do
begin
for j := 1 to 9 do
arrGame[i,j] := '-';
end;
for i := 1 to 9 do
begin
for j := 1 to 5 do
begin
redQ3GameBoard.Lines.Add(arrGame[i,j]+ ' ' + arrGame[i,
j] + ' ' + arrGame[i,j] + ' ' + arrGame[i,j] + ' ' + arrGame[i,
j] + ' ' + arrGame[i,j] + ' ' + arrGame[i,j] + ' ' + arrGame[i,
j] + ' ' + arrGame[i,j]);
end;
end;
end;
end.
左上角是我的代码生成的内容。我试图得到的结果在左下角。
你基本上有这个代码:
for i = 1 to 9 do
for j = 1 to 9 do
List.Lines.Add(...)
声明
List.Lines.Add(...)
会运行9×9=81次。由于此语句添加了一行,因此您将得到 81 行。 (此外,每行有九个相同的值!例如,当 i = 4 且 j = 6 时,您将在该行打印值 arrGame[4, 6]
九次。您能看出这是怎么回事吗?)
这是你的逻辑错误。您只需要 9 行,但每行应包含 9 个组件。因此,您需要重新设计代码。
由于这似乎是作业,因此我不会详细给出解决方案。相反,我会给你下面的命令行程序来学习:
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
var
Grid: array of array of Char;
const
N = 9;
var
i, j: Integer;
s: string;
function GetRandomLetter: Char;
begin
Result := Chr(Ord('A') + Random(Ord('Z') - Ord('A') + 1));
end;
begin
try
try
Randomize;
SetLength(Grid, N, N);
// Build grid
for i := 0 to N - 1 do
for j := 0 to N - 1 do
Grid[i, j] := GetRandomLetter;
// Draw grid
for i := 0 to N - 1 do
begin
s := Grid[i, 0];
for j := 1 to N - 1 do
s := s + #32 + Grid[i, j];
Writeln(s);
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
finally
Writeln('Press Return to exit.');
Readln;
end;
end.