تطوير شخصية لعبة
جزء من قسم البرمجة كائنية التوجّه في رحلة GDScript على Coddy. الدرس 64 من 65.
التحدي
متوسطأنشئ شخصيات للعبة تقمّص أدوار: صنفًا مجردًا Character، وثلاثة أصناف ترث منه، وقدرات تتعلمها الشخصيات.
Character في character.gd صنف @abstract:
- الخصائص:
character_name(من المُنشئ)،level1، وmax_healthوhealth100.0، وmax_manaوmana50، وstrengthوintelligenceوagility10، وdefense5، وabilities، وهيArray[Ability]. قيم الصحة من النوعfloat، أما الإحصاءات الأخرى فمن النوعint. - إشارة
defeated(character_name: String). - الطريقتان المجردتان
class_title() -> Stringوattack_power() -> float. level_up() -> String: زيادة المستوى بمقدار+1، والصحة القصوى بمقدار+10، والمانا القصوى بمقدار+5، والقوة والذكاء والرشاقة والدفاع بمقدار+1؛ وتُستعاد الصحة والمانا إلى الحد الأقصى. تُرجعNAME reached level N!.attack(target): تطبعNAME attacks TARGET، ثم تُرجعtarget.take_damage(attack_power()).take_damage(amount) -> float: يكون الضررamount - defense * 0.5، على ألا يقل عن1.0؛ وتنخفض الصحة بمقداره، لكن لا تقل عن0.0. تطبعNAME takes D damage (HP H)مع منزلة عشرية واحدة لكل قيمة، وتُصدر الإشارةdefeatedعندما تؤدي هذه الضربة إلى وصول الصحة إلى0، ثم تُرجع الضرر.is_alive(): الصحة أكبر من0. وتضيفlearn_ability(ability)القدرة إلىabilities.use_ability(index, target) -> float: إذا كان الفهرس خارج نطاقabilities، تطبعNAME has no ability INDEXوتُرجع0.0؛ وإلا فتُرجع ما تُرجعهuse()الخاصة بالقدرة._to_string():NAME the TITLE (level L): HP H/MAX, mana M/MAX, STR S, INT I, AGI A, DEF D، مع عرض الصحة بمنزلة عشرية واحدة.
يستدعي كل صنف فرعي مُنشئ الصنف الأب، ثم يضبط إحصاءاته الابتدائية (وتبقى الإحصاءات الأخرى على القيم الأساسية)، ويُرجع اسم صنفه من class_title() ويتجاوز level_up() باستخدام super():
Warrior: الصحة150.0، والمانا30، والقوة15، والذكاء5، والدفاع8؛ قوة الهجومstrength * 1.2؛ وعند رفع المستوى تزداد القوة أيضًا بمقدار+2والصحة القصوى بمقدار+10(وتُستعاد الصحة).Mage: الصحة80.0، والمانا150، والقوة5، والذكاء20، والدفاع3؛ قوة الهجومintelligence * 0.4؛ وبعد الهجوم العادي يستعيد5من المانا (من دون تجاوز الحد الأقصى)؛ وعند رفع المستوى يزداد الذكاء أيضًا بمقدار+2والمانا القصوى بمقدار+15(وتُستعاد المانا).Rogue: الصحة100.0، والمانا60، والقوة12، والذكاء8، والرشاقة18، والدفاع4؛ قوة الهجومstrength * 0.5 + agility * 0.7؛ وعند رفع المستوى تزداد الرشاقة أيضًا بمقدار+2.
Ability في ability.gd: يأخذ المُنشئ ability_name وmana_cost (int) وdamage (float). تطبع use(user, target) -> float العبارة USER does not have enough mana for ABILITY وتُرجع 0.0 عندما تكون مانا المستخدم أقل من التكلفة. وإلا تخصم المانا، وتطبع USER casts ABILITY on TARGET، ثم تُرجع target.take_damage(damage + user.intelligence * 0.5).
يربط الكود المزوّد إشارة defeated لكل شخصية ويطبع NAME is defeated!. لهذا الإدخال:
hero warrior|Aragorn
hero rogue|Orc
attack Aragorn|Orc
attack Orc|Aragorn
level Aragorn
status Aragornيكون الناتج:
Aragorn attacks Orc
Orc takes 16.0 damage (HP 84.0)
Orc attacks Aragorn
Aragorn takes 14.6 damage (HP 135.4)
Aragorn reached level 2!
Aragorn the Warrior (level 2): HP 170.0/170.0, mana 35/35, STR 18, INT 6, AGI 11, DEF 9ضع التعليمات البرمجية في character.gd وwarrior.gd وmage.gd وrogue.gd وability.gd. يحتوي main.gd على كود الإدخال والإخراج المزوّد، ولا يمكن تعديله.
جرّب بنفسك
extends Node
func _ready():
# كود الإدخال/الإخراج المقدَّم: أبقه كما هو
var heroes := {}
var line := OS.read_string_from_stdin()
while line != "":
var parts := line.split(" ", true, 1)
var f: PackedStringArray = parts[1].split("|") if parts.size() > 1 else PackedStringArray()
match parts[0]:
"hero":
var hero: Character
match f[0]:
"warrior":
hero = Warrior.new(f[1])
"mage":
hero = Mage.new(f[1])
"rogue":
hero = Rogue.new(f[1])
hero.defeated.connect(func(who): print(who, " is defeated!"))
heroes[f[1]] = hero
"learn":
heroes[f[0]].learn_ability(Ability.new(f[1], int(f[2]), float(f[3])))
"attack":
heroes[f[0]].attack(heroes[f[1]])
"cast":
heroes[f[0]].use_ability(int(f[1]), heroes[f[2]])
"level":
print(heroes[f[0]].level_up())
"status":
print(heroes[f[0]])
line = OS.read_string_from_stdin()
جميع دروس البرمجة كائنية التوجّه
1أساسيات البرمجة كائنية التوجه
الملفات الخارجيةمقدمة إلى البرمجة كائنية التوجهالفئات مقابل الكائناتالكلمة المفتاحية selfالأساليبالخصائصالمُنشئ (_init)مراجعة - آلة حاسبة بسيطة4تعدد الأشكال
إعادة النظر في تجاوز الأساليبكتابة الأنواع بأسلوب البطةالفئات والأساليب المجرّدةتصميم الواجهاتمراجعة - حاسبة الأشكال10أنماط التصميم، الجزء الثاني
نمط الأوامرنمط المحوّلنمط المُزيّننمط الطريقة القالبيةنمط الحالةالنمط المركّب2خصائص الأصناف
متغيرات الكائن مقابل المتغيرات الساكنةالدوال الساكنةمُعيِّنات الخصائصمُسترجِعات الخصائصخاص وفقًا للاتفاقيةمراجعة - مدير الحسابات البنكية5التغليف
الأعضاء العامة والخاصةالتحقق من الصحة باستخدام دوال الضبطإخفاء المعلوماتالخصائص للقراءة فقطمراجعة - نظام سجلات الطلاب8مفاهيم متقدمة في البرمجة كائنية التوجه
التركيب مقابل الوراثةالأصناف الداخليةالعُقد كمكوّناتRefCounted مقابل Nodeالتعدادات في الأصنافتدرّب بنفسك: مترجم GDScript عبر الإنترنت