شخصية RPG
جزء من قسم Object Oriented Programming في رحلة C على Coddy — الدرس 58 من 61.
التحدي
سهللنقم ببناء نظام قتال RPG Character — وهو مثال كلاسيكي يجمع بين الهياكل (structs)، والأساليب (methods)، والمنشئات (constructors)، وتفاعل الكائنات في تصميم نظيف ومعياري.
ستقوم بتنظيم الكود الخاص بك عبر ثلاثة ملفات:
character.h: قم بتعريف هيكلCharacterمع حقلين من نوع الأعداد الصحيحة:healthوdamage. صرح عن النماذج الأولية للوظائف (function prototypes) لإنشاء شخصية، وتنفيذ هجوم، والتحقق مما إذا كانت الشخصية على قيد الحياة، وطباعة حالة الشخصية.character.c: قم بتنفيذ نظام الشخصيات الخاص بك:create_character— يأخذ قيم الصحة والضرر الأولية، ويخصص ذاكرة لـ Character في الـ heap، ويهيئ حقوله، ويعيد مؤشرًا (pointer).attack— يأخذ مؤشرين من نوع Character (المهاجم والهدف)، ويقلل صحة الهدف بمقدار ضرر المهاجم.is_alive— يأخذ مؤشر Character ثابتًا (const) ويعيد 1 إذا كانت الصحة أكبر من 0، وإلا يعيد 0.print_status— يأخذ مؤشر Character ثابتًا (const) ويطبع صحة الشخصية بالتنسيقHealth: X.free_character— يحرر الذاكرة المخصصة.
main.c: قم بإنشاء محاكاة للمعركة! اقرأ أربعة أعداد صحيحة تمثل: صحة البطل، ضرر البطل، صحة العدو، وضرر العدو. أنشئ كلتا الشخصيتين باستخدام المنشئ الخاص بك. ثم قم بمحاكاة جولات القتال — يهاجم البطل أولاً، ثم يهاجم العدو (إذا كان لا يزال على قيد الحياة). استمر حتى يسقط أحد الشخصيات. بعد كل جولة، اطبع حالة كلتا الشخصيتين (البطل أولاً، ثم العدو). عندما تنتهي المعركة، اطبع إماHero wins!أوEnemy wins!بناءً على من نجا. لا تنسَ تحرير ذاكرة كلتا الشخصيتين.
سيتلقى برنامجك أربعة مدخلات:
- صحة البطل عند البداية
- ضرر البطل في كل هجوم
- صحة العدو عند البداية
- ضرر العدو في كل هجوم
مثال على المخرجات عندما تكون المدخلات 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) في ملف الرأس (header file). توضح وظيفة 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
1أساسيات البرمجة التركيبية
ملفات الترويسةحواجز التضمينملفات المصدرالدوال الساكنةمراجعة: آلة حاسبة تركيبية4التغليف (Encapsulation)
مفهوم الـ Opaque Pointersتعريف الـ Opaque Structsالـ Getters والـ Settersالتحقق من البيانات في الـ Settersملخص: الصندوق السري2الكائنات والأساليب
الـ Structs ككائناتمؤشر 'Self'صحة استخدام Constالمؤشر مقابل القيمةالأساليب المساعدةملخص: Point Manager5مشروع: حساب بنكي بسيط
إعداد المشروعتنفيذ الحساب3دورة حياة الكائن
نمط المنشئ (Constructor Pattern)نمط الهادم (Destructor Pattern)تهيئة الـ Stackالنسخ العميق (Deep Copy)مراجعة: String Wrapper6الوراثة عبر التركيب
تضمين الـ Structقاعدة العضو الأولالوصول إلى أعضاء الأبعملية الـ Upcastingمراجعة: هرمية الأشكال9مشروع: رسّام الأشكال
نظرة عامة على المشروعتنفيذ الدائرة