Menu
CoddyTech

شخصية RPG

جزء من قسم البرمجة كائنية التوجه في رحلة C على Coddy. الدرس 58 من 61.

challenge icon

التحدي

سهل

لنبنِ نظامًا قتاليًا لشخصيات RPG Character: مثالًا كلاسيكيًا يجمع بين البُنى والطرائق والبنّاءات وتفاعل الكائنات ضمن تصميم واضح ومقسّم إلى وحدات.

ستنظّم شيفرتك عبر ثلاثة ملفات:

  • character.h: عرّف بنية Character بحقلين صحيحين: health وdamage. صرّح بالنماذج الأولية للدوال اللازمة لإنشاء شخصية، وتنفيذ هجوم، والتحقق مما إذا كانت الشخصية على قيد الحياة، وطباعة حالة الشخصية.
  • character.c: نفّذ نظام الشخصيات:
    • create_character: تستقبل قيمتي الصحة والضرر الابتدائيتين، وتخصّص ذاكرة لشخصية على الكومة، وتهيّئ حقولها، وتُعيد مؤشرًا إليها
    • attack: تستقبل مؤشري Character (المهاجم والهدف)، وتقلّل صحة الهدف بمقدار ضرر المهاجم
    • is_alive: تستقبل مؤشرًا إلى Character ثابتة، وتُعيد 1 إذا كانت الصحة أكبر من 0، وإلا تُعيد 0
    • print_status: تستقبل مؤشرًا إلى Character ثابتة، وتطبع صحة الشخصية بالتنسيق Health: X
    • free_character: تحرّر الذاكرة المخصّصة
  • main.c: أنشئ محاكاة معركة! اقرأ أربعة أعداد صحيحة تمثل: صحة البطل، وضرر البطل، وصحة العدو، وضرر العدو. أنشئ الشخصيتين باستخدام البنّاء. ثم حاكِ جولات القتال؛ في كل جولة يهاجم البطل أولًا، ثم يردّ العدو بالهجوم. إذا خفّض هجوم البطل صحة العدو إلى الصفر أو أقل، يُهزم العدو ولا يردّ الهجوم في تلك الجولة. استمر حتى يسقط أحد الشخصيتين. بعد كل جولة، اطبع حالة الشخصيتين (البطل أولًا، ثم العدو). عند انتهاء المعركة، اطبع إما Hero wins! أو Enemy wins! بحسب الشخصية التي بقيت على قيد الحياة. لا تنسَ تحرير ذاكرة الشخصيتين.

سيستقبل برنامجك أربع قيم:

  1. صحة البطل عند البداية
  2. ضرر البطل في كل هجوم
  3. صحة العدو عند البداية
  4. ضرر العدو في كل هجوم

مثال على المخرجات عندما تكون المدخلات 50، و20، و30، و15:

Health: 35
Health: 10
Health: 35
Health: -10
Hero wins!

مثال على المخرجات عندما تكون المدخلات 20، و5، و100، و25:

Health: -5
Health: 95
Enemy wins!

تذكّر استخدام حواجز التضمين في ملف الترويسة. توضّح الدالة attack كيف يمكن لكائن أن يعدّل الحالة الداخلية لكائن آخر: وهو مفهوم أساسي في التصميم كائني التوجّه. استخدم مؤشرات const على نحو مناسب في الدوال التي تقرأ البيانات فقط.

جرّب بنفسك

#include <stdio.h>
#include "character.h"

int main() {
    // اقرأ قيم الإدخال
    int hero_health, hero_damage, enemy_health, enemy_damage;
    scanf("%d", &hero_health);
    scanf("%d", &hero_damage);
    scanf("%d", &enemy_health);
    scanf("%d", &enemy_damage);
    
    // TODO: أنشئ شخصيتي البطل والعدو باستخدام create_character
    
    // TODO: حاكِ جولات القتال
    // - يهاجم البطل أولًا
    // - يهاجم العدو إذا كان لا يزال حيًا
    // - اطبع حالة كلتا الشخصيتين بعد كل جولة (البطل أولًا، ثم العدو)
    // - استمر حتى تسقط إحدى الشخصيتين
    
    // TODO: اطبع الفائز ("Hero wins!" أو "Enemy wins!")
    
    // TODO: حرّر الذاكرة المخصّصة لكلتا الشخصيتين
    
    return 0;
}

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم C عبر الإنترنت