Trilhas
/
Gleam
Gleam
/
Exercícios
/
Jogo de RPG
Jogo de RPG

Jogo de RPG

Exercício de aprendizagem

Introdução

Opções

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

Ele é definido no módulo gleam/option da seguinte forma:

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

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

Acessar o conteúdo de um Option costuma ser feito por meio de casamento de padrões.

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 uma série de funções úteis para trabalhar com tipos Option, como unwrap, que retorna o conteúdo de um Option ou um valor padrão se ele for 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

Josh está trabalhando em um novo jogo de RPG e precisa da sua ajuda para implementar algumas das mecânicas.

1. Apresente-se

Implemente a função introduce.

Jogadores furtivos podem estar escondendo o nome e devem ser apresentados como "Mighty Magician". Caso contrário, basta usar o nome do jogador para apresentá-lo.

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

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

Se o nível do jogador for 10 ou mais, ele também deve ser revivido com 100 de mana. Se o nível do jogador for menor que 10, a mana dele deve permanecer 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 em um jogador cuja vida é 1 ou mais, a função deve retornar None.

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

revive(alive_player)
// -> None

3. Implemente a mecânica de lançar feitiços

A função cast_spell recebe como argumentos um Int que indica quanta mana o feitiço custa, além de um Player. Ela retorna o jogador atualizado, bem como a quantidade de dano que o feitiço lançado causa. 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 permanece inalterado e nenhum dano é causado. Se o jogador nem sequer tiver uma reserva de mana, tentar lançar o feitiço deve diminuir a vida dele pelo custo de mana do feitiço e não causa dano. Fique atento: a vida do jogador não pode ficar abaixo de 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 O link abre em uma nova janela ou aba
Gleam Exercism

Tudo pronto para começar Jogo de RPG?

Crie sua conta no Exercism para aprender e dominar Gleam com 33 conceitos122 exercícios e mentoria humana de verdade, tudo de graça.