트랙
/
Gleam
Gleam
/
연습 문제
/
롤플레잉 게임
롤플레잉 게임

롤플레잉 게임

학습 연습 문제

소개

Option

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에 가입하고 Gleam 트랙을 개념 33개연습 문제 122개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.