Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Оптимизация кода игры: эффективный выход из вложенных циклов в Delphi 7 на Pascal

Delphi , ОС и Железо , DOS и Консоль

Вопрос пользователя касается оптимизации игры, написанной на Pascal для консоли в Delphi 7. Проблема заключается в том, что игра для угадывания слова зациклена: даже если введённая буква отсутствует в массиве угаданных букв, цикл продолжает выполняться 20 раз, что неэффективно. Пользователь просит помочь остановить цикл, как только буква найдена или после 20 попыток, если буква не угадана.

Проблема

Исходный код содержит повторяющийся цикл, который должен проверять, была ли уже введена определённая буква. Однако, несмотря на то, что условие выхода из цикла должно выполняться сразу, после первой проверки, цикл продолжает свою работу 20 раз, что приводит к ненужным вычислениям.

Write ('Guess a letter: ');
Readln (guess);
Guess := UpCase(Guess);
repeat
  for i := 1 to 20 do
  begin
    if guess = guesses[i] then
      begin
        guessed := true;
      end
    else begin
      guessed := false;
    end;
  end;
until (guessed = true) or (i = 20) ;

Подтверждённый ответ

Проблема в том, что булева переменная guessed перезаписывается на каждом шаге цикла, и её значение теряется после завершения цикла, так как в Pascal переменные, объявленные внутри цикла, не доступны после его завершения. Кроме того, не используется инструкция break, которая позволила бы выйти из цикла при первом же совпадении.

Исправленный код должен включать инструкцию break для выхода из цикла, если буква найдена, и изменение логики проверки, чтобы булева переменная guessed сохраняла своё значение после завершения цикла:

Write ('Guess a letter: ');
Readln (guess);
Guess := UpCase(Guess);
guessed := False;
for i := 1 to 20 do
begin
  if guess = guesses[i] then
  begin
    guessed := true;
    break; // Выход из цикла, если буква найдена
  end;
end;
if guessed then
  // Обработка угаданной буквы
else
  // Обработка не угаданной буквы

Альтернативный ответ

Предложено также использовать break для выхода из внутреннего цикла при нахождении совпадения, а также изменить логику repeat-цикла, чтобы он выполнял другие действия, например, запрашивал новый ввод, если буква не была угадана.

Пример оптимизированного кода

procedure Demo;
var
  guess: Char;
  guesses: Array of Char;
  i: Integer;
  guessed: Boolean;
begin
  repeat
    Write ('Guess a letter: ');
    Readln (guess);
    Guess := UpCase(Guess);
    if (Ord(Guess) >= 'A') and (Ord(Guess) <= 'Z') then begin
      guessed := False;
      for i := Low(guesses) to High(guesses) do
      begin
        if guess = guesses[i] then
        begin
          guessed := True;
          break;
        end;
      end;
      if guessed then
        WriteLn('An element in guesses matched your input')
      else
        WriteLn('The letter is not in the word, try again');
      // Валидация ввода для избежания бесконечного цикла
      if Length(Guess) <> 1 then break;
    end;
  until guessed;
end;

Заключение

Использование break в сочетании с корректной логикой булевой переменной позволяет эффективно выйти из вложенных циклов и оптимизировать работу игры. Важно также обратить внимание на валидацию ввода для предотвращения бесконечных циклов и исключений.

Создано по материалам из источника по ссылке.

Вопрос пользователя связан с оптимизацией кода игры на языке Pascal в среде Delphi 7, где необходимо устранить ненужные итерации вложенных циклов и правильно обрабатывать условие выхода из цикла.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: DOS и Консоль ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 22:00:12/0.0035219192504883/0