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

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

تمرين تعلّمي

مقدمة

الخيارات

يُستخدم نوع Option لتمثيل القيم التي يمكن أن تكون غائبة أو موجودة.

وهو معرَّف في وحدة gleam/option كما يلي:

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

تُستخدم البانية Some لتغليف قيمة عندما تكون موجودة، وتُستخدم البانية None لتمثيل غياب القيمة.

غالبًا ما يتم الوصول إلى محتوى Option عبر مطابقة الأنماط.

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

كما تُعرّف وحدة gleam/option عددًا من الدوال المفيدة للتعامل مع أنواع Option، مثل unwrap، التي تُرجع محتوى Option أو قيمة افتراضية إذا كانت None.

import gleam/option.{type Option}

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

التعليمات

يعمل Josh على لعبة تقمّص أدوار جديدة، ويحتاج إلى مساعدتك في تنفيذ بعض آليات اللعبة.

1. عرّف بنفسك

نفّذ الدالة introduce.

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

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. نفّذ آلية الإحياء

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

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

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

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

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

revive(alive_player)
// -> None

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

تأخذ الدالة cast_spell كوسائط قيمة Int تشير إلى مقدار المانا التي تكلّفها التعويذة، إضافةً إلى Player. وتُرجع اللاعب المحدَّث، إضافةً إلى مقدار الضرر الذي تُحدثه التعويذة. يُحدث إلقاء التعويذة الناجح ضررًا يساوي ضعف تكلفة المانا الخاصة بالتعويذة. ومع ذلك، إذا لم يمتلك اللاعب مانا كافية، فلن يحدث شيء، ويبقى اللاعب كما هو، ولا يقع أي ضرر. وإذا لم يكن لدى اللاعب أي مانا على الإطلاق، فإن محاولة إلقاء التعويذة يجب أن تُنقص صحته بمقدار تكلفة المانا الخاصة بالتعويذة، ولا تُحدث أي ضرر. انتبه إلى أن صحة اللاعب لا يمكن أن تكون أقل من صفر (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
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Gleam Exercism

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

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