Как остановить вложенный l oop? Он повторяется снова и снова. Я хочу только 18 результатов, а не 81 - PullRequest
0 голосов
/ 06 мая 2020

image

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.

В левом верхнем углу показано, что производит мой код. Результаты, которые я пытаюсь получить, находятся внизу слева.

Photo of computer screen with IDE as described above

1 Ответ

0 голосов
/ 06 мая 2020

По сути, у вас есть этот код:

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] девять раз в этой строке. Вы видите, как это происходит?)

Это изъян в вашей логи c. Вам нужно всего 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.

Screenshot of program output: a 9-by-9 grid of capital letters.

...