Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

شخصية RPG

جزء من قسم Object Oriented Programming في رحلة C على Coddy — الدرس 58 من 61.

challenge icon

التحدي

سهل

لنقم ببناء نظام قتال RPG Character — وهو مثال كلاسيكي يجمع بين الهياكل (structs)، والأساليب (methods)، والمشيدات (constructors)، وتفاعل الكائنات في تصميم نظيف ومعياري.

ستقوم بتنظيم الكود الخاص بك عبر ثلاثة ملفات:

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

سيتلقى برنامجك أربعة مدخلات:

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

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

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

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

Health: -5
Health: 95
Enemy wins!

تذكر استخدام حراس التضمين (include guards) في ملف الترويسة الخاص بك. توضح وظيفة 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;
}

جميع دروس Object Oriented Programming