דמות RPG
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C של Coddy. שיעור 58 מתוך 61.
אתגר
קלבואו נבנה מערכת קרב של דמות RPG: דוגמה קלאסית שמשלבת מבנים, מתודות, בנאים ואינטראקציה בין אובייקטים בעיצוב נקי ומודולרי.
תארגנו את הקוד שלכם בשלושה קבצים:
character.h: הגדירו מבנהCharacterעם שני שדות שלמים:healthו-damage. הצהירו על אבות הטיפוס של הפונקציות ליצירת דמות, ביצוע התקפה, בדיקה אם דמות בחיים והדפסת המצב של דמות.character.c: ממשו את מערכת הדמויות:create_character: מקבלת ערכי בריאות ונזק התחלתיים, מקצה זיכרון לדמות בערימה, מאתחלת את השדות שלה ומחזירה מצביעattack: מקבלת שני מצביעים ל-Character (התוקף והמטרה), ומפחיתה מבריאות המטרה את הנזק של התוקףis_alive: מקבלת מצביע const ל-Character ומחזירה 1 אם הבריאות גדולה מ-0, אחרת מחזירה 0print_status: מקבלת מצביע const ל-Character ומדפיסה את בריאות הדמות בתבניתHealth: Xfree_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!זכרו להשתמש בשומרי הכללה בקובץ הכותרת שלכם. הפונקציה 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;
}
כל השיעורים ביחידה תכנות מונחה עצמים
4כימוס
המושג של מצביעים אטומיםהגדרת מבנים אטומיםפונקציות Get ו-Setאימות ב-Settersסיכום: הקופסה הסודית2אובייקטים ומתודות
מבנים כאובייקטיםמצביע 'Self'נכונות constמצביע לעומת ערךמתודות עזרחזרה: מנהל נקודות5פרויקט: חשבון בנק פשוט
הגדרת הפרויקטמימוש החשבוןתרגלו בעצמכם: קומפיילר C אונליין