Ex 2
Ex 2
1הערות כלליות
תרגיל זה מהווה 4%מהציון הסופי •
התרגיל להגשה בזוגות בלבד. •
מענה לשאלות בנוגע לתרגיל יינתן אך ורק בפורום התרגיל בפיאצה או בסדנות .לפני פרסום שאלה בפורום •
אנא בדקו אם כבר נענתה – מומלץ להיעזר בכלי החיפוש שהוצגו במצגת האדמיניסטרציה בתרגול הראשון.
שימו לב :לא תינתנה דחיות במועד הגשת התרגיל פרט למקרים חריגים .תכננו את הזמן בהתאם. •
ראו את התרגיל עד סופו לפני שאתן מתחילות לממש .חובה להתעדכן בעמוד ה- •
F.A.Qשל התרגיל ,הכתוב שם מחייב.
העתקות קוד בין סטודנטים ובפרט גם העתקות מסמסטרים קודמים תטופלנה .עם זאת – מומלץ ומבורך •
להתייעץ עם חברים על ארכיטקטורת המימוש.
קבצי התרגיל נמצאים ב GitHub repositoryהבאhttps://github.com/CS234124/ex2 : •
המסמך נכתב בלשון זכר מטעמי נוחות בלבד ומיועד לשני המינים. •
טכניון – מכון טכנולוגי לישראל הפקולטה למדעי המחשב
MTMCHKIN 3
תרגיל בית 2מהווה גרסה מצומצמת (ודטרמניסטית) של המשחק המיועדת
לשחקן אחד.
3.1מהלך המשחק
מטרת המשחק היא לנצח בקרבות ולהגיע לרמה .10בכל תחילת סיבוב ,השחקן שולף קלף מחפיסת הקלפים.
לאחר שליפת הקלף ,השחקן "נתקל" ( )encounterבקלף .הקלף יכול להיות קלף קרב ( )Battleבו צריך לנצח
בקרב בכדי לעלות רמה ,קלף שיפור ( )Heal/Buffהמעלה את הכוח/נקודות החיים תמורת מטבעות ,או קלף אוצר
( )Treasureאשר מעניק מטבעות .לאחר סיום ההיתקלות ,נגמר הסיבוב.
למשחק יש 3מצבים:
• – MidGameהמשחק עדיין רץ .השחקן ממשיך לשלוף קלפים ולהיתקל בהם.
• – Winהמשחק נגמר והשחקן ניצח ,כלומר השחקן הגיע לרמה (.10 )level
• – Lossהמשחק נגמר והשחקן הפסיד ,כלומר נקודות החיים ( )HP – Health Pointsירדו ל.0-
3.2סוגי קלפים
קרב ( - )Battleקלפים אלה יכולים להוביל ל 2-תוצאות:
-ניצחון בקרב אם כוח ההתקפה של השחקן (ראו )4.1.12גדול או שווה לכוחו ( )forceשל קלף הקרב.
במקרה זה השחקן יעלה רמה אחת ,ויקבל מספר מטבעות ( )lootהמוגדר לקלף.
-הפסד בקרב אם כוח ההתקפה של השחקן קטן מכוח ( )forceקלף הקרב .במקרה זה נקודות החיים
( )HP – Health pointsיפגעו במספר נקודות שהקלף מגדיר (עד למינימום של .)0
– Heal/Buffקלפי שיפורים .אם יש מספיק מטבעות על מנת לשלם את המחיר הספציפי (שמוגדר על ידי הקלף)
עבור השיפור שהקלף מציע ,אז השחקן משלם את המחיר ובתמורה מקבל את השיפור .ריפוי של נקודות החיים
( )HP – Health pointsעבור קלף ,Healאו שיפור כוח אם מדובר בקלף .Buff
3.3שחקנ/ית
שחקן מאופיין ב:
• שם ( - )nameמורכב רק מאותיות באנגלית וללא רווחים.
• רמה ( – )levelמספר טבעי בטווח הערכים [.]1,10
• כוח ( – )forceמספר טבעי אי שלילי.
• נקודות חיים מקסימליות ( – )maxHPמספר טבעי חיובי.
• נקודות חיים ( – )HP – Health Pointsמספר טבעי בטווח
הערכים [.]0,maxHP
• כמות מטבעות ( – )coinsמספר אי שלילי שלם.
4מימוש MTMCHKIN
4.1המחלקה Player
תחילה נממש מחלקה שתייצג לנו שחקן במשחק .מאפייני השחקן ישמרו ויתוחזקו על ידי מחלקה זו .המחלקה
תקרא .Player
עליכם להשלים את הממשק והמימוש של מחלקה זו בקבצים ,Player.hו( Player.cpp-יש ליצור אותם) .ממשק
המחלקה צריך להכיל את המתודות הבאות:
4.1.1בנאי
מייצר שחקן ברמה ,1עם אפס מטבעות HP,מלא ששווה ל HP-המקסימלי שהתקבל כארגומנט לבנאי ,וכוח
התחלתי שהתקבל כארגומנט לבנאי .הכוח ההתחלתי הדיפולטי הוא ,5וה HP-המקסימלי הדיפולטי הוא .100
במקרה והערכים המתקבלים בבנאי אינם תקינים ,יש לאתחל את השדות לערכים הדיפולטיים.
Player player1("Efrat",150,2); //Efrat has 150 max HP and 2 points of force.
Player player2("Gandalf",300); //Gandalf has 300 max HP and 5 points of force.
Player player3("Daniel"); //Gandalf has 100 max HP and 5 points of force.
4.1.4עליית רמה
מעלה רמה אחת .אפשר להעלות את הרמה עד רמה ,10לאחר שמגיעים לרמה 10המתודה אינה עושה דבר.
;)(player2.levelUp
4.1.5תשאול רמה
מחזיר את רמת השחקן:
;)(player2.getLevel
לדוגמה ,המתודה למעלה תחזיר .2כי הרמה של ( player2גנדלף) היא 2לאחר שבסעיף הקודם קראנו למתודה
.levelUp
4.1.6שיפורי כוח
מעלה את נקודות הכוח ( )forceבכמות המתקבלת בתור ארגומנט:
;)player2.buff(1
הקוד למעלה יעלה את הכוח של ( player2גנדלף) ל.6
4.1.7ריפוי HP
מעלה את נקודות החיים ( )HPשל השחקן בכמות המתקבלת בתור ארגומנט ,עד למקסימום של :maxHP
;)player3.heal(10
הקוד למעלה לא יעלה את נקודות החיים של ( player3דניאל) ב 10-מכיוון שנקודות החיים שלו שוות כבר
ל .maxHPאם הפרמטר לפונקציה קטן מאפס הפונקציה לא תבצע דבר.
4.1.8פגיעה בHP
מוריד את נקודות החיים ( )HPשל השחקן בכמות המתקבלת התור ארגומנט ,עד ל:0-
;)player3.damage(10
הקוד למעלה יוריד את נקודות החיים של ( player3דניאל) ב .10אם הפרמטר לפונקציה קטן מאפס הפונקציה לא
תבצע דבר .אם הפרמטר לפונקציה גדול מה HP-הנוכחי של השחקן ,הפונקציה תוריד את ה HP-של השחקן
לאפס.
4.1.9בדיקת HP
בודק אם כמות נקודות החיים ( )HPהגיעה לאפס:
{))(if (player2.isKnockedOut
;"std::cout << "Player is knocked out
}
4.1.10הוספת מטבעות
הוספת מטבעות לשק המטבעות .בקוד הבא מתווספים 10מטבעות לגנדלף:
;)player2.addCoins(10
4.1.11תשלום
תשלום מטבעות יתבצע על ידי המתודה ,payאשר תוריד מטבעות משק המטבעות.
מוחזר trueכאשר התשלום הצליח ,אחרת מוחזר falseוהתשלום לא מתבצע כלל (אין שינוי בכמות המטבעות).
הקוד הבא ידפיס ” ,“Not enough Coinsכי ל player1-יש 0מטבעות:
{))if (!player1.pay(10
;"std::cout << "Not enough coins
}
טכניון – מכון טכנולוגי לישראל הפקולטה למדעי המחשב
4.1.12כוח התקפה
מחזיר את כוח ההתקפה .כוח ההתקפה מוגדר להיות הכוח ( + forceהרמה ( .))levelלדוגמה הקריאה הבאה עבור
( player2גנדלף) תחזיר 8מכיוון שיש לו 6נקודות כוח ,והוא ברמה .2
)(player2.getAttackStrength
4.2המחלקה Card
המחלקה Cardמייצגת קלף במשחק .ממשק המחלקה נתון בקובץ המסופק ( Card.hאין לשנותו) ומתואר בקובץ
ובתתי הסעיפים הבאים .עליכם לממש את הממשק בקובץ .Card.cpp
למחלקה יש 2מאפיינים המתקבלים מהמשתמש בעת האתחול:
• - CardTypeסוג הקלף (מתקבל בעזרת enum classבקובץ .)Card.h
• – CardStatsנתוני הקלף ,פרמטרים מספריים של הקלף המתקבלים כמבנה מסוג CardStatsשמוגדר ב-
.utilities.h
נתוני קלף:
שימו לב כי רק חלק מן הנתונים המספריים שמוגדרים ב CardStats-רלוונטיים לכל סוג של קלף! סוגי הקלף להם יש
שימוש בשדה נמצאים בתוך [].
– force oכוח הקלף[Battle] .
– loot oמספר המטבעות שיש להוסיף לשחקן בעת ניצחון בקרב ,או בעת היתקלות בקלף
]Battle, Treasure[ .Treasure
– hpLossOnDefeat oמספר נקודות החיים ( )HP – Health pointsשיורדות בעת תבוסה בקרב.
][Battle
– cost oמחיר קלף שיפורים[Heal, Buff] .
– heal oכמות נקודות החיים שקלף מסוג healמעלה]Heal[ .
– buff oכמות נקודות כוח שקלף מסוג buffמעלה[Buff] .
4.2.1בנאי
מייצר קלף מסוג CardTypeעם ה CardStats-המתקבלים כארגומנטים:
;)CardStats stats(3, 40, 10, 30, 1, 20
;)Card card(CardType::Battle,stats
4.2.2התקלות ()encounter
המתודה מקבלת שחקן הנתקל בקלף ,מבצעת את פעולת הקלף כמפורט ב ,3.2 -ומשנה את השחקן בהתאם.
בהיתקלות בקלף מסוג ,Battleהמתודה תדפיס את תוצאות הקרב על ידי קריאה לפונקציה printBattleResult
אשר מוגדרת בutilities.h-
;)card.applyEncounter(player
4.3המחלקה Mtmchkin
המחלקה Mtmchkinמנהלת את המשחק .המחלקה מחזיקה את השחקן ,את חפיסת הקלפים ואת סטטוס
המשחק .הממשק שלה נתון בקובץ החלקי המסופק ( Mtmchkin.hיש להשלים את השדות של Mtmchkinואת
מימוש הממשק .בנוסף ,בהתאם לצורך אתם יכולים גם להוסיף בנאים ,הורסים וכו').
בתחילת המשחק ,מאתחלים את המשחק עם חפיסת קלפים שנתונה במערך .בכל סיבוב ניגשים לקלף הבא
בחפיסת הקלפים ,מאינדקס אפס בסיבוב הראשון עד סוף המערך ,ובצורה מעגלית חוזרים להוציא קלפים
מתחילת החפיסה כאשר מגיעים לסופה.
4.3.1בנאי
הבנאי מקבל 3ארגומנטים – שם השחקן ,מערך קלפים ,גודל מערך הקלפים.
;]Card cards[4
;)CardStats stats(3, 40, 10, 30, 1, 20
;)cards[0] = Card(CardType::Treasure,stats
;)cards[1] = Card(CardType::Buff,stats
;)cards[2] = Card(CardType::Battle,stats
;)cards[3] = Card(CardType::Heal,stats
;)Mtmchkin game("Daniel", cards, 4
המשחק מאותחל בבנאי כך שמצב המשחק הוא ,MidGameהקלף הבא שיקרא הוא הקלף הראשון במערך
הקלפים ,והשחקן עם הערכים הדיפולטים של כוח ו.maxHP-
לנוחיותכם ,מסופקת לכם תוכנית "בדיקה עצמית" בשם , finalCheckהתוכנית בודקת שקובץ ההגשה ,קובץ הzip-
,בנוי נכון ומריצה את הטסטים סופקו כפי שירוצו על ידי הבודק האוטומטי .הפעלת התוכנית ע"י הפקודה:
~mtm/public/2223b/ex2/finalCheck <submission>.zip
הקפידו להריץ את הבדיקה על קובץ ההגשה .אם אתה משנים אותו ,הקפידו להריץ את הבדיקה שוב.
הפלט ש valgrind-מפיק אמור לתת לכם ,במידה ויש לכם דליפות ,את שרשרת הקריאות שהתבצעו וגרמו לדליפה.
אתם אמורים באמצעות דיבוג להבין היכן היה צריך לשחרר את אותו משאב שהוקצה ולתקן את התכנית .בנוסף,
valgrindמראה דברים נוספים כמו פנייה לא חוקית לזיכרון (שלא בוצע בעקבותיה – )segmentation faultגם
שגיאות אלו עליכם להבין מהיכן הן מגיעות ולתקן.
4.7בדיקת התרגיל
בדיקה יבשה כוללת מעבר על הקוד ובודקת את איכות הקוד והתכן (שכפולי קוד ,קוד מבולגן ,קוד לא ברור ,שימוש
בטכניקות תכנות "רעות").
בדיקה רטובה כוללת את הידור התכנית המוגשת והרצתה במגוון בדיקות אוטומטיות .על מנת להצליח בבדיקה שכזו,
על התוכנית לעבור הידור ,לסיים את ריצתה ,ולתת את התוצאות הצפויות ללא דליפות זיכרון.
4הגשה
את ההגשה יש לבצע דרך אתר הקורס ,תחת
Assignments -> HW2 -> Electronic Submit.
הקפידו על הדברים הבאים:
• יש להגיש את קבצי הקוד מכווצים לקובץ ( zipלא פורמט אחר).
• אין להגיש אף קובץ מלבד קבצי hוקבצי cppאשר כתבתם או
השלמתם בעצמכם.
• הקבצים אשר מסופקים לכם יצורפו על ידנו במהלך הבדיקה ,וניתן להניח
כי הם יימצאו בתיקייה הראשית.
• ניתן להגיש את התרגיל מספר פעמים ,רק ההגשה האחרונה נחשבת.
• על מנת לבטח את עצמכם נגד תקלות בהגשה האוטומטית שימרו את
קוד האישור עבור ההגשה .עדיף לשלוח גם לשותף .כמו כן שימרו עותק
של התרגיל על חשבון ה Google Drive/Github/CSL3-שלכם לפני
ההגשה האלקטרונית ואל תשנו אותו לאחריה (שינוי הקובץ יגרור שינוי
חתימת העדכון האחרון).
▪ כל אמצעי אחר לא יחשב הוכחה לקיום הקוד לפני ההגשה.
בהצלחה !