المسارات
/
Elm
Elm
/
التمارين
/
لعبة تقمّص الأدوار
لعبة تقمّص الأدوار

لعبة تقمّص الأدوار

تمرين تعلّمي

مقدمة

Maybe

النوع Maybe هو الحل في لغة Elm للقيم الاختيارية. لذلك يظهر في توقيعات الأنواع لعدد كبير من دوال Elm الأساسية، وفهمه أمر بالغ الأهمية. يُعرَّف النوع Maybe كما يلي:

type Maybe a = Nothing | Just a

يُعرف هذا باسم تعريف «النوع المخصص» في مصطلحات Elm. وهو يشير إلى أن قيمة من هذا النوع يمكن أن تكون إما Nothing أو أن تكون Just شيئًا من النوع a. يتم إنشاء قيمة Maybe باستخدام أحد مُنشئَيها: Nothing وJust. وتتم قراءة محتوى Maybe عبر مطابقة الأنماط.

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

هناك أيضًا عدد من الدوال المفيدة في وحدة Maybe للتعامل مع أنواع 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

التعليمات

في هذا التمرين، ستُنفّذ آليات لعبة تقمص الأدوار. تُمثَّل شخصية اللاعب بالنوع التالي:

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

يجب أن يصل اللاعبون في هذه اللعبة إلى المستوى 10 قبل أن يفتحوا مخزون المانا حتى يبدأوا في إلقاء التعاويذ. أنت تعمل على جزأين من الوظائف في هذه اللعبة: آلية الإحياء وآلية إلقاء التعاويذ.

1. عرّف بنفسك

اكتب محتوى الدالة introduce. قد يخفي اللاعبون المتخفّون أسماءهم وسيُعرَّف عنهم باسم "Mighty Magician". وإلا، فاستخدم اسمك فقط لتعرّف بنفسك.

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

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

2. نفّذ آلية الإحياء

ينبغي أن تتحقق دالة revive من أن شخصية اللاعب ميتة فعلًا (وصلت صحتها إلى 0). وإذا كانت كذلك، فينبغي أن تُرجع نسخة جديدة من Player بصحة 100. وإلا، إذا لم تكن شخصية اللاعب ميتة، فستُرجع دالة revive القيمة Nothing.

وإذا كان مستوى اللاعب 10 أو أكثر، فينبغي إحياؤه أيضًا بـ 100 مانا. وإذا كان مستوى اللاعب أقل من 10، فينبغي أن تكون ماناه Nothing. ينبغي أن تحافظ دالة revive على مستوى اللاعب.

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

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

إذا استُدعيت الطريقة revive على لاعب صحته 1 أو أكثر، فينبغي أن تُرجع الدالة Nothing.

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

revive alivePlayer
    --> Nothing

3. نفّذ آلية إلقاء التعاويذ

تأخذ دالة castSpell كوسائط قيمة من النوع Int تشير إلى مقدار المانا التي تكلّفها التعويذة، بالإضافة إلى قيمة من النوع Player. وتُرجع اللاعب المُحدَّث، بالإضافة إلى مقدار الضرر الذي تُحدثه التعويذة المُلقاة. تُحدث التعويذة المُلقاة بنجاح ضررًا يساوي ضعف تكلفة المانا للتعويذة. ومع ذلك، إذا كانت مانا اللاعب غير كافية، فلا يحدث شيء، ويبقى اللاعب دون تغيير، ولا يُحدث أي ضرر. وإذا لم يكن لدى اللاعب مخزون مانا على الإطلاق، فإن محاولة إلقاء التعويذة يجب أن تُنقص صحته بمقدار تكلفة المانا للتعويذة ولا تُحدث أي ضرر.

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

( updatedWizard, damage ) = castSpell 14 wizard

updatedWizard.mana --> Just 16
damage             --> 28
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Elm Exercism

مستعد لبدء لعبة تقمّص الأدوار؟

سجّل في Exercism لتتعلّم وتتقن Elm عبر 28 مفهومًا110 تمارين، وإرشاد بشري حقيقي، وكل ذلك مجانًا.