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

Рольова гра

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

Вступ

Опції

Тип Option використовується для подання значень, які можуть бути відсутніми або наявними.

Його визначено в модулі gleam/option так:

type Option(a) {
  Some(a)
  None
}

Конструктор Some використовується, щоб обгорнути значення, коли воно наявне, а конструктор None використовується для позначення відсутності значення.

До вмісту Option часто звертаються за допомогою зіставлення зі зразком.

import gleam/option.{type Option, None, Some}

pub fn say_hello(person: Option(String)) -> String {
  case person {
    Some(name) -> "Hello, " <> name <> "!"
    None -> "Hello, Friend!"
  }
}
say_hello(Some("Matthieu"))
// -> "Hello, Matthieu!"

say_hello(None)
// -> "Hello, Friend!"

Модуль gleam/option також визначає низку корисних функцій для роботи з типами Option, як-от unwrap, яка повертає вміст Option або типове значення, якщо він None.

import gleam/option.{type Option}

pub fn say_hello_again(person: Option(String)) -> String {
  let name = option.unwrap(person, "Friend")
  "Hello, " <> name <> "!"
}

Вказівки

Джош працює над новою рольовою грою, і йому потрібна наша допомога з реалізацією деяких механік.

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

Реалізуйте функцію introduce.

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

introduce(Player(name: None, level: 2, health: 8, mana: None))
// -> "Mighty Magician"

introduce(Player(name: Some("Merlin"), level: 2, health: 8, mana: None))
// -> "Merlin"

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

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

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

let dead_player = Player(name: None, level: 2, health: 0, mana: None)

revive(dead_player)
// -> Some(Player(name: None, level: 2, health: 100, mana: None))

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

let alive_player = Player(name: None, level: 2, health: 42, mana: None)

revive(alive_player)
// -> None

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

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

let wizard = Player(name: None, level: 18, health: 123, mana: Some(30))
let #(wizard, damage) = cast_spell(wizard, 14)

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

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

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