Умовні оператори – це один з найбільш широко розповсюджених та використовуваних елементів не лише в практиці ActionScript 3, але й будь-якій іншій сучасній мові програмування. Саме тому люди із досвідом програмування дуже легко зрозуміють принципи їх функціонування у ActionScript. Для тих же, хто вивчає мову з нуля, я розповім про умовні оператори детальніше.
Умовний оператор (conditional statement) – це тип оператора, який виконується тільки за певної умови. Використання умовних операторів дозволяє контролювати роботу програми та вибирати один із кількох можливих шляхів подальшого виконання. Саме умовні оператори лежать в основі програмування комп’ютерного інтелекту, який широко використовується в іграх.
В основі умовних операторів лежить булева (boolean) логіка. Інакше кажучи, той чи інший блок коду буде виконаний тільки за умови правдивості (true) чи хибності (false) певного виразу. Що таке boolean-значення ви повинні пам’ятати із попередньої статті про типи змінних у ActionScript.
Всього у мові ActionScript існує два типи умовних операторів: if … else та switch … case. Щоб не бути голослівним і не надто багато говорити про теорію, продемонструю роботу кожного з операторыв на практиці.
Оператор if … else
Оператор if нагадує роздоріжжя. Основний принцип, який лежить в його основі, можна описати так: якщо певна рівність є правдивою (true) – то виконується блок коду всередині оператора if, якщо ж результатом рівності є хибне значення (false) – то виконується блок коду після оператора else…
Загальну структуру оператора if … else можна зобразити так:
if ( умовнаРівність ) { блокКоду1 } else { блокКоду2 }
Як працюватиме цей код? Коли при виконанні AS-програми зустрічається оператор if, середовище Flash виконує або інструкції блокКоду1, або інструкції блокКоду2. Те, який саме блокКоду буде виконаний, залежить від значення умовноїРівності. Якщо умовнаРівність повертає значення true – буде виконаний блокКоду1; якщо false – блокКоду2.
Найчастіше умовноюРівністю оператора if буде або вираз рівності, або вираз відношення. Зазвичай умовнаРівність матиме такий вигляд:
змінна1 оператор змінна2
І якщо зі змінними все зрозуміло, то про оператори рівності/відношення потрібно написати окремо. Насправді їх існує не так вже й багато і нижче наведено повний їх перелік:
Оператор | В яких випадках використовується |
---|---|
== | Перевіряє, чи змінна1 дорівнює змінній2 |
>= | Перевіряє, чи змінна1 більша або дорівнює змінній2 |
> | Перевіряє, чи змінна1 більша за змінну2 |
<= | Перевіряє, чи змінна1 один менша або дорівнює змінній2 |
< | Перевіряє, чи змінна1 менша за змінну2 |
!= | Перевіряє, чи змінна1 не дорівнює змінній2 |
&& | Перевіряє, чи обидві змінні існують або чи обидві змінні мають значення true. Цей оператор називається умовним оператором “і” (and) |
|| | Перевіряє, чи хоча б одна з двох змінних існує або має значення true. Цей оператор називається умовним оператором “чи” (or) |
Трохи забагато теорії?
Давайте спробуємо розібратися, як це працює на практиці!
Припустимо, нам потрібно створити програму, яка визначатиме, чи достатньо доросла людина, щоб купувати пиво у кіоску. Змінна age відповідатиме за вік.
if ( age >= 21 ) { //Ви можете купувати пиво в кіоску } else { //Ви занадто малі, щоб купувати пиво в кіоску }
Як працює цей код?
Вираз age >= 21 перевіряє, чи вік людини більше або дорівнює 21. У випадку, якщо ця рівність правдива – повертається значення true і виконується перший блок коду: “Ви можете купувати пиво в кіоску”. Якщо ж рівність виявляється неправдивою (тобто вік людини менше 21) – повертається значення false і виконується другий блок коду: “Ви занадто малі, щоб купувати пиво в кіоску”.
Але що робити, якщо варіантів подій може бути більше, ніж дві? В такому випадку в нагоді стає оператор else if. Давайте спробуємо створити програму, подібну до попередньої, тільки визначатиме вона, дитина ви, учень/студент, працівник чи пенсіонер (цілих чотири варіанти подій).
if ( age < 7 ) { //Ви дитина } else if ( age >= 7 && age < 22) { //Ви учень або студент } else if ( age >= 22 && age < 66) { //Ви працівник } else { //Ви пенсіонер }
За аналогією з попередньою програмою можна зрозуміти, які дії виконує цей код. Але про всяк випадок давайте розберемося.
Якщо ваш вік менше 7 років – програма визначає, що ви дитина.
Якщо ж ваш вік більше або дорівнює 7 рокам – тоді включається наступний блок коду (після else) і цим блоком коду виявляється новий оператор if. Цього разу перевіряється, чи потрапляє ваш вік у проміжок від 7 до 21 року (age >= 7 && age < 22) – обидва вирази повинні повертати значення true, тоді програма виконає код: “Ви учень або студент”.
Якщо хоча б одне зі значень буде false – програма перейде до наступної частини коду, де знову наткнеться на умовний оператор: (age >= 22 && age < 66). Якщо ваш вік потрапляє у проміжок від 22 до 65 – виконається код “Ви працівник”.
Нарешті, якщо ваш вік виявиться більшим за 65 років – виконається останній блок коду після одиничного оператора else: “Ви пенсіонер”.
Як це можна застосувати у реальній програмі?
Весь попередній код слугував ілюстрацією принципів роботи умовних операторів. Але як це може бути втілене у реальній програмі, наприклад, у грі.
Я наведу частинку коду з моєї гри про черепаху. В грі черепаха під час польоту може збирати бонуси – монетки, мішечки з золотом або артефакти. Бонуси додаються випадковим чином і з різним шансом. Наприклад, шанс зібрати монетку – 70%, шанс зібрати мішечок – 20%, шанс зібрати артефакт – 10%.
Як це реалізовано у коді?
Я створив MovieClip з трьома кадрами. В першому кадрі – монетка, в другому – мішечок, в третьому – артефакт. Оператор if … else визначає, який із кадрів показати базуючись на випадковому значенні, яке генерується за допомогою функції Math.random.
bonuses.gotoAndStop(1); button.addEventListener(MouseEvent.CLICK, onClickHandler); function onClickHandler (e:MouseEvent): void { var frameNumber:int = Math.floor(Math.random()*100)+1; if (frameNumber <= 70) { bonuses.gotoAndStop(1); } else if (frameNumber > 70 && frameNumber <= 90) { bonuses.gotoAndStop(2); } else { bonuses.gotoAndStop(3); } }
Коротко про те, що відбувається в програмі. Є два об’єкти: фрагмент кліпу (MovieClip) bonuses і кнопка (Button) button. Оскільки в MovieClip-і з монеткою три кадри (монетка, мішечок і артефакт (мантія)) – першою стрічкою коду ми фіксуємо його на першому кадрі – монетка.
Додаємо слухач подій до кнопки, при натисканні на яку буде виконуватися функція onClickHandler (детальніше про слухачі подій можна прочитати у відповідній статті).
В самій функції ми присвоюємо змінній frameNumber випадкове числове значення від 1 до 100. А потім, за допомогою щойно розглянутого умовного оператора if … else перевіряємо це значення.
Якщо значення frameNumber потрапляє у проміжок від 1 до 70 – ми переводимо MovieClip на перший кадр (виводимо монетку); якщо у проміжок від 71 до 90 – ми переводимо MovieClip у другий кадр (виводимо мішечок); в іншому випадку (проміжок від 91 до 100) переводимо MovieClip у третій кадр (виводимо артефакт – мантія).
Отже шанс, що випаде монетка – 70%, мішечок – 20% і артефакт – 10%.
А ось і результат.
Клікайте по кнопці Generate.
Оператор switch … case
Оператор switch – це своєрідна заміна довгого ланцюжка операторів if … else if … else if … else if … Він дозволяє виконати один із кількох можливих блоків коду в залежності від результату одного умовного виразу.
Загальну структуру оператора switch можна зобразити так:
switch( умовнаРівність ) { case вираз1: блокКоду1; break; case вираз2: блокКоду2; break; default: блокКоду3; }
УмовнаРівність – це вираз, який буде послідовно порівнюватися з результатами вираз1, вираз2 і так далі. Якщо результат умовної рівності співпаде хоча б з одним виразом – тоді виконається блок коду після цього виразу і до мітки break. При цьому подальше виконання оператора switch … case буде зупинене.
Якщо результат виразу умовнаРівність не співпаде з жодним зі значень, тоді виконаються всі інструкції, наведені після мітки default. Зверніть увагу, що вказувати її не обов’язково. Якщо мітки default у коді не буде – тоді при невідповідності умовноїРівності жодному з виразів код продовжить виконуватися з місця відразу після закінчення оператора switch … case.
Ось класичний приклад коду, який демонструє роботу оператора switch і використовується для створення привітання на кількох мовах.
var greeting; switch (language) { case "english": greeting = "Hello"; break; case "japanese": greeting = "Konnichiwa"; break; case "french": greeting = "Bonjour"; break; case "german": greeting = "Guten tag"; break; default: // Розташований тут код може використовуватися для повідомлення про помилку, викликану вибором мови. }
Що ж, сподіваюся, сьогоднішній урок не був складним. Умовні оператори траплятимуться практично в кожній програмі, написаній на ActionScript 3, тому їх розуміння надзвичайно важливе.
Якщо у вас залишилися питання щодо роботи умовних операторів – не соромтесь задавати їх у коментарях до статті.
Ну і звісно, підписуйтесь до RSS, щоб не пропустити наступних уроків.
Квітень 22, 2011 о 15:12
Ярославе, доброго дня, а коли про Черепаху відпишетеся?