נקמת הסט - אופן השימוש במחלקות

תגיות:

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

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

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

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

כל פעולה שקשורה למשחק כמו ״בחירת קלפים״, ניהול תורות , וכו … יכולה להיות פעולת מחלקה.

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

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

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

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

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

מה שיותר תוקע אותי זה השימוש במחלקה לייצג את מהלך המשחק. ברגע שקראתי לאובייקט מסוג “משחק” המשחק בעצם התחיל. אז אני אמור לכתוב פונקציות בתוך המחלקה אבל לקרוא להן בתוך פונקציית האיתחול?

אם למשל יש לך מחלקת משחק, באתחול אתה צריך לשים את התכונות שאתה משתמש בהן והן חלק מתהליך המשחק. ובמחלקה יש פונקציות שמקדמות את המשחק משפיעות או קשורות אליו. לדוגמא: אם יש לי מחלקה של משחק כדורגל אז תכונות זה הקבוצות במשחק, השחקנים שמשתתפים במשחק, מספר הנקודות לכל קבוצה וכו’. פונקציות זה למשל: הפסקת מחצית, מחצית ראשונה, מחצית שנייה וכו’. (סתם זרקתי דוגמא שעלתה לי, אבל מה שמנחה אותי בעבודה עם מחלקות שבכל מחלקה יש את הדברים המרכיבים אותה: מאפיינים ופעולות.)
לפעמים משתמשים בפונקציות בתוך המחלקה (כמו פונקציות עזר).
ויש פונקציות שמפעילים מבחוץ כדי להשפיע מופע של מחלקה כמו למשל נחזור לדוגמא של הכדורגל: שריקת פתיחה.
soccer = Soccer_Game()
Soccer.start_game()

לייק 1

בתרגיל הסט הקודם ייצגתי קלפים באמצעות מספרים 4 ספרתיים (למשל: 1111, 2222, 3333 הם סט) כי זה עזר לי לבצע כל מני חישובים, והשתמשתי במילון כדי לתרגם אותם ל-“קלפים של סט”.

עד כאן הכל טוב ומגניב, עד ש:

-הייתי צריך להוסיף פונקציות שמפרקות כל מספר לספרות.

-רשימות של טופלים של שלשות שם מספרים הפכו לכאב ראש להתעסקות, כשהיית צריך לבצע פעולות מסויימות רק על שלשה, או רק על מספרים…ושורות הקוד הפכו למבלבלות עם כל הקטע הזה של: “תביא לי את האיבר במקום הזה, שבתוך האיבר במקום הזה, שבתוך ה…”

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


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

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


אמ;לק:
האם המחלקות חסכו ממני קוד?
-לא כזה הרבה. (רק את הקטעים שבהם הייתי צריך לפרק מספרים לספרותיהם).

אבל האם הוא כל-כך הרבה יותר מאורגן? -
כן.
וכל טיפול ושינוי בו היה ממש נוח…
. - - - - -

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

לייק 1

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

מאמלק- עדין חושב שהמספרים זה סופר יעיל!

לייק 1

לא יודע אם עשרות, אבל אני שולח לך בפרטי את מחלקת “Card” (מילון, אתחול מאפייני קלפים ו-str, שהיא הפונקציה ה-“מתרגמת”), ומתוך מחלקת “Set” את הפונקציה: “_check_if_set”, ואתה תראה שזה סופר ברור! :slight_smile:

אני חושב שהיופי היה שמשהו במבנה של מחלקה “מסביר את עצמו”:
לצורך העניין:

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

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

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

ובאופן כללי, זה ש-“קלף” הוא איזשהו מבנה “בפני עצמו” (שיש לו את התכונות, ואת המתודות שלו), או ש-“שלשת קלפים” היא מבנה “בפני עצמה” (ולכל אחד כזה יש את התכונות, ואת המתודות שלו) - הרבה הרבה הרבה יותר מסודר.
הרבה יותר קל לי לפנות לרשימת סטים ששומרת: “שלשות”, מאשר לרשימה של שלשות של טופלים של מספרים 4 ספרתיים (הלכת לאיבוד? תחשוב שגישה לכ לאחד כזה היא דרך אינדקסים), ולך עכשיו תגש למבנה הזה, תשלוף ממנו משהו ותזכור ש-“ל-4 ספרות האלה שבפנים בפנים בפני צריך להתייחס כקלף”…

מה גם, שכשאתה כותב את הקוד, אתה יכול ממש “להשתרשר למטה” באנגלית דרך מודות, וגם השימוש ב-Tab על דברים מזכיר לך איזה פעולות אתה יכול לבצע על כל דבר, וזה כיף. :slight_smile:

*יאללה, חפרתי. :stuck_out_tongue:

2 לייקים