מכללת הדסה, הפקולטה למדעי המחשב מבוא לתכנות מונחה עצמים והנדסת תוכנה סמסטר א', תשע"ו תרגיל 2 תאריך אחרון להגשה: קמפוס הנביאים יום א', 29/11/2015 בשעה 23:59 קמפוס שטראוס יום ג', 1/12/2015 בשעה 23:59 מטרת התרגיל: בתרגיל זה נתרגל תכנון ממשק designing(,)interface שימוש במחלקות מורכבות )מחלקות המכילות אובייקטים של מחלקות אחרות(, העברת מידע בין אובייקטים, וכתלות בהתקדמות ההרצאות גם נושאים של שימוש נכון בהפניות )References( וב- const. כללי: תיאור בתרגיל זה נבנה תכנית המשתמשת במספר אובייקטים. לשם ביצוע המשימה האובייקטים יצטרכו להעביר מידע ביניהם. התוכנית אותה עליכם לממש היא פק-מן )Pac-Man( פשוט בעל שני מסכים לפחות. בהמשך יפורטו הכללים המדויקים של המשחק כפי שתממשו אותו. באופן כללי, למי שאינו מכיר: המשחק בנוי ממבוך אשר בו מפוזרות עוגיות שאותן על השחקן, פק-מן, לאכול. בזמן שהשחקן אוכל להנאתו, מסתובבים במבוך מספר שדונים שרוצים לאכול את השחקן. בלי העוגיות את לגמור היא השחקן של מטרתו שהשדונים כאשר אותו. יתפסו נגמרות העוגיות, המסך נגמר ומופיע במקומו מסך חדש. המשחק ממשיך כל עוד יש מסכים חדשים והשחקן לא נפסל. לשחקן יש שלושה חיים, כך שהמשחק נגמר רק לאחר שהוא נאכל שלוש פעמים ע י שדון. אתם צריכים לחשוב על התיכון )Design( המתאים מבחינת אלו מחלקות צריכות להיות, חלוקת האחריות ביניהן, אלו פונקציות יהיו בכל אחת וכו'. שימו לב שאתם נדרשים לתאר את התיכון ולהסביר אותו בקובץ ה- Readme )ראו בסוף הקובץ, בחלק המתאר את קובץ ה- Readme (. פירוט הדרישות: מסכי המשחק: מסכי המשחק יוגדרו בקובץ טקסט בשם,Board.txt והתכנית תקרא אותם מקובץ זה. בקובץ הזה "תציירו" את המסכים באופן הבא:
אזי השורה הראשונה לפני ציור כל מסך תהיה מספר שזה יהיה גודל הלוח. כלומר אם המספר הינו N כל מסך יהיה בגודל של N על N משבצות )כלומר, N שורות בנות N תווים כל אחת(. רווח משמעותו משבצת ריקה. # מכשול, קיר. * עוגייה. & - תא מעבר. כפי שנאמר לעיל, אתם נדרשים ליצור לפחות שני מסכים. כל המסכים נמצאים באותו הקובץ. הוסיפו שורה ריקה כדי להפריד בין מסך למסך. מיקום הדמויות: לאחר טעינת הלוח, התכנית תקבע את מיקום הדמויות. הדמויות מיוצגות באופן הבא: @ מסמל את השחקן, פק-מן. % מסמל שדון. השחקן ימוקם קרוב ככל האפשר למרכז הלוח. השדונים ימוקמו קרוב ככל האפשר לפינות. מספר השדונים הוא לפי המסך, במסך הראשון אין בכלל שדונים )מסך אימון(, ובכל מסך יתווסף שדון נוסף עד לארבעה שדונים. )כמובן שזה יקרה בפועל רק אם קובץ המסכים מכיל מספיק מסכים, אבל למרות שאתם לא נדרשים לייצר חמישה מסכים, אתם נדרשים לאפשר ארבעה שדונים עבור מקרה שבו נוסיף מסכים לקובץ(. השדון הראשון ימוקם בפינה השמאלית העליונה של המסך, השני בפינה הימנית עליונה, וכן הלאה בכיוון השעון. אם יש יותר ממיקום אפשרי אחד, תוכלו לבחור את המקום באופן שרירותי. אם השחקן "נאכל" ויש לו עוד "חיים", כל הדמויות תמוקמנה מחדש באופן המתואר לעיל )כך נמנע מצב שבו השחקן מיד "ייאכל" שוב על ידי אותו שדון(. הגדרת המרחק: לצורך תרגיל זה, כשאנחנו מדברים על מרחק )למשל, לעיל בקשר למיקום הדמויות "קרוב ככל האפשר"(, אנחנו מדברים על "מרחק מנהטן", כלומר מרחק שנקבע לפי סכום הפרשי הקואורדינטות. ובשפה מתמטית, אם הנקודות,a b מורכבות מהקואורדינטות,x0,y0,x1 y1 בהתאמה, המרחק הוא:
d = x0 x1 + y0 y1 מהלך המשחק: לשם פישוט, המשחק לא מתנהל "בזמן אמת" לפי שעון, כמו המשחק הרגיל, אלא לפי תור. סדר התורים יוגרל בתחילת כל מסך. תזוזת הדמויות: בכל תור דמות יכולה לזוז לאחד מארבעת הכיוונים )אך לא באלכסון(. דמות זזה בכל תור רק משבצת אחת. נבחין בין המקרים הבאים לגבי התא המבוקש: אם התא המבוקש חסום )יש בו מכשול, #(, התנועה לא תתבצע. מה כן יקרה? נבדיל בין השחקן לבין השדונים, אם השחקן ניסה לזוז בכיוון המכשול ונחסם, התנועה לא תתבצע אך גם התור נשאר שלו, עד שהוא יזוז או עד שהוא יוותר במפורש על התור שלו )ראו בהמשך(. לעומת זאת, אם שדון ניסה לזוז ונחסם, הוא מפסיד את התור, והתור עובר לדמות הבאה, לפי הסדר שתואר. אם התא המבוקש הינו "תא מעבר" )&( התזוזה אליו תוביל את השחקן\השדון לאחד מתאי המעבר האחרים במסך, באופן אקראי. ברגע שאחת הדמויות נעה לתוך תא מעבר, אותו תא נעלם מהמסך. מדובר בתא המעבר אליו נכנסה הדמות מרצונה, ולא זה שהיא הובלה אליו. אם נותר רק תא מעבר אחד במסך הוא הופך למכשול ולא ניתן לגשת אליו יותר. אם דמות מבקשת לעבור "מחוץ למסך", היא חוזרת מהצד השני )כמובן, אם אין מכשול(. למשל, אם השחקן יזוז ימינה מחוץ לגבולות המסך, הוא יחזור משמאל, או אם שדון זז כלפי מטה מחוץ למסך, הוא חוזר מלמעלה. אם השחקן נע לתא שיש בו שדון, המהלך חוקי )הוא מתבצע(, אולם הוא "ייאכל" מיד. כצפוי, גם אם שדון נע לתא שבו נמצא השחקן, השחקן "נאכל". אם שדון נע לתא שיש בו שדון, המהלך חוקי. כלומר, שני שדונים יכולים להיות בתא אחד. אם השחקן נע לתא שיש בו עוגייה, הוא "אוכל" את העוגייה, והניקוד שלו עולה. ראו להלן פירוט לגבי הניקוד. הבדל נוסף בין השחקן לשדונים, השחקן יכול לבחור לוותר על תורו )ראו להלן(, אולם שדון לא יכול "לבחור" לוותר על תורו, אלא רק להפסיד את התור במקרה שניסה לזוז לתא חסום, כנ"ל.
מקשי השחקן: השחקן מזיז את הדמות שלו בעזרת מקשי החיצים )ראו הסבר בהמשך(, או לחיצה על מקש הרווח כדי לוותר על התור. אולם תזוזת השדונים: נשאיר לכם להחליט על השיטה להזזת השדונים. מספר נקודות מציון התרגיל מוקדשות לנושא זה וככל שהשיטה מוצלחת יותר, הניקוד הסעיף זה יעלה. תזוזה אקראית היא האפשרות הפשוטה כאן, היא גם "מתומחרת" בהתאם. בכל מקרה, עליכם לציין בקובץ ה- readme שהחלטתם לממש ולהסביר את הבחירה בה, איך היא עובדת וכדומה. מה השיטה סיום המסך: אם השחקן אכל את כל העוגיות במסך הנוכחי, הוא סיים בהצלחה את המסך, והתכנית צריכה לטעון את המסך הבא )אם יש(. שימו לב שכעת שוב צריך להציב את הדמויות מחדש לפי הכללים שנאמרו לעיל. ניקוד: כל עוגייה שהשחקן אוכל מזכה אותו ב- 10 נקודות כפול אחד יותר ממספר השדונים שבמסך, כלומר במסך הראשון, כשאין בכלל שדונים, כל עוגייה שווה 10 נקודות, במסך השני 20 נקודות וכן הלאה. כל סיום מסך מזכה בבונוס של 100 נקודות כפול אחד יותר ממספר השדונים שבמסך, כלומר סיום המסך הראשון יוסיף 100 נקודות, סיום המסך השני 200 נקודות וכן הלאה. הצגת לוח המשחק: אחרי כל תור )כולל תור של שדון( יש להציג למסך את לוח המשחק, מצב הניקוד ומספר המסך. כלומר, כל שינוי יעדכן את התצוגה. כדי לאפשר הצגה ברורה של העדכונים, נצטרך לנקות את המסך בין הדפסה להדפסה. זאת נשיג על ידי הפקודה system("cls") )שכלולה בספריית.)cstdlib כדאי לציין ש- system משתמשת בפקודות המערכת, ולכן הפקודה המסוימת הזו תעבוד רק בסביבת Windows ולא במערכות הפעלה אחרות. שימוש במקשי החיצים: עד היום הכרנו איך לקבל מהמשתמש קלט שמכיל תווי,ASCII כאלה שיש להם ייצוג מודפס על המסך. כמו כן, שיטות הקלט הרגילות )בין אם זו scanf,cin או אפילו )getc דורשות מאתנו להמתין עד שהמשתמש ילחץ על מקש ה- Enter לפני שהן מתחילות לקבל את הקלט. המגבלה הראשונה מונעת מאתנו להשתמש במקשי החיצים בכלל. המגבלה השנייה מונעת מאתנו לקבל את הקלט מהמשתמש )לא משנה באלו מקשים נבחר לשם כך( בלי לחייב אותו ללחוץ Enter בכל צעד, דבר שאיננו סביר במשחק כמו זה. כדי להשתמש במקשי החיצים, וכדי לקבל את המקש שנלחץ גם בלי המתנה ל- Enter, אנחנו נאלצים לפנות לספריה שאיננה חלק מהסטנדרט של C או ++C. הפעם בחרנו להשתמש בספריית.conio.h הסתכלו בקובץ הדוגמה המצורף,,ConioExample.cpp כדי לראות איך משתמשים בה לצורכנו.
שימו לב שלמקשים מיוחדים, כאלה שאין להם ערך,ASCII כמו מקשי החיצים והפונקציות, מוחזרים שני ערכים בזה אחר זה וצריך לקרוא לפונקציה _getch פעמיים לשם זיהויים, בפעם הראשונה מוחזר 0 או 224 )תלוי במקש/במימוש/במערכת ההפעלה( ובפעם השנייה מוחזר הקוד המזהה את המקש המסוים. חייבים לזהות את מה שמוחזר בפעם הראשונה ולזכור זאת, כפי שתראו בקובץ הדוגמה, מכיוון שמה שמוחזר בפעם השנייה זה קוד שבמצב רגיל מדבר על מקש אחר לחלוטין (,H,K M או P, במקרה של מקשי החיצים(. קובץ ה- README : יש לכלול קובץ README שיקרא README.doc, README.docx או README.txt )ולא בשם אחר(. קובץ זה יכיל לכל הפחות: כותרת. פרטי הסטודנט: שם מלא כפי שהוא מופיע ברשימות המכללה, ת"ז. הסבר כללי של התרגיל. תיכון :)design( הסבר קצר מהם האובייקטים השונים בתוכנית, מה התפקיד של כל אחד מהם וחלוקת האחריות ביניהם ואיך מתבצעת האינטראקציה בין האובייקטים השונים. רשימה של הקבצים שנוצרו ע"י הסטודנט, עם הסבר קצר )לרוב לא יותר משורה או שתיים( לגבי תפקיד הקובץ. מבני נתונים עיקריים ותפקידיהם. אלגוריתמים הראויים לציון. באגים ידועים. הערות אחרות..1.2.3.4.5.6.7.8.9 יש לתמצת ככל שניתן אך לא לוותר על אף חלק. אם אין מה להגיד בנושא מסוים יש להשאיר את הכותרת ומתחתיו פסקה ריקה. תכתבו ב- README כל דבר שרצוי שהבודק ידע כשהוא בודק את התרגיל. אופן ההגשה: הקובץ להגשה: יש לדחוס כל קובץ הקשור לתרגיל, למעט מה שיצוין להלן, לקובץ ששמו,exN_name.zip כאשר N הוא מספר התרגיל ו name הוא השם המלא. במקרה של הגשה בזוג,
שם הקובץ יהיה לפי התבנית,exN_name1_name2.zip עם שמות המגישים בהתאמה )ללא רווחים; גם בשמות עצמם יש להחליף רווחים בקו תחתי או להצמיד את שני חלקי השם(. לפני דחיסת תיקיית ה Solution שלכם יש למחוק את הפריטים הבאים: קובץ בעל סיומת sdf שאמור להיות בתיקייה שבה נמצא ה Solution. לעיתים יש גם קובץ בעל סיומת,opensdf גם אותו צריך למחוק. תיקייה בשם ipch שאמורה להיות בתיקייה עם ה Solution. תיקיות בשם debug או release )לרוב יש יותר מתיקייה אחת בשם זה, אחת בתיקיית ה Solution ואחת בתיקיית כל פרויקט(. תיקייה בשם.vs שאמורה להיות בתיקייה עם ה Solution. ככלל אצבע, אם קובץ ה zip הבינאריים המוזכרים. שוקל יותר ממ"ב אחד או שניים, כנראה שלא מחקתם חלק מהקבצים את הקובץ יש להעלות ל Drive Google ולשתף אותו עם כתובת ההגשה הוראות הגשה מפורטות נמצאות באתר הקורס, בדף.Exercise Material כפי שהוסבר בתרגול. הגשה חוזרת: אם מסיבה כלשהי סטודנט מחליט להגיש הגשה חוזרת יש לוודא ששם הקובץ זהה לחלוטין לשם הקובץ המקורי. אחרת, אין הבודק אחראי לבדוק את הקובץ האחרון שיוגש. כל שינוי ממה שמוגדר פה לגבי צורת ההגשה ומבנה ה README עלול לגרור הורדת נקודות בציון. מספר הערות: שימו לב לשם הקובץ שאכן יכלול את שמות המגישים. שימו לב שעליכם לשלוח את תיקיית ה solution כולה, לא רק את קובצי הקוד שיצרתם. עקבו אחרי ההסבר המפורט באתר, במקרה שאתם לא בטוחים איך למצוא את התיקייה. תרגיל שלא יכלול את ה solution, לא יתקבל וידרוש הגשה חוזרת )עם כללי האיחור הרגילים(..1.2 המלצה כללית: אחרי שהכנסתם את הקובץ להגשה, העתיקו אותו לתיקייה חדשה, חלצו את הקבצים שבתוכו ובדקו אם אתם מצליחים לפתוח את ה solution שבתוכו ולקמפל את הקוד. הרבה טעויות של שכחת קבצים יכולות להימנע על ידי בדיקה כזו. בהצלחה!