Tracks
/
Gleam
Gleam
/
Ejercicios
/
Juego de rol
Juego de rol

Juego de rol

Ejercicio de aprendizaje

Introducción

Opciones

El tipo Option se usa para representar valores que pueden estar ausentes o presentes.

Se define en el módulo gleam/option de la siguiente manera:

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

El constructor Some se usa para envolver un valor cuando está presente, y el constructor None se usa para representar la ausencia de un valor.

Acceder al contenido de un Option suele hacerse mediante coincidencia de patrones.

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

El módulo gleam/option también define una serie de funciones útiles para trabajar con tipos Option, como unwrap, que devuelve el contenido de un Option o un valor predeterminado si es None.

import gleam/option.{type Option}

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

Instrucciones

Josh está trabajando en un nuevo juego de rol y necesita tu ayuda para implementar algunas de sus mecánicas.

1. Preséntate

Implementa la función introduce.

Puede que los jugadores sigilosos estén ocultando su nombre, en cuyo caso se los presentará como "Mighty Magician". De lo contrario, solo usa el nombre del jugador para presentarlo.

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 la mecánica de revivir

La función revive debe verificar que el personaje del jugador esté realmente muerto (su salud llegó a 0). Si es así, debe devolver una nueva instancia de Player con 100 de salud. De lo contrario, si el personaje del jugador no está muerto, la función revive devuelve None.

Si el nivel del jugador es 10 o mayor, también debe revivir con 100 de maná. Si el nivel del jugador es menor que 10, su maná debe quedar intacto. La función revive debe conservar el nivel del jugador.

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

Si se llama al método revive sobre un jugador cuya salud es 1 o mayor, la función debe devolver None.

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

revive(alive_player)
// -> None

3. Implementa la mecánica de lanzar hechizos

La función cast_spell recibe como argumentos un Int que indica cuánto maná cuesta el hechizo, además de un Player. Devuelve el jugador actualizado, así como la cantidad de daño que hace el hechizo lanzado. Un lanzamiento de hechizo exitoso hace un daño igual al doble del costo de maná del hechizo. Sin embargo, si el jugador no tiene suficiente maná, no pasa nada: el jugador queda igual y no se hace daño. Si el jugador ni siquiera tiene una reserva de maná, al intentar lanzar el hechizo su salud debe disminuir en el costo de maná del hechizo y no se hace daño. Ten en cuenta que la salud de los jugadores no puede ser menor que cero (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 en GitHub El enlace se abre en una ventana o una pestaña nuevas
Gleam Exercism

¿Todo listo para empezar Juego de rol?

Regístrate en Exercism para aprender y dominar Gleam con 33 conceptos122 ejercicios y mentoría humana real, todo gratis.