شخصية RPG
جزء من قسم البرمجة كائنية التوجه في رحلة C على Coddy. الدرس 58 من 61.
التحدي
سهللنبنِ نظامًا للقتال في 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 الخاص بـattackeris_alive: يأخذ مؤشر Character من النوع const ويعيد 1 إذا كانت health أكبر من 0، وإلا يعيد 0print_status: يأخذ مؤشر Character من النوع const ويطبع health الخاصة بالشخصية بالتنسيقHealth: Xfree_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 كلتا الشخصيتين.
سيستقبل برنامجك أربعة مدخلات:
- health الابتدائية لـHero
- damage الخاص بـHero في كل هجوم
- health الابتدائية لـEnemy
- 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;
}
جميع دروس البرمجة كائنية التوجه
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 عبر الإنترنت