Tracks
/
Gleam
Gleam
/
Übungen
/
Rollenspiel
Rollenspiel

Rollenspiel

Lernübung

Einführung

Optionen

Der Option-Typ wird verwendet, um Werte darzustellen, die entweder fehlen oder vorhanden sein können.

Er ist im Modul gleam/option wie folgt definiert:

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

Der Konstruktor Some wird verwendet, um einen Wert zu umschließen, wenn er vorhanden ist, und der Konstruktor None wird verwendet, um das Fehlen eines Werts darzustellen.

Der Zugriff auf den Inhalt eines Option-Werts erfolgt oft über 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!"

Das Modul gleam/option definiert außerdem eine Reihe nützlicher Funktionen für die Arbeit mit Option-Typen, wie zum Beispiel unwrap, das den Inhalt eines Option-Werts oder einen Standardwert zurückgibt, wenn es sich um None handelt.

import gleam/option.{type Option}

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

Anleitung

Josh arbeitet an einem neuen Rollenspiel und braucht deine Hilfe dabei, einige Mechaniken umzusetzen.

1. Stell dich vor

Implementiere die Funktion introduce.

Heimliche Spieler verbergen möglicherweise ihren Namen und werden als "Mighty Magician" vorgestellt. Ansonsten stelle sie einfach mit dem Namen des Spielers vor.

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. Implementiere die Wiederbelebungsmechanik

Die Funktion revive sollte prüfen, ob die Spielfigur des Spielers tatsächlich tot ist (ihre Gesundheit hat 0 erreicht). Wenn ja, sollte sie eine neue Player-Instanz mit 100 Gesundheit zurückgeben. Andernfalls, wenn die Spielfigur des Spielers nicht tot ist, gibt die Funktion revive None zurück.

Wenn das Level des Spielers 10 oder höher ist, sollte er auch mit 100 Mana wiederbelebt werden. Wenn das Level des Spielers unter 10 liegt, sollte sein Mana unverändert bleiben. Die Funktion revive sollte das Level des Spielers beibehalten.

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

Wenn die Methode revive für einen Spieler aufgerufen wird, dessen Gesundheit 1 oder höher ist, dann sollte die Funktion None zurückgeben.

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

revive(alive_player)
// -> None

3. Implementiere die Zaubermechanik

Die Funktion cast_spell nimmt als Argumente einen Int, der angibt, wie viel Mana der Zauber kostet, sowie einen Player. Sie gibt den aktualisierten Spieler sowie die Menge an Schaden zurück, die der gewirkte Zauber verursacht. Ein erfolgreicher Zauber verursacht Schaden in Höhe des Doppelten seiner Manakosten. Wenn der Spieler jedoch nicht genügend Mana hat, passiert nichts, der Spieler bleibt unverändert und es wird kein Schaden verursacht. Wenn der Spieler nicht einmal einen Manavorrat hat, muss der Versuch, den Zauber zu wirken, seine Gesundheit um die Manakosten des Zaubers verringern und verursacht keinen Schaden. Beachte, dass die Gesundheit des Spielers nicht unter null (0) fallen kann.

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
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Gleam Exercism

Bereit, mit Rollenspiel zu starten?

Melde dich bei Exercism an, um Gleam mit 33 Konzepte122 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.