Percursos
/
Elm
Elm
/
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

Maybe

O tipo Maybe é a solução da linguagem Elm para valores opcionais. Está por isso presente nas assinaturas de tipo de muitas funções centrais do Elm, e compreendê-lo é crucial. O tipo Maybe é definido da seguinte forma:

type Maybe a = Nothing | Just a

Isto é conhecido como uma definição de "tipo personalizado" na terminologia do Elm. Indica que um valor deste tipo pode ser Nothing OU ser Just algo do tipo a. Criar um valor Maybe faz-se através de um dos seus dois construtores, Nothing e Just. Ler o conteúdo de um Maybe faz-se através de correspondência de padrões.

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

Existem também várias funções úteis no módulo Maybe para manipular tipos 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

Instruções

Neste exercício, vais implementar mecânicas de um jogo de role-playing. A personagem de um jogador é representada pelo seguinte tipo:

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

Os jogadores deste jogo têm de atingir o nível 10 antes de desbloquearem uma reserva de mana, para poderem começar a lançar feitiços. Vais trabalhar em duas funcionalidades deste jogo: a mecânica de reanimação e a mecânica de lançamento de feitiços.

1. Apresenta-te

Escreve o conteúdo da função introduce. Os jogadores mais furtivos podem estar a esconder o nome e serão apresentados como "Mighty Magician". Caso contrário, usa simplesmente o teu nome para te apresentares.

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

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

2. Implementa a mecânica de reanimação

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

Se o nível do jogador for 10 ou superior, a personagem também deve ser reanimada com 100 de mana. Se o nível do jogador for inferior a 10, a mana deve ser Nothing. A função revive deve manter o nível do jogador.

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

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

Se o método revive for chamado para um jogador cuja saúde seja 1 ou superior, a função deve devolver Nothing.

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

revive alivePlayer
    --> Nothing

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

A função castSpell recebe como argumentos um Int que indica quanta mana o feitiço custa, bem como um Player. Devolve o jogador atualizado, assim como a quantidade de dano que o feitiço lançado provoca. Um feitiço lançado com sucesso provoca dano igual ao dobro do custo de mana do feitiço. No entanto, se o jogador não tiver mana suficiente, não acontece nada: o jogador fica inalterado e não é provocado qualquer dano. Se o jogador não tiver sequer uma reserva de mana, tentar lançar o feitiço tem de reduzir a sua saúde no valor do custo de mana do feitiço e não provoca dano.

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

( updatedWizard, damage ) = castSpell 14 wizard

updatedWizard.mana --> Just 16
damage             --> 28
Editar via GitHub A ligação abre numa nova janela ou separador
Elm Exercism

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

Inscreve-te no Exercism para aprenderes e dominares Elm com 28 conceitos110 exercícios, e mentoria humana real, tudo grátis.