شخصية RPG
جزء من قسم البرمجة كائنية التوجه في رحلة C على Coddy. الدرس 58 من 61.
التحدي
سهللنبنِ نظامًا قتاليًا لشخصيات RPG Character: مثالًا كلاسيكيًا يجمع بين البُنى والطرائق والبنّاءات وتفاعل الكائنات ضمن تصميم واضح ومقسّم إلى وحدات.
ستنظّم شيفرتك عبر ثلاثة ملفات:
character.h: عرّف بنيةCharacterبحقلين صحيحين:healthوdamage. صرّح بالنماذج الأولية للدوال اللازمة لإنشاء شخصية، وتنفيذ هجوم، والتحقق مما إذا كانت الشخصية على قيد الحياة، وطباعة حالة الشخصية.character.c: نفّذ نظام الشخصيات:create_character: تستقبل قيمتي الصحة والضرر الابتدائيتين، وتخصّص ذاكرة لشخصية على الكومة، وتهيّئ حقولها، وتُعيد مؤشرًا إليهاattack: تستقبل مؤشري Character (المهاجم والهدف)، وتقلّل صحة الهدف بمقدار ضرر المهاجمis_alive: تستقبل مؤشرًا إلى Character ثابتة، وتُعيد 1 إذا كانت الصحة أكبر من 0، وإلا تُعيد 0print_status: تستقبل مؤشرًا إلى Character ثابتة، وتطبع صحة الشخصية بالتنسيقHealth: Xfree_character: تحرّر الذاكرة المخصّصة
main.c: أنشئ محاكاة معركة! اقرأ أربعة أعداد صحيحة تمثل: صحة البطل، وضرر البطل، وصحة العدو، وضرر العدو. أنشئ الشخصيتين باستخدام البنّاء. ثم حاكِ جولات القتال؛ في كل جولة يهاجم البطل أولًا، ثم يردّ العدو بالهجوم. إذا خفّض هجوم البطل صحة العدو إلى الصفر أو أقل، يُهزم العدو ولا يردّ الهجوم في تلك الجولة. استمر حتى يسقط أحد الشخصيتين. بعد كل جولة، اطبع حالة الشخصيتين (البطل أولًا، ثم العدو). عند انتهاء المعركة، اطبع إماHero wins!أوEnemy wins!بحسب الشخصية التي بقيت على قيد الحياة. لا تنسَ تحرير ذاكرة الشخصيتين.
سيستقبل برنامجك أربع قيم:
- صحة البطل عند البداية
- ضرر البطل في كل هجوم
- صحة العدو عند البداية
- ضرر العدو في كل هجوم
مثال على المخرجات عندما تكون المدخلات 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;
}
جميع دروس البرمجة كائنية التوجه
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مشروع: رسّام الأشكال
نظرة عامة على المشروعتنفيذ الدائرةتنفيذ المستطيلاستخدام تعدد الأشكالحاوية الأشكالتدرّب بنفسك: مترجم C عبر الإنترنت