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

شخصية RPG

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

challenge icon

التحدي

سهل

لنبنِ نظامًا للقتال في RPG Character: مثال كلاسيكي يجمع بين الهياكل، والأساليب، والمنشئات، والتفاعل بين الكائنات ضمن تصميم نظيف ومعياري.

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

  • character.h: Define بنية Character تحتوي على حقلين صحيحين: health وdamage. Declare النماذج الأولية لـ function إنشاء شخصية، وتنفيذ هجوم، والتحقق مما إذا كانت الشخصية على قيد الحياة، وطباعة حالة الشخصية.
  • character.c: Implement نظام شخصيتك:
    • create_character: يأخذ قيمتي health وdamage الابتدائيتين، ويخصص Character على heap، ويهيئ حقوله، ثم يعيد مؤشرًا
    • attack: يأخذ مؤشري Character (attacker وtarget)، ويخفض health الخاص بـtarget بمقدار damage الخاص بـattacker
    • is_alive: يأخذ مؤشر Character من النوع const ويعيد 1 إذا كانت health أكبر من 0، وإلا يعيد 0
    • print_status: يأخذ مؤشر Character من النوع const ويطبع health الخاصة بالشخصية بالتنسيق Health: X
    • free_character: يحرر الذاكرة المخصصة
  • main.c: Create محاكاة لمعركة! اقرأ أربعة أعداد صحيحة تمثل: health الخاصة بـhero، وdamage الخاصة بـhero، وhealth الخاصة بـenemy، وdamage الخاصة بـenemy. أنشئ كلتا الشخصيتين باستخدام المنشئ الخاص بك. ثم حاكِ جولات combat؛ في كل جولة يهاجم hero أولًا، ثم يرد enemy بالهجوم. تحدث الضربتان ضمن الجولة نفسها، لذلك يصيب هجوم enemy المضاد حتى إذا كان هجوم hero قد خفّض health الخاصة به إلى الصفر أو أقل. Continue حتى تسقط إحدى الشخصيتين. بعد كل جولة، اطبع حالة كلتا الشخصيتين (hero أولًا، ثم enemy). عند انتهاء المعركة، اطبع إما Hero wins! أو Enemy wins! اعتمادًا على من بقي على قيد الحياة. لا تنسَ أن free كلتا الشخصيتين.

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

  1. health الابتدائية لـHero
  2. damage الخاص بـHero في كل هجوم
  3. health الابتدائية لـEnemy
  4. damage الخاص بـEnemy في كل هجوم

مثال على المخرجات عندما تكون المدخلات 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!" or "Enemy wins!")
    
    // TODO: حرر كلا الشخصيتين
    
    return 0;
}

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

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