Циклы (Loops)

Иногда вы хотите сделать одну и ту же вещь не раз. Например, вы хотите получить секретный код - и спрашивать этот код пока пользователь не даст вам его. Если вы делаете только две попытки, то можно написать следующее:

var the_code = 12345; // номер секретного кода
var entered_number = 0;
string entry_line[80]
; // длинная пустая строка
function check_code
{
  print("Please enter number..."); // это отобразится на экране
  sleep(1); // ждать 1 секунду
  print(entry_line); // строка на экране дисплея
  inkey(entry_line); // ввод запроса с клавиатуры в строку
  entered_number = str_to_num(entry_line); // ввод от строки до номера
  if (entered_number != the_code)
  {
     print("Please enter number again...")
;
     sleep(1);
     print(entry_line);
     inkey(entry_line); // снова, пользовательский ввод
     entered_number = str_to_num(entry_line); // преобразовывание entry_line к entered_number
     if (entered_number != the_code)
     {
       print("Wrong again!"); // две попытки, теперь закончим функцию
       return;
     }
     else
     {
       print("
Wow! You've guessed it!"); // Сообщение "верно"
       return;
     }
  }
  else
  {
    print("
Wow! You've guessed it!");
    return;
  }
}

function main()
{
  screen_color.blue = 128; // установка темно-синего фона
 
check_code(); // запуск функции check_code
}

Это длинная и немного уродливая функция! Но тем неменее вы узнали некоторые новые команды. Если вы указываете номер между квадратными скобками [] при определении строки, таким образом вы создаете пустую строку состоящую из данного числа пробелов. Команда Sleep ждёт данное колличество секунд, и затем продолжает функцию. Inkey создаёт мигающий курсор и позволяет пользователю вводить символы в данную строку, до нажатия клавиши [Enter]. Str_to_num преобразует строковое содержание например - "123", в числовое. Мы должны производить данное преобразование, потому что мы не можем сравнить строку с числом в условии if, это подобно сравниванию яблок с апельсинами. Return заканчивает функцию.Как видите, эта функция не будет работать, если вы хотите продолжить вводить код, до получения правильного числа. И это будет выглядет довольно уродливо, если например вы хотели ввести код четыре раза, вместо двух! В этом случае, вы имели бы четыре пункта if-else, что так же будет не очень хорошо. Лучшее, что можно сделать, это повторять команду, и запрашивать у пользователя секретный код, до тех пор, пока команда не получит его. В языках программирования это действие известно как цикл. Вот пример цикла в действии:

function check_code
{
  while (entered_number != the_code)
  {
    print("Please enter correct number..."); // показать это на экране
    sleep(1); // ждём 1 секунду
    print(entry_line);
    inkey(entry_line); // ввод пользовательских запросов в строку
    entered_number = str_to_num(entry_line); // конвертация ввода из строки в число
  }
  print("Wow! You've guessed it!"); // Сообщение "верно"
}

Это цикл - while, который действительно упрощает нашу функцию. Цикл While имеет данную форму записи:

while (some test is true)
{
  do the stuff inside the curly braces
}

Вышеупомянутые строки говорят: "пока введённый код не будет верным, нужно продолжать получать ввод кода от пользователя". Цикл продолжит выполнять команды в фигурных скобках, пока условие ложно. В этом случае, условие будет ложно, если символы, которые вводит пользователь, не совпадают с правельным кодом (то есть "12345"). Условие истинно, если код неверный, это делает символ "!=".

Поскольку entered_number получает значение str_to_num внутри цикла while, это не будет иметь никакого значения в первый раз при запуске цикла. Поэтому мы определили его заранее с начальным значением 0, которое естественно не является номером кода.

Цикл бывает очень полезен, циклы как правило используются для того, чтобы выполнить набор команд определенное количество раз. Так же есть другой пример цикла. Мы хотим написать программу, которая сначала позволяет вам вводить число, и затем печатает на экране символы "x", колличество которых соответствует введённому числу. Давайте попробуем. Для начала, мы определим некоторые новые строки и переменные:
var counter = 0;
var entered_number = 0;
string entry_line[80]; // длинная пустая строка

function count_x
{
  print("Please enter number..."); // показывается на экране "Please enter number..."
  sleep(1); // ждём секунду, и продолжаем
  str_cpy(entry_line,""); // очищаем линию от предыдущего ввода, копируя пустую строку
  print(entry_line); // показываем строку
  inkey(entry_line); // пользовательский ввод в строку
  entered_number = str_to_num(entry_line); // конвертация ввода в числа
  str_cpy(entry_line,""); // очистка строки
  while (counter < entered_number)
  {
    str_cat(entry_line,"X"); // добавляем "x" в строку
    counter = counter + 1; // увеличение цикла
  }
}

function main()
{
  screen_color.blue = 128; // установка темно-синего фона
  ON_P = count_x; // назначаем функцию count_x на клавишу [P]
}

on_p подобна on_anykey которую мы уже знаем, но она назначает функцию count_x клавише [P]. Как вы уже догодались, вы можете назначить функцию на нажатие любой клавиши on_a, on_b и т.д. по такому же принципу. count_x говорит нам: "в то время как переменная counter - меньше чем введённое число строки 'x', добавляем ещё 'x' к строке, и затем добавляем 1 к значению counter". Str_cpy копирует вторую строку в первую, в то время как str_cat добавляет вторую строку к концу первой. Этот цикл продолжит добавлять 'x' к нашей строке и добавлять 1 к значению counter, пока counter не больше и не меньше чем требуемое число. Увеличение переменной цикла настолько часто и приемлемо в использовании, что программисты развили ускоренный метод этого ввода. Используя этот самый метод, цикл while может быть написан так:

while (counter < entered_number)
{
  str_cat(entry_line,"X"); // добавляем "x" в строку
  counter += 1; // и так counter = counter + 1;
}

Третья строка counter +=1, говорит, "добавляет 1 непосредственно к себе." Если вы хотите добавить 3 к a_number, вы пишете a_number += 3, это тоже самое, что написать a_number = a_number +3. Вы можете использовать -=, *=, и /= и по такому же принципу приминять их к своей записи. Программисты ленивый народ и они всегда придумывают сокращения наподобе этого. Протестируйте вышеупомянутую функцию. После того, как появится синий экран, нажмите [P]. Хорошо, кажется работает, но подождите, что это? Функция сработала только в первый раз! Если мы нажимаем клавишу [P] во второй раз, отображается меньше колличество 'x', чем мы ввели - или 'x' нет вообще. Это не то, что мы предполагали. Что, черт возьми, сдесь случилось?
Используются технологии uCoz