Треки
/
Elm
Elm
/
Вправи
/
Проникнення Анналін
Проникнення Анналін

Проникнення Анналін

Навчальна вправа

Вступ

Булеві значення

Тип Bool належить до будівельних блоків мови. Він покликаний описувати, чи є щось правдою, а чи неправдою, з відповідними значеннями True і False.

Булеві значення (англ. Boolean) можна поєднувати операторами && (логічне і) та || (логічне або), а заперечувати функцією not.

Булеві значення також надзвичайно корисні, коли треба зробити в нашому коді розгалуження, які виконуються лише за певних умов. У Elm це робиться за допомогою виразу if-then-else, який використовують так.

if someCondition || (someOtherCondition && anotherCondition) then
    doSomething
else
    doSomethingElse

Вказівки

У цій вправі ми реалізуємо логіку квестів для нової RPG-гри, яку розробляє один друг. Головна героїня гри - Анналін, смілива дівчина, у якої є відданий і завзятий пес. На жаль, стається лихо: її найкращу подругу викрали, поки та шукала ягоди в лісі. Анналін спробує знайти й визволити свою найкращу подругу, а може, й узяти з собою пса в цю подорож.

Певний час ідучи слідом за подругою, вона знаходить табір, у якому ту увʼязнено. Виявляється, викрадачів двоє: могутній лицар і хитрий лучник.

Знайшовши викрадачів, Анналін обмірковує, які з наступних дій вона може вчинити:

  • Швидка атака: швидку атаку можна здійснити, якщо лицар спить, бо йому потрібен час, щоб вдягнути обладунки, тож він буде вразливим.
  • Скритна атака: якщо Анналін дістанеться до сплячого лицаря непоміченою, вона завдає 12 ушкоджень скритною атакою. Інакше вона завдає лицарю лише 7 ушкоджень.
  • Шпигунство: за групою можна шпигувати, якщо хоча б один із них не спить. Інакше шпигувати - марна трата часу.
  • Подати сигнал вʼязню: вʼязню можна подати сигнал пташиними звуками, якщо вʼязень не спить, а лучник спить, бо лучники навчені пташиного сигналу, тож могли б перехопити повідомлення.
  • Визволити вʼязня: Анналін може спробувати потайки пробратися в табір, щоб визволити вʼязня. Це ризикована справа, і вона може вдатися лише в один із двох способів:
    • Якщо Анналін узяла з собою пса, вона може врятувати вʼязня, коли лучник спить. Лицар боїться пса, а лучник не встигне підготуватися, перш ніж Анналін і вʼязень утечуть.
    • Якщо Анналін без пса, то вони з вʼязнем мусять бути дуже обережними! Анналін може визволити вʼязня, якщо той не спить, а лицар і лучник обидва сплять, але якщо вʼязень спить, його не врятувати: вʼязень злякається раптової появи Анналін і розбудить лицаря і лучника.

У нас пʼять завдань: реалізувати логіку для визначення, чи доступні наведені дії, залежно від стану трьох персонажів, знайдених у лісі, і від того, чи присутній пес Анналін.

1. Перевірити, чи можна здійснити швидку атаку

Реалізуйте функцію canFastAttack, яка приймає булеве значення (англ. Boolean), що вказує, чи не спить лицар. Ця функція повертає True, якщо швидку атаку можна здійснити залежно від стану лицаря. Інакше повертає False:

knightIsAwake = True

canFastAttack knightIsAwake
    --> False

2. Перевірити, чи можна шпигувати за групою

Реалізуйте функцію canSpy, яка приймає три булеві значення, що вказують, відповідно, чи не сплять лицар, лучник і вʼязень. Функція повертає True, якщо за групою можна шпигувати залежно від стану трьох персонажів. Інакше повертає False:

knightIsAwake = False
archerIsAwake = True
prisonerIsAwake = False

canSpy knightIsAwake archerIsAwake prisonerIsAwake
    --> True

3. Перевірити, чи можна подати сигнал вʼязню

Реалізуйте функцію canSignalPrisoner, яка приймає два булеві значення, що вказують, відповідно, чи не сплять лучник і вʼязень. Функція повертає True, якщо вʼязню можна подати сигнал залежно від стану двох персонажів. Інакше повертає False:

archerIsAwake = False
prisonerIsAwake = True

canSignalPrisoner archerIsAwake prisonerIsAwake
    --> True

4. Перевірити, чи можна визволити вʼязня

Реалізуйте функцію canFreePrisoner, яка приймає чотири булеві значення. Перші три параметри вказують, відповідно, чи не сплять лицар, лучник і вʼязень. Останній параметр указує, чи присутній пес Анналін. Функція повертає True, якщо вʼязня можна визволити залежно від стану трьох персонажів і присутності пса Анналін. Інакше повертає False:

knightIsAwake = False
archerIsAwake = True
prisonerIsAwake = False
petDogIsPresent = False

canFreePrisoner knightIsAwake archerIsAwake prisonerIsAwake petDogIsPresent
    --> False

5. Порахувати ушкодження, які могла б завдати скритна атака

Реалізуйте функцію stealthAttackDamage, яка приймає булеве значення, що вказує, чи виявили Анналін. Ця функція повертає 7, якщо її виявили, і 12 в іншому разі.

annalynIsDetected = True

stealthAttackDamage annalynIsDetected
    --> 7
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Elm Exercism

Час розпочати Проникнення Анналін?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Elm, а також 28 концепцій110 вправ та справжнє наставництво від людей, і все це безкоштовно.