Percursos
/
Gleam
Gleam
/
Exercícios
/
Jogo de interpretação de papéis
Jogo de interpretação de papéis

Jogo de interpretação de papéis

Exercício de aprendizagem

Introdução

Opções

O tipo Option serve para representar valores que podem estar ausentes ou presentes.

Está definido no módulo gleam/option da seguinte forma:

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

O construtor Some serve para envolver um valor quando este está presente, e o construtor None serve para representar a ausência de um valor.

Aceder ao conteúdo de um Option faz-se muitas vezes através de pattern matching.

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!"

O módulo gleam/option também define várias funções úteis para trabalhar com tipos Option, como unwrap, que devolve o conteúdo de um Option ou um valor predefinido, caso este seja None.

import gleam/option.{type Option}

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

Instruções

O Josh está a trabalhar num novo jogo de interpretação de papéis e precisa da tua ajuda para implementar algumas das mecânicas.

1. Apresenta-te

Implementa a função introduce.

Os jogadores furtivos podem estar a esconder o seu nome e serão apresentados como "Mighty Magician". Caso contrário, usa apenas o nome do jogador para o apresentar.

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. Implementa a mecânica de reviver

A função revive deve verificar que a personagem do jogador está mesmo morta (a vida chegou a 0). Se estiver, deve devolver uma nova instância de Player com 100 de vida. Caso contrário, se a personagem do jogador não estiver morta, a função revive devolve None.

Se o nível do jogador for 10 ou superior, também deve ser revivido com 100 de mana. Se o nível do jogador for inferior a 10, a mana deve ficar intacta. A função revive deve preservar o nível do jogador.

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))

Se o método revive for chamado num jogador cuja vida é 1 ou superior, a função deve devolver None.

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

revive(alive_player)
// -> None

3. Implementa a mecânica de lançamento de feitiços

A função cast_spell recebe como argumentos um Int que indica quanta mana o feitiço custa, bem como um Player. Devolve o jogador atualizado, bem como a quantidade de dano que o feitiço lançado provoca. Um lançamento de feitiço bem-sucedido causa dano igual ao dobro do custo de mana do feitiço. No entanto, se o jogador não tiver mana suficiente, nada acontece, o jogador fica inalterado e não é causado qualquer dano. Se o jogador não tiver sequer uma reserva de mana, a tentativa de lançar o feitiço deve diminuir a sua vida pelo custo de mana do feitiço e não causa dano. Tem em conta que a vida do jogador não pode ser inferior a zero (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
Editar via GitHub A ligação abre numa nova janela ou separador
Gleam Exercism

Estás pronto para começar Jogo de interpretação de papéis?

Inscreve-te no Exercism para aprenderes e dominares Gleam com 33 conceitos122 exercícios, e mentoria humana real, tudo grátis.