החומר המופיע בעמוד זה פורסם לראשונה בכתב העת "הבטים בהוראת מדעי המחשב" גליון ינואר 2005, עמודים 21-24

לא ניתן לעשות שימוש מסחרי בחומר זה ללא רשות בכתב מן המחברים או מערכת כתב העת

מימוש טיפוס נתונים מופשט

בסביבת תכנות מונחה עצמים

משחק 16 הקלפים

 

 

זהבית בר-לוי, זיוה קונצמן, שירלי רוזנברג-כהן

תודה לעפרה ברנדס על הסיוע בבניית התכנית ובהכנת המאמר.

 

ראשי פרקים:

מבוא

חוקי המשחק

המחלקות

ממשק המחלקות (שחקן, קלף, משחק)

התכנית הראשית

המימוש המלא של הממשקים:

קובץ  Player.html , קובץ Player.java

קובץ  Klaf.html , קובץ Klaf.java

קובץ  Game.html , קובץ Game.java

קובץ  PlayGame.html , קובץ PlayGame.java

 

מבוא

לקראת המעבר הצפוי ללימוד עיצוב תוכנה בשפת תכנות מונחית עצמים, החלטנו לקחת טיפוס נתונים מופשט (טנ"מ) בו אנו משתמשות כיום בעיצוב תוכנה ולראות כיצד ניתן ללמדו בגישה מונחית עצמים. הדוגמה מבוססת על משחק ובו 16 קלפים ו-4 שחקנים. הנחיות המשחק מופיעות בהמשך המאמר.

 

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

 

אי-אפשר כמובן להגיע לטנ"מ מורכב כזה, לפני שמלמדים את נושא המערכים. הדוגמה מבוססת על ההנחה שלנו שהתלמידים ילמדו על מערכים ביסודות מדעי המחשב. הואיל והכוונה היא ללמד גם את יסודות בסביבת תכנות מונחה עצמים (תמ"ע), הרי ברור שהשימוש במערכים צריך כבר להיות נהיר להם וכך נרוויח גם תרגול וחזרה על מערכים המכילים עצמים.

 

המשחק משמש דוגמה טובה לטנ"מ מורכב, אך עדיין ללא כל מבני הנתונים הנלמדים בעיצוב תוכנה, כמו מחסנית, רשימות או תור. מכיוון שמבנים אלו אינם פשוטים או קלים להבנה לתלמידים, לפחות לא בשלב הראשון, אנחנו נמנעות מכניסה לדרגת קושי אחרת ומתמקדות בעקרונות התכנות מונחה העצמים, וכך נאפשר ביסוס והעמקת ההבנה  ואחריה נוכל להתקדם למבני הנתונים הנ"ל.

 

נקודה נוספת המחייבת דיון והחלטה עבור כל טנ"מ היא השימוש הרצוי בהרשאות הגישה השונות לתכונות המחלקות. למשל, במחלקה שחקן, ניתן לפתח את הדיון סביב הרשאת הגישה של יד הקלפים: public או private. במידול שלפניכם יד-הקלפים ציבורית אך זה  לא בהכרח המידול הנכון. הנקודה הזו חשובה לדיון כדי לנתץ את ה"תבנית" השכיחה, לפיה תכונות של מחלקה מוגדרות תמיד כ-private. יש להראות שהדבר נקבע לגופו של עניין.

 

משחק זה יכול להוות גם הזדמנות לשימוש בתוכנת התיעוד של javadoc, היוצרת ממשק מדהים, מובן ומפורט. זאת כמובן לאחר הסברים על שיטת התיעוד בקבצים עצמם. זו הזדמנות טובה גם לשימוש ביבוא של חבילות ותרגול מספרים אקראיים.

 

קיים בתרגיל גם האלמנט של הניתוח והמידול - ההחלטה לאן שייכות פעולות מסויימות, המשיקות לשתי מחלקות. כמו למשל, הפעולה בקש-קלף (שחקן), האם היא שייכת למחלקת שחקן, שהרי הוא מבקש את הקלף הנחוץ לו, או נכון יותר למחלקה משחק, שכן מדובר כאן על אינטראקציה בין שני שחקנים וזה כבר חלק מהמחלקה משחק.

 

אפשר להשתמש בפרוייקט זה בכיתה בצורות שונות:

*  אפשר לעבור עם התלמידים את כל תהליך המידול והגדרת ה- UML. כלומר, מי המחלקות, מהן תכונותיהן, ומה השיטות המוגדרות בהן. אפשרות זו דורשת זמן אבל היא גם המאתגרת ביותר. לאחר מכן, אפשר להמשיך באחת מהאפשרויות הבאות (תלוי בפרק הזמן העומד לרשות המורה).

*  אפשר לספק לתלמידים את הממשק של חלק מהמחלקות, כולל המימוש, ועליהם יהיה להשלים מימוש של מחלקה מסוימת אחת. במקרה הזה, התלמידים יצטרכו לכתוב מימוש רק למחלקה אחת על פי ממשק נתון. (אפשרות זו חוסכת זמן תרגול).

*  אפשר לתת לתלמידים את הממשקים ולחלק את הכתה ל-4 צוותים, כאשר כל צוות מתמקד במימוש של מחלקה אחרת על פי הממשק שניתן לו.

 

לסיכום, נראה לנו שמשחק הקלפים יכול לשמש כתרגיל מסכם בעיצוב תוכנה לטנ"מ מורכב, לפני המעבר למבני הנתונים המורכבים מרשימות, מחסנית ותור.

נעבור כעת להציג את חוקי המשחק ולאחריהם נביא את תיאור המחלקות ומימושיהןI.

 

חוקי המשחק

במשחק 16 קלפים. לכל קלף יש מספר (בין 1 ל- 4) וצורה:

 (D – diamond, S – spade, H – heart, C - club)

במשחק משתתפים 4 שחקנים. כל שחקן מקבל בתחילת המשחק 4 קלפים. 

סבב משחק מתנהל כך: כל שחקן (א') מבקש בתורו משחקן אחר כלשהו (ב'), קלף מסוים. במידה והקלף המבוקש נמצא אצלו - מתבצעת החלפה: השחקן הנשאל (ב') מוסר לשחקן המבקש (א') את הקלף המבוקש ומקבל ממנו בתמורה קלף אחר כלשהו. במידה ואין לשחקן הנשאל (ב') את הקלף המבוקש, התור ממשיך הלאה ללא שינוי במצב הקלפים.

המשחק מסתיים כאשר יש שחקן אחד שכל הקלפים שלו הם בעלי אותו מספר. השחקן הזה הוא גם המנצח במשחק.

 

המחלקה "קלף"

תכונות:

- מספר  num

- צורה  Shape

שיטות:

שיטה-בונה

שיטה-בונה-מעתיקה

- אחזר_מספר ( )

- אחזר_צורה ( )

- אחזר_תאור_קלף ( )

 

המחלקה "שחקן"

תכונות:

- מספר  num

- יד  Hand

שיטות:

שיטה-בונה

- נצחון? ( )

- שלשה_באותו_מספר? ( ) 

- זוג_באותו_מספר? ( )

- צורה_חסרה (מספר)

- קלף_נחוץ ( )

- אחזר_תאור_שחקן ( )

 

המחלקה "משחק"

תכונות:

- שחקנים  Players

- קלפים  Cards

שיטות:

שיטה-בונה

- מסירת_קלף (שחקן,קלף_נחוץ,קלף_נמסר) 

- קבלת_קלף (שחקן,קלף_נמסר,קלף_ניתן)

- בקש_קלף (שחקן )

- קביעת_תור_ראשון ( )

- קביעת_תור_שחקן (מספר_תור)

- שחקן_ראשון ( )

- האם_יש_נצחון? ( )

 

העצם שחקן

Class Player

 

java.lang.Object

  |

 +-Player

  +-Player

 

public class Player

extends java.lang.Object

represents a Player class

Field Summary

 Klaf []

Hand            

 

Constructor Summary

Player (int num,

             Klaf k1, Klaf k2, Klaf k3, Klaf k4)
constructors: creates a new Player object

 

Method Summary

 int

isThree ()
returns the number that appears in 3 cards or 0 if not

 int

isTwo ()
returns the number that appears in 2 cards or 0 if not

 boolean

isWin ()
returns true if there is win or false if not

 Klaf

missingShape (int num)
if the Player has 2 or 3 cards of the same number num return the missing card that has the number num in order to complete a series of cards with the same num

 Klaf

necessaryCard()
retreive the necessary card

 java.lang.String

toString()
builds String that represents this Player in the following format:

number/crd1/crd2/crd3/crd4

 

Methods inherited from class java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

 

 

העצם קלף

Class Klaf

java.lang.Object

  |

 +-Klaf

  +-Klaf

 

public class Klaf

extends java.lang.Object

represents a Klaf class

Constructor Summary

Klaf (int num, char shape)

constructors: creates a new Klaf object

Klaf (Klaf klaf)

Copy Constructor constructs a new Klaf object

 

Method Summary

 int

getNum ()
other methods in class: gets the num of card

 char

getShape ()
gets the shape of card

 java.lang.String

toString ()
builds String that represents this klaf in the following format: number/shape (3/D)

 

Methods inherited from class java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

 

 

העצם משחק

Class Game

java.lang.Object

  |

 +-Game

  +-Game

 

public class Game

extends java.lang.Object

represents a Game class

Field Summary

 Player[]

Players            

 

Constructor Summary

Game()
constructors: creates a new Game object

 

Method Summary

 Klaf

askKlaf (Player p)
retreive necessary Klaf

 Player

firstTor ()
return the Player which will be the first to play

 int

fixTorPlayer (int numTor)
returns the number of Player which gets the tor

 Klaf

getKlaf (Player p, Klaf givenKlaf, Klaf k)
Player p gets givenKlaf and give instead card k

 Klaf

giveKlaf (Player p, Klaf neededKlaf, Klaf givenKlaf)
Player p gives neededdKlaf and get instead givenKlaf

 int

isWin ()
return the number of Player which has win or -1 if nobody win

 

Methods inherited from class java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

 

 

התכנית הראשית

Class PlayGame

java.lang.Object

  |

 +-PlayGame

  +-PlayGame

public class PlayGame

extends java.lang.Object

 

Constructor Summary

PlayGame()            

 

Method Summary

static void

Main (java.lang.String[] args)

 

Methods inherited from class java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

 

Constructor Detail

 

PlayGame

public PlayGame()

 

Method Detail

 

main

public static void main (java.lang.String[] args)

 

 

חזרה לתחילת העמוד

גליון ינואר 2005

אתר הבטים

אתר המרכז הארצי