Menu
Coddy logo textTech

דמות 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: 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;
}

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

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