Parcours
/
Elm
Elm
/
Exercices
/
Jeu de rôle
Jeu de rôle

Jeu de rôle

Exercice d'apprentissage

Introduction

Maybe

Le type Maybe est la solution qu'offre le langage Elm pour représenter des valeurs optionnelles. Il est donc présent dans les signatures de type d'un grand nombre de fonctions essentielles d'Elm, et il est crucial de bien le comprendre. Le type Maybe se définit comme suit :

type Maybe a = Nothing | Just a

On parle de définition de « type personnalisé » dans la terminologie d'Elm. Cela indique qu'une valeur de ce type peut être soit Nothing, soit Just quelque chose de type a. Pour créer une valeur de type Maybe, on utilise l'un de ses deux constructeurs, Nothing et Just. Pour lire le contenu d'un Maybe, on utilise le filtrage par motifs.

matthieu : Maybe String
matthieu = Just "Matthieu"

anon : Maybe String
anon = Nothing

sayHello : Maybe String -> String
sayHello maybeName =
    case maybeName of
        Nothing -> "Hello, World!"
        Just someName -> "Hello, " ++ someName ++ "!"

sayHello matthieu
    --> "Hello, Matthieu!"

sayHello anon
    --> "Hello, World!"

Le module Maybe contient également un certain nombre de fonctions utiles pour manipuler les valeurs de type Maybe.

sayHelloAgain : Maybe String -> String
sayHelloAgain name = "Hello, " ++ Maybe.withDefault "World" name ++ "!"

capitalizeName : Maybe String -> Maybe String
capitalizeName name = Maybe.map String.toUpper name

capitalizeName matthieu
    --> Just "MATTHIEU"

capitalizeName anon
    --> Nothing

Instructions

Dans cet exercice, tu vas implémenter les mécaniques d'un jeu de rôle. Le personnage d'un joueur est représenté par le type suivant :

type alias Player =
    { name : Maybe String
    , level : Int
    , health : Int
    , mana : Maybe Int
    }

Dans ce jeu, les joueurs doivent atteindre le niveau 10 avant de débloquer une réserve de mana, afin de pouvoir commencer à lancer des sorts. Tu vas travailler sur deux fonctionnalités de ce jeu : la mécanique de réanimation et la mécanique de lancement de sorts.

1. Présente-toi

Écris le contenu de la fonction introduce. Les joueurs furtifs peuvent cacher leur nom et seront présentés comme "Mighty Magician". Sinon, utilise simplement ton nom pour te présenter.

introduce { name = Nothing, level = 2, health = 8, mana = Nothing }
    --> "Mighty Magician"

introduce { name = Just "Merlin", level = 2, health = 8, mana = Nothing }
    --> "Merlin"

2. Implémente la mécanique de réanimation

La fonction revive doit vérifier que le personnage du joueur est bien mort (ses points de vie sont tombés à 0). Si c'est le cas, elle doit renvoyer une nouvelle instance de Player avec 100 points de vie. Sinon, si le personnage du joueur n'est pas mort, la fonction revive renvoie Nothing.

Si le niveau du joueur est supérieur ou égal à 10, il doit aussi être réanimé avec 100 points de mana. Si le niveau du joueur est inférieur à 10, son mana doit être Nothing. La fonction revive doit préserver le niveau du joueur.

deadPlayer = { name = Nothing, level = 2, health = 0, mana = Nothing }

revive deadPlayer
    --> Just { name = Nothing, level = 2, health = 100, mana = Nothing }

Si la méthode revive est appelée sur un joueur dont les points de vie sont supérieurs ou égaux à 1, alors la fonction doit renvoyer Nothing.

alivePlayer = { name = Nothing, level = 2, health = 42, mana = Nothing }

revive alivePlayer
    --> Nothing

3. Implémente la mécanique de lancement de sorts

La fonction castSpell prend comme arguments un Int indiquant combien de mana le sort coûte, ainsi qu'un Player. Elle renvoie le joueur mis à jour, ainsi que la quantité de dégâts que le sort lancé inflige. Un sort lancé avec succès inflige des dégâts égaux à deux fois le coût en mana du sort. Cependant, si le joueur n'a pas assez de mana, rien ne se passe : le joueur reste inchangé et aucun dégât n'est infligé. Si le joueur n'a même pas de réserve de mana, tenter de lancer le sort doit diminuer ses points de vie du coût en mana du sort et n'inflige aucun dégât.

wizard = { name = Nothing, level = 18, health = 123, mana = Just 30 }

( updatedWizard, damage ) = castSpell 14 wizard

updatedWizard.mana --> Just 16
damage             --> 28
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Elm Exercism

Prêt à commencer Jeu de rôle ?

Inscris-toi sur Exercism pour apprendre et maîtriser Elm avec 28 concepts110 exercices, et un vrai mentorat humain, le tout gratuitement.