שלב י – הוספת תקשורת
בשלבים הקודמים השלמנו, בעצם, מימוש כל הכלים הנחוצים להרצת
משחק "צוללות" שלם. בשלב זה נממש את החלקים הדרושים למשחק על מנת להפכו
לאינטראקטיבי. כמו כן, כיון ש"טובים השניים מן האחד" נוסיף בשלב זה גם
את היכולת לשחק במשחק דרך רשת תקשורת. דרישה זו הינה חיונית, כיון שלא
היינו רוצים להציג על מסך אחד את הלוחות של שני השחקנים, ולכן נעדיף
שכל שחקן ישב מול מחשב משלו, והמשחק ינוהל דרך רשת תקשורת בין בני
מחשבים אלה.
כדי להוסיף אינטראקטיביות (הידודיות) למשחק, נגדיר את מחלקת
השחקן. מחלקה זו מטפלת בקבלת הקלט מן השחקן (מיקום היריות וכד')
ומודיעה לו על מהלך המשחק (תוצאות היריות שלו ושל השחקן השני, מצב
הלוח).
כדי לאפשר משחק דרך רשת תקשורת, נוסיף למחלקת השחקן את היכולת
לעבוד בתצורת שרת-לקוח. מופע של שחקן יוגדר כשרת, אם הוא מחכה לשחקנים
אחרים שיתחברו אליו וישחקו איתו. מופע של שחקן יטגדר כלקוח אם הוא
מתחבר לשחקן שרת כדי לשחק עימו. את מימוש התקשורת עצמה נבסס על המודול
socket שהסברים עליו ניתן למצוא כאן
.
ממשו מחלקת
שחקן בעלת המאפיינים הבאים: Sock המכיל את ה socket המחבר את השחקן לשחקן
אחר Board_size, subs_level בהם נתקלנו כבר בשלב ו. My_board, other_board הלוח של השחקן עצמו והלוח של השחקן
היריב. הניחו שלתכנית עצמה מותר להכיר את לוח השחקן היריב במלואו, והיא
אחראית להציג לשחקן את לוח היריב רק כפי שהוא מורשה לראותו.
המחלקה חייבת
לממש את המתודות הבאות: RunServer המקבלת כארגומנטים את כתובת ה-IP ומספר ה port להם
השחקן-שרת צריך להקשיב כשהוא מחכה לשחקנים
נוספים. RunClient המקבלת כארגומנטים את כתובת ה-IP ומספר ה port אליהם השחקן-לקוח
צריך להתחבר כדי לשחק מול השחקן שרת.
לחץ לקבלת רמז:
במקום רמז: כיון שמחלקה זו הינה מסובכת, ומשתמשת בטכנולוגיות
בהן לא דנו עד כה (תקשורת), נמשיך כעת ונפרט את הגדרת המחלקה יותר מאשר
בשלבים הקודמים. חובבי האתגרים מביניכם מוזמנים לדלג על השורות הבאות,
בהן מופיעה הגדרה של מתודות עזר, שמימושן יקל עליכם את המימוש של
המחלקה כולה. המחלקה יכולה
לממש את מתודות העזר הבאות: ConnnectPlayer המתחברת לכתובת אותה היא מקבלת כארגומנט
(שחקן לקוח) וקוראת מהשחקן שרת את גודל הלוח ומספר
הצוללות. AcceptPlayer המאזינה לכתובת אותה היא מקבלת כארגומנט
(שחקן שרת) ועם התחברות שחקן לקוח שולחת אליו את גודל הלוח ומספר
הצוללות. GetSubsFromPlayer אותה פגשנו בשלב ו
GetMoveFromPlayer המקבלת את ה"יריה" מהשחקן, מבצעת אותה
על הלוחות, מציגה את התוצאה לשחקן ושולחת אותה, דרך הרשת, לשחקן
השני. GetMoveFromOtherPlayer הקוראת דרך הרשת את המהלך של
השחקן השני, מבצעת אותו על הלוח ומציגה את התוצאה לשחקן.
הפתרון לשאלה זו הינו ארוך למדי. בסעיף פתרון בית ספר ניתן להוריד את הקוד
לשאלה זו.
|