學習軌道
/
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 <> "!"
}

說明

Josh 正在開發一款全新的角色扮演遊戲,需要你幫忙實作其中一些機制。

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 機制

revive函式應該檢查玩家的角色是否確實已死亡(生命值已降到 0)。如果已死亡,應該回傳一個生命值為 100 的新Player實例。否則,如果玩家的角色尚未死亡,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))

如果對生命值為 1 或以上的玩家呼叫revive方法,則該函式應回傳None。

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

revive(alive_player)
// -> None

3. 實作施法機制

cast_spell函式接受一個Int和一個Player作為引數;Int表示該咒語消耗多少魔力。它會回傳更新後的玩家,以及施放該咒語所造成的傷害量。成功施放咒語造成的傷害等於該咒語魔力消耗的兩倍。然而,如果玩家的魔力不足,則不會發生任何事,玩家保持不變,且不會造成任何傷害。如果玩家甚至沒有魔力池,嘗試施放該咒語時必須使其生命值減少該咒語的魔力消耗,且不會造成傷害。請注意,玩家的生命值不能低於零(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,透過 33 個概念122 個練習 和真人引導來學習並精通 Gleam,全部免費。