شخصية 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— يأخذ مؤشرconst Characterويعيد 1 إذا كانت الصحة أكبر من 0، وإلا يعيد 0.print_status— يأخذ مؤشرconst Characterويطبع صحة الشخصية بالتنسيق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) في ملف الترويسة الخاص بك. توضح وظيفة 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مشروع: رسّام الأشكال
نظرة عامة على المشروعتنفيذ الدائرةتنفيذ المستطيلاستخدام تعدد الأشكالحاوية الأشكال