轨道
/
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函数应该检查玩家的角色确实已经死亡(生命值降到了 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。它返回更新后的玩家,以及所施放法术造成的伤害值。法术成功施放时,造成的伤害等于该法术法力消耗的两倍。不过,如果玩家的法力值不足,就什么也不会发生:玩家保持不变,也不会造成任何伤害。如果玩家根本没有法力池,那么尝试施放法术会使其生命值减少该法术消耗的法力值,并且不造成伤害。注意,玩家的生命值不能低于零(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,全部免费。