Найти тему
Просто решаем всё

Как остановить цикл? Как поставить цикл на паузу и продолжить? Pascal, Python, JavaScript.

Добрый день! Продолжаем тему циклов, ранее мы посмотрели, как сделать задержку в цикле на распространенных "школьных" Pascal, Python и также JavaScript. Однако для создания, например, простой игры, нам потребуется еще и возможность останавливать циклы и ставить их на паузу и продолжать.

Сразу покажу результат на JS:

Mы можем поставить цикл на паузу и возобновить его, а также прервать, для этого нам понадобятся три функции - Start(), Pause() и Stop(), а также две переменных состояния pauseState и stopState, изначально они имеют значение false:

let pauseState = false;
let stopState = false;

async function Start() {
stopState = false;
console.log("Старт");
for (let i = 0; i <= 10; i++) {
while (pauseState) {
await delay(100); // проверяем состояние pauseState каждые 100мс
}
if (stopState) {
console.log("Цикл прерван!");
return;
}
console.log(i);
await delay(1000); // ждем одну секунду перед выполнением следующей итерации цикла
}
console.log("Цикл завершен!");
}

function Pause() {
pauseState = !pauseState; //меняем состояние pauseState
}

function Stop() {
stopState = true;
pauseState = false; //ставим pauseState ложным, иначе не будет повторного запуска, если цикл был прерван в момент паузы
}

Рабочий пример (с дополнительными сообщениями и блокировкой кнопок) - как обычно на CodePen.

А что же с питоном и паскалем? В Python подобный код будет выглядет так (для разнообразия используем цикл while без задержки):

import msvcrt
print("Нажмите любую клавишу, чтобы остановить цикл.")
while(True):
if msvcrt.kbhit(): # проверка наличия нажатия клавиши
break # выход из цикла, если клавиша была нажата
print("Выполняется")
print("Цикл завершен.")

Внимание! Перед нажатием на кнопку сделайте клик в окне терминала!

Это пример самой простой остановки "бесконечного" цикла по нажатию на любую клавишу на python. Здесь мы используем модуль msvcrt. Мsvcrt (Microsoft Visual C++ Runtime Library) - это модуль Python, который предоставляет доступ к функциям стандартной библиотеки Microsoft Visual C++ Runtime. Этот модуль может использоваться для работы с низкоуровневыми функциями операционной системы, такими как ввод-вывод символов, обработка сигналов и другие. Конкретно, функция msvcrt.kbhit() из модуля msvcrt проверяет, была ли нажата клавиша на клавиатуре. Если клавиша была нажата, функция возвращает True, в противном случае - False.

Таким образом, можно добавить (аналогично примеру на JS) и кнопки паузы/продолжения.

Ну и в заключение, приведем подобный код на Паскале (для разнообразия используем цикл repeat until):

program StopOnKeyPress;
uses
crt;
var
key: char;
begin
repeat
// здесь идет ваш код цикла
writeln('Цикл работает');
if keypressed then // проверяем, нажата ли какая-то клавиша на клавиатуре
begin
key := readkey; // считываем нажатую клавишу
break; // выходим из цикла
end;
until false;
end.

Если интересна дальнейшая доработка примеров на Python и Паскалe - жду в комментариях.

Удачи!

Также по этой теме: как сделать задержку в цикле.