Треки
/
Elm
Elm
/
Вправи
/
Рольова гра
Рольова гра

Рольова гра

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

Вступ

Maybe

У мові Elm для необовʼязкових значень є тип Maybe. Тому він присутній у сигнатурах типів багатьох основних функцій Elm, і розуміти його вкрай важливо. Тип Maybe визначено так:

type Maybe a = Nothing | Just a

У термінології Elm це називають визначенням «власного типу». Воно означає, що значення цього типу може бути або Nothing, або Just чимось типу a. Створити значення Maybe можна за допомогою одного з його двох конструкторів: Nothing і Just. Щоб дістати вміст Maybe, застосовують зіставлення зі зразком.

matthieu : Maybe String
matthieu = Just "Matthieu"

anon : Maybe String
anon = Nothing

sayHello : Maybe String -> String
sayHello maybeName =
    case maybeName of
        Nothing -> "Hello, World!"
        Just someName -> "Hello, " ++ someName ++ "!"

sayHello matthieu
    --> "Hello, Matthieu!"

sayHello anon
    --> "Hello, World!"

У модулі Maybe також є чимало корисних функцій для роботи з типами Maybe.

sayHelloAgain : Maybe String -> String
sayHelloAgain name = "Hello, " ++ Maybe.withDefault "World" name ++ "!"

capitalizeName : Maybe String -> Maybe String
capitalizeName name = Maybe.map String.toUpper name

capitalizeName matthieu
    --> Just "MATTHIEU"

capitalizeName anon
    --> Nothing

Вказівки

У цій вправі ми реалізуємо механіки рольової гри. Персонаж гравця описаний таким типом:

type alias Player =
    { name : Maybe String
    , level : Int
    , health : Int
    , mana : Maybe Int
    }

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

1. Представтеся

Напишіть вміст функції introduce. Потайливі гравці можуть приховувати своє імʼя, і тоді їх представлять як "Mighty Magician". Інакше просто скористайтеся своїм імʼям, щоб представитися.

introduce { name = Nothing, level = 2, health = 8, mana = Nothing }
    --> "Mighty Magician"

introduce { name = Just "Merlin", level = 2, health = 8, mana = Nothing }
    --> "Merlin"

2. Реалізуйте механіку відродження

Функція revive повинна перевірити, що персонаж гравця справді мертвий (його здоровʼя досягло 0). Якщо так, вона повертає новий примірник Player зі здоровʼям 100. Інакше, якщо персонаж гравця не мертвий, функція revive повертає Nothing.

Якщо рівень гравця 10 або вищий, його також відроджують зі 100 одиницями мани. Якщо рівень гравця нижчий за 10, його мана має бути Nothing. Функція revive повинна зберегти рівень гравця.

deadPlayer = { name = Nothing, level = 2, health = 0, mana = Nothing }

revive deadPlayer
    --> Just { name = Nothing, level = 2, health = 100, mana = Nothing }

Якщо метод revive викликати для гравця, чиє здоровʼя 1 або більше, то функція повертає Nothing.

alivePlayer = { name = Nothing, level = 2, health = 42, mana = Nothing }

revive alivePlayer
    --> Nothing

3. Реалізуйте механіку читання заклять

Функція castSpell приймає як аргументи Int, що вказує, скільки мани коштує закляття, а також Player. Вона повертає оновленого гравця, а також обсяг шкоди, якої завдає прочитане закляття. Успішне читання закляття завдає шкоди, що дорівнює подвоєній витраті мани на закляття. Однак, якщо гравцеві бракує мани, нічого не відбувається: гравець лишається незмінним, і шкоди не завдано. Якщо гравець навіть не має запасу мани, спроба прочитати закляття повинна зменшити його здоровʼя на витрату мани на закляття й не завдає жодної шкоди.

wizard = { name = Nothing, level = 18, health = 123, mana = Just 30 }

( updatedWizard, damage ) = castSpell 14 wizard

updatedWizard.mana --> Just 16
damage             --> 28
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Elm Exercism

Час розпочати Рольова гра?

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