Skip to content

NoaFishman/Maarhot2_EX3

Repository files navigation

מטלה 3: קאטן

ID: 319055430

הרצת המשחק

על מנת להריץ את המשחק המלא כך שהמשתמש הוא זה שמשחק יש להריץ make catan או לבצע make ולהריץ game/.

על מנת להריץ את הדמו שמבצע שני סבבים של המשחק ללא השתתפות המשתמש יש להריץ make demo או לבצע make ולהריץ Demo/.

על מנת להריץ את הטסטים יש להריץ make test או לבצע make ואז להריץ Test/.

חוקי המשחק

המשחק מורכב מלוח המכיל 19 חלקות אדמה מוקפות בים. כל חלקת אדמה נותנת משאב כלשהו (חוץ מהמדבר). חלקות האדמה במשחק הן: יער (מניב עץ), גבעות (מניבות לבנים), אדמת מרעה (מניבה צמר), אדמה חקלאית (מניבה שיבולת), הרים (מניבים ברזל), מדבר (לא מניב כלום). כל חלקי המפה מקבלים מספר כלשהו בין 2 ל-12. קיימים 4- יער, 3- גבעות, 4- אדמת מרעה, 4- אדמה חקלאית, 3- הרים. מבחינת מספרים קיימים 2 מכול מספר חוץ מהמספרים 2, 12 שמהם קיימים אחד מכל אחד.

קלפים, יישובים, ערים ומשאבים

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

קלפי פיתוח:

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

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

בנייה:

ניתן לבנות דרכים, ערים ויישובים בצורה הבאה:

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

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

מסחר:

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

מהלך המשחק

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

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

סיום המשחק

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

אופן המימוש

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

Player:

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

Vertex:

מחלקת הקודקוד מייצגת לנו קודקודים בלוח (חיבור של דרכים או משושים), קודקוד היא הנקודה שבה ניתן להתיישב. מחלקה זו היא הבאה בסדר ההיררכיה מכיוון שבשתי המחלקות הבאות יש שימוש במשתנה מסוג זה בתוך האובייקט ולכן הן צריכות לרשת ממנה. עבור כל קודקוד יש את מספר הקודקוד (על פי הרשימה בלוח והאיור בסוף), מספר השחקן שבעלותו הקודקוד, מצביע עבור השחקן, מספר המבנה בקודקוד (0 אם אין, 1 יישוב, 2 עיר) וקיים וקטור המכיל את מספרי הדרכים היוצאים מקודקוד זה. לקודקוד יש גם מספר של מבנה וגם מספר של שחקן מכיוון שקיים שחקן שמספרו הינו אפס ולכן צריך יותר מרק מספק השחקן כדי לדעת אם הקודקוד פוס או לא. מספרי הדרכים יעזרו לנו בהמשך כדי לבדוק ייתכנות להתיישבות ובנייה באזור. בנוסף המחלקה מכילה את כל הפונקציות הנחוצות לנו עבור קודקוד כדי לממש את המשחק כמו, בדיקת בעלות, מציאת הדרכים מסביב, עדכון השחקן בעת קבלת קלפי פיתוח וכו'. בנוסף לקודקוד יש שני בנאים "רגילים" מכיוון שלחלק מהקודקודים יש 3 צלעות היוצאות מהם ולחלק רק 2, תלוי במיקום הקודקוד על הלוח.

Road:

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

Hex:

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

Board:

מחלקה זו היא המחלקה המייצגת את הלוח, כפי שניתן לראות הלוח בנוי מקודקודים , דרכים ומשושים ולכן היא המחלקה הבאה בסדר ההיררכיה. המחלקה מכילה בתוכה שלושה ווקטורים, וקטור ראשון המכיל בתוכו את כל 19 המשושים על הלוח על פי הסדר שלהם , הווקטור השני הוא וקטור המכיל בתוכו את כל 54 הקודקודים במשחק והווקטור האחרון הוא הווקטור של הדרכים המכיל בתוכו את כל 72 הדרכים הקיימות בלוח. כפי שהזכרתי מקודם יש חשיבות רבה לסדר האיברים ברשימות , זו הדרך שבה השחקן יודע להגיד היכן הוא רוצה להתיישב או לבנות דרך ובכך ניתן בצורה פשוטה ומהירה למצוא כל איבר ברשימה. בסוף הקובץ מצורפת תמונה הממחישה את המספור של כל האיברים בלוח ואיך הם מסודרים (למשל מקודקוד 19 יוצאות הדרכים שמספרן הוא 28, 23, 32 והוא נושק למשושים 10, 12, 15, כך עבור כל אחד מהאובייקטים). מכיוון שיש חשיבות רבה למספרים הבנאי של המחלקה הוא מאוד ארוך אך אם זאת עוזר לנו מאוד בהמשך, בבנאי אנו מגדירים 19 משושים, 54 קודקודים ו72 דרכים ,לכל אחד מהם אנו נתונים את הנתונים שהוא זקוק להם על האובייקטים שסביבו ומכניסים אותם לרשימות על פי הסדר. בנוסף המחלקה מכילה בתוכה מימושים לפונקציות על הלוח שעוזרות לנו במימוש המשחק כגון, מציאת קודקוד, הדפסת מצב הלוח, בדיקת שכנים ובעלות בסביבה וכו'.

Catan:

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

Game:

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

Demo:

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

Test:

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

מצורפת תמונה הממחישה את המספור של הצלעות המשושים והקודקודים: image

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published