Menu
CoddyTech

דמות RPG

חלק מהיחידה תכנות מונחה עצמים במסלול ה-C של Coddy. שיעור 58 מתוך 61.

challenge icon

אתגר

קל

בואו נבנה מערכת קרב של דמות RPG: דוגמה קלאסית המשלבת מבנים, מתודות, בנאים ואינטראקציה בין אובייקטים בעיצוב נקי ומודולרי.

תארגנו את הקוד שלכם בשלושה קבצים:

  • character.h: הגדירו מבנה Character עם שני שדות של מספרים שלמים: health ו-damage. הכריזו על אבות הטיפוס של הפונקציות ליצירת דמות, לביצוע התקפה, לבדיקה אם דמות עדיין בחיים ולהדפסת המצב של דמות.
  • character.c: ממשו את מערכת הדמויות:
    • create_character: מקבלת ערכים התחלתיים של בריאות ונזק, מקצה זיכרון לדמות בערימה, מאתחלת את השדות שלה ומחזירה מצביע
    • attack: מקבלת שני מצביעים ל-Character (תוקף ומטרה), ומפחיתה מבריאות המטרה את הנזק של התוקף
    • is_alive: מקבלת מצביע const ל-Character ומחזירה 1 אם הבריאות גדולה מ-0, אחרת מחזירה 0
    • print_status: מקבלת מצביע const ל-Character ומדפיסה את הבריאות של הדמות בפורמט Health: X
    • free_character: משחררת את הזיכרון שהוקצה
  • main.c: צרו סימולציה של קרב! קראו ארבעה מספרים שלמים המייצגים את הבריאות של הגיבור, את הנזק של הגיבור, את הבריאות של האויב ואת הנזק של האויב. צרו את שתי הדמויות בעזרת הבנאי שלכם. לאחר מכן דמו את סבבי הקרב: בכל סבב הגיבור תוקף ראשון, ואז האויב משיב בהתקפה. אם התקפת הגיבור מורידה את בריאות האויב לאפס או פחות, האויב מובס ואינו משיב בהתקפה באותו סבב. המשיכו עד שאחת הדמויות מובסת. לאחר כל סבב, הדפיסו את המצב של שתי הדמויות (הגיבור תחילה, ואז האויב). כשהקרב מסתיים, הדפיסו את Hero wins! או את Enemy wins!, בהתאם למי ששרד. אל תשכחו לשחרר את הזיכרון של שתי הדמויות.

התוכנית שלכם תקבל ארבעה קלטים:

  1. הבריאות ההתחלתית של הגיבור
  2. הנזק של הגיבור בכל התקפה
  3. הבריאות ההתחלתית של האויב
  4. הנזק של האויב בכל התקפה

פלט לדוגמה כאשר הקלטים הם 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;
}

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר C אונליין