תרגיל 5 בקורס מבוא לתכנות 202.1.9031, JAVA סמסטר ב תכנות מונחה עצמים ועבודה עם רשימות גנריות תאריך אחרון להגשה: 19/6/19 עד שעה: 23:55, אין הגשה באיחור!!! העבודה בזוגות בלבד. מתרגל אחראי: אבישי. שעות קבלה: על פי הרשום באתר הקורס )תפורסם הודעה מידי תחילת שבוע היכן ומתי(. שימו לב בקובץ זה 5 עמודים. מטרת המטלה: לתרגל תכנות מונחה עצמים, ללמוד לתכנן פרויקט המכיל מס' מחלקות ויצירת אובייקטים תוך שמירה על כללי ההכמסה והרשאות משתנים. להשתמש במחלקות Node ו- List נתונות עם נתונים גנריים כפי שלמדתם בהרצאה ובתרגולים, לכתוב פונקציות של אובייקט ולהשלים קוד חסר בקובץ מקור נתון. תיאור המטלה: במטלה זו עליכם לכתוב את המשחק UnMonopoly. במשחק משחקים מס שחקנים בלתי מוגבל. כל שחקן מצויד בתחילת המשחק בסכום כסף ראשוני שלם )int( איתו הוא נכנס לשחק. המשחק מורכב מכמות סיבובים מוגדרת מראש. בכל סיבוב, השחקן עם כמות הכסף הגדולה ביותר מחויב להעביר לשחקן עם כמות הכסף הקטנה ביותר 1/3 מכספו, לשלם מס של 1/3 ולהישאר לבסוף עם 1/3 מכספו. במידה וקיים סכום זהה בין שניים או יותר שחקנים, הסכום יילקח מהשחקן הראשון בתור במשחק. וכך, בכל סיבוב החוקים נשמרים עד לסוף הסיבוב האחרון, בו מוצג המנצח שהוא השחקן שנשאר עם סכום הכסף הגדול ביותר והמפסיד, השחקן שנשאר עם סכום הכסף הנמוך ביותר. שימו לב, עבודה זו, תיבדק ע י מערכת אוטומטית שנבנתה במיוחד לעבודה זו. המערכת תבדוק את תקינות הקוד שלכם: הערות, מימוש כל הפונקציות כשורה, שגיאות קומפילציה וכמובן הפלט. עליכם לממש פלט זהה ל ח ל ו ט י ן בעבודתכם. בעבודה זו, נספק לכם תבניות קבצים עם פונקציות נדרשות למימוש )פירוט בהמשך(, המחלקות list,node בשלמותן ללא אפשרות לשנותן, וכן קובץ Driver שבו קיימת פונקציית main ממומשת. בקובץ זה אסור לכם לגעת!!! אין לשנות בו דבר! להלן פירוט הקבצים והפונקציות הנדרשות למימוש. אין לשנות בשום אופן את חתימת הפונקציות, אך אפשר ומומלץ בהחלט להוסיף פונקציות עזר נוספות במחלקות אלו בלבד. המחלקה :Player.java המחלקה מתארת שחקן במשחק. לכל שחקן, שם, מס תעודת זהות, תקציב ראשוני - מספר שלם. אין לשנות בשום אופן את השדות ואין להוסיף שדות נוספים! פונקציות נדרשות למימוש במחלקה זו: public Player(String pname, int id) בנאי זה מקבל שם ות.ז ויוצר שחקן חדש עם הפרטים שהתקבלו ומציב לו תקציב התחלתי 0. public Player(String pname,int id,int budget) בנאי זה מקבל שם, ת.ז ותקציב ראשוני ומעדכן את כל השדות של השחקן. פונקציה זו מעדכנת את התקציב של השחקן. public void setbudget(int newbudget)
public int getbudget() פונקציה זו מחזירה את התקציב של השחקן. public String tostring() פונקציה זו מחזירה מחרוזת המייצגת שחקן. היא כבר ממומשת לכם ולכן אין לגעת בה!!!! המחלקה :PrQueue.java המחלקה מגדירה תור של שחקנים. בראש התור ימוקם תמיד השחקן בעל כמות התקציב הגבוהה ביותר בכל סיבוב, כלומר, התור צריך להיות ממוין בסדר יורד כאשר בסוף התור ימוקם השחקן בעל התקציב הנמוך ביותר. התור ימומש באמצעות רשימה גנרית של שחקנים. המחלקה תכיל פונקציות, הכנסה, הוצאה והצגת השחקנים. למחלקה שדה אחד בלבד והוא רשימת שחקנים גנרית. אין לשנות את השדה ואין להוסיף שדות נוספים!!! פונקציות נדרשות למימוש במחלקה זו: public PrQueue() בנאי המאתחל רשימת שחקנים חדשה ריקה. public Node<Player> getfirst() פונקציה המחזירה את השחקן הראשון בתור, כלומר השחקן בעל התקציב הגבוה ביותר. public Node<Player> getlast() פונקציה המחזירה את השחקן האחרון בתור, כלומר השחקן בעל התקציב הנמוך ביותר. public Node<Player> enqueue(player newplayer) פונקציה המכניסה שחקן לתור, הפונקציה דואגת שייכנס למקומו הנכון בתור ולשמור על מיונו. במידה וקיים שחקן עם תקציב זהה, הוא ייכנס אחריו. הפונקציה מחזירה את השחקן שהוכנס. הפונקציה מוציאה מהתור ומחזירה את השחקן הראשון. public Node<Player> dequeue() public String tostring() הפונקציה מחזירה מחרוזת המציגה את כל איברי התור. המחלקה :Game.java
המחלקה מתארת משחק שלם המורכב ממספר סיבובים שיוגדר במימוש האובייקט. למחלקה שדה אחד והוא תור שחקנים. אין להוסיף שדות או לשנות את השדה! להלן הפונקציות הנדרשות למימוש: public Game(PrQueue q) בנאי המקבל תור שחקנים ומעדכן את השדה של המחלקה. public void turn() פונקציה המגדירה סיבוב בודד במשחק. הפונקציה צריכה לבדוק עבור תור שחקנים לא ריק, מי השחקן בעל התקציב הגדול ביותר, העברת 1/3 מהסכום לשחקן בעל התקציב הנמוך ביותר, איבוד 1/3 נוסף ועדכון הרשימה בהתאם. public void play(int turns) הפונקציה מקבלת מספר סיבובים, גדול מ- 0 ותפקידה להריץ סיבובים כמספר שהתקבל ולהציג בכל סיבוב על המסך את רשימת השחקנים ממוינת מבעל התקציב הגבוה ביותר לנמוך ביותר. הפונקציה מציגה את המנצח והמפסיד בשורות נפרדות ע פ דוגמא בהמשך. ניתן כאמור להוסיף למחלקות Player, PrQueue, Game פונקציות עזר כרצונכם, אך אין לשנות את חתימת הקיימות ואין להוסיף שדות נוספים למחלקות. במחלקות List,Node,Driver אין לגעת בשום אופן!!! שימו לב: בעבודה זו, כאמור, קובץ ה- Driver ממומש במלואו. הקובץ מאתחל 5 שחקנים ומפעיל משחק בעל 10 סיבובים עבורם. הפלט הנדרש עבור Driver זה הוא: [e, 1, 300][d, 1, 100][b, 1, 48][a, 1, 35][c, 1, 32] ---------------------------------------------------- [c, 1, 132][d, 1, 100][e, 1, 100][b, 1, 48][a, 1, 35] [d, 1, 100][e, 1, 100][a, 1, 79][b, 1, 48][c, 1, 44] [e, 1, 100][a, 1, 79][c, 1, 77][b, 1, 48][d, 1, 33] [a, 1, 79][c, 1, 77][d, 1, 66][b, 1, 48][e, 1, 33] [c, 1, 77][d, 1, 66][e, 1, 59][b, 1, 48][a, 1, 26] [d, 1, 66][e, 1, 59][a, 1, 51][b, 1, 48][c, 1, 25] [e, 1, 59][a, 1, 51][b, 1, 48][c, 1, 47][d, 1, 22] [a, 1, 51][b, 1, 48][c, 1, 47][d, 1, 41][e, 1, 19] [b, 1, 48][c, 1, 47][d, 1, 41][e, 1, 36][a, 1, 17] [c, 1, 47][d, 1, 41][e, 1, 36][a, 1, 33][b, 1, 16] Winner is: [c, 1, 47] Loser is: [b, 1, 16]
הסבר לפלט: בשורה הראשונה מוצגים השחקנים שנכנסו למשחק ממוינים בסדר יורד לפי תקציבם. לאחר הקו המקווקו, מוצג כל אחד מ- 10 הסיבובים של המשחק. ניתן לראות שהשחקן e הצטרף למשחק כבעל התקציב הגבוה ביותר )300( ואילו c בעל התקציב הנמוך ביותר )32( ולכן, בסיבוב הראשון על e להעביר 1/3 מתקציבו ל- c שעלה ל- 132, לשלם מס של 1/3 נוסף )לאבד 1/3(, ולהישאר בעצמו עם 1/3 מתקציבו, כלומר עם 100. ולכן c כעת הוא הראשון בתור. בתום 10 הסיבובים, מוצג המנצח והמפסיד. דוגמא נוספת: מצב נוכחי: [a, 1, 51][b, 1, 48][c, 1, 47][d, 1, 41][e, 1, 19] השחקן a בעל סכום 51, הגבוה ביותר, יצטרך להעביר 1/3 מכספו ל- e, לשלם מס )לאבד( 1/3 נוסף ולהישאר עם 1/3. ולכן בסיבוב הבא זו תמונת השחקנים: [b, 1, 48][c, 1, 47][d, 1, 41][e, 1, 36][a, 1, 17] קראו היטב את ההערות הנוספות הבאות בכל מקרה, על התכנית שלכם להפיק בדיוק את הפלטים כפי שהוצגו בהרחבה בכל אחד מהדוגמאות של כל סעיף. לא להילחץ המלצה: תכננו את מבנה המחלקות בתרשים טרם כתיבת שורת קוד אחת. העבודות יוגשו בזוגות בלבד על פי הנחיות ההגשה כפי שהיו בעבודה מס' 4. אין הגשה באיחור בעבודה זו!!! בתוך קובץ ההגשה יהיו 6 קבצי java )ללא תיקיות( עם שמות המחלקות )במדויק( שהוצגו מעלה. בדיוק לא יותר ולא פחות. במטלה זו ניתן להשתמש בכל מה שלמדתם בקורס, אין לשנות את חתימות הפונקציות המובנות אך בהחלט אפשר להוסיף פונקציות עזר נוספות במחלקות שצוינו ובלבד ששמרתם על כללי הכימוס ופעולת האובייקט ללא חזרות מיותרות של שורות קוד זהות. יעילות נדרשת! העבודה צריכה להיות מוכלת בחבילת ברירת המחדל. כלומר בתחילת הקובץ שלכם לא אמור להופיע המשפט <name>; package באחריות כל סטודנט להתעדכן בשינויים/עדכונים באתר הקורס. באחריותכם לוודא שהקבצים עלו נכונה לאתר ההגשות..1.2.3.4.5.6.7.8.9
יש לתת שמות משמעותיים למשתנים, יש להעיר הערות ברורות ומבארות על העבודה, מרכיבים אלו הינם חלק מהניקוד על העבודה. על ההערות להיות כתובות באנגלית בלבד מתומצתות ובשיקול דעת. יש להקפיד שהעבודה תהיה קריאה. אין לכתוב שורות קוד ארוכות מאוד ויש להקפיד על הזחה (אינדנטציה(: על קטעי הקוד הנמצאים בתוך לולאה או if להיות מוזזים ימינה בtab. למידע נוסף על אינדנטציה ראה ערך https://en.wikipedia.org/wiki/indent_style אין להשתמש בהורשה או כל חומר תכנות מונחה עצמים שלא נלמד בקורס זה. מומלץ לא לכתוב את כל הקוד ורק אז לקמפל ולדבג, אלא לכתוב חלק אחד ורק לאחר שחלק זה מקומפל ומדובג היטב להמשיך הלאה. חלקו את העבודה ביניכם אך זכרו, כל אחד מבני הזוג חייב להכיר את העבודה כאילו כתב אותה לבדו! מומלץ לא לחכות לרגע האחרון ולהתחיל את העבודה בהקדם האפשרי. אין הגשה באיחור לעבודה זו! שאלות בנוגע לעבודה יש לפרסם בפורום העבודה הנמצא באתר הקורס. לפני פרסום שאלה, יש לעבור על השאלות שכבר נענו בפורום ולוודא שהשאלה לא נשאלה כבר וקיבלה מענה. שאלות שיישלחו למיילים של צוות הקורס או שאלות חוזרות לא יקבלו מענה. כמו כן, אין לשאול שאלות בנוגע לעבודה במהלך התרגול או בהפסקות. נא לשמור על הגינות אקדמית..10.11.12.13.14.15.16.17 בהצלחה!