תכנות לילדים באמצעות Game Maker/טטריס/צעד 12: ניקוד

מתוך ויקיספר, אוסף הספרים והמדריכים החופשי
קפיצה לניווט קפיצה לחיפוש


לוח הניקוד[עריכה]

ברוב הגירסאות של טטריס לוח הניקוד מציג שלושה דברים:

  1. הניקוד
  2. מספר השורות שהושלמו
  3. הרמה

גם אנחנו ניצור לוח ניקוד שמציג את שלושת הדברים האלה.

עכשיו תורכם:

ליצור אובייקט score_panel Gmaker score panel.png שיציג את הניקוד, ולהוסיף מופע שלו לחדר. לתת לו להציג מתחת לניקוד עוד שני משתנים גלובליים: אחד בשם lines והשני בשם level. לאתחל את שני המשתנים האלה ל-0 בארוע Game start Gmaker other.png.

את הניקוד ואת מספר השורות צריך להגדיל בכל פעם שנעלמת שורה. לכן בארוע סוף ההנפשה Gmaker other.png של השורה צריך להוסיף את הפעולה לקביעת הניקוד Gmaker set score.png ואת פעולת ההצבה Gmaker set var.png כדי להגדיל את הניקוד ואת מספר השורות global.lines.


Gmaker test save.png הניקוד ומספר השורות צריכים לעלות כשמשלימים שורות.




גם כשמנחיתים צורה הניקוד צריך לעלות בהתאם לגובה ההנחתה. לכן נלך לארוע הקשה על מקש רווח Gmaker key down.png של אובייקט הצורה, ונוסיף בסופו את הפעולה לקביעת הניקוד Gmaker set score.png. כמה ניקוד נוסיף? לפי גובה הנחיתה. הגובה הזה הוא ההפרש בין y לבין yprevious. לכן נכתוב בחלון אפשרויות הפעולה (y - yprevious) / 16 וכמובן נסמן Relative.


Gmaker test save.png הניקוד צריך לעלות גם כשמנחיתים צורה.




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

  1. Gmaker clock button.png למחוק את הפעולה לכיוון שעון מעורר.
  2. Gmaker code button.png במקומה לשים פעולת קוד, שבה הפקודה event_user(0);.

Gmaker test save.png המשחק אמור להתנהג אותו הדבר כמו קודם, כי עשינו רק refactoring.




הרמה[עריכה]

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

  • להעלות רמה כל עשר שורות.
  • לשנות את הפעולות לקביעת ניקוד ככה שיתנו ניקוד גבוה יותר לפי הרמה.
  • לשנות את מהירות נפילת הצורה לפי הרמה.

נתחיל בהעלאת הרמה: נלך להעלמת שורה בארוע סוף ההנפשה Gmaker other.png של השורה. בסוף רשימת הפעולות שלו צריך להוסיף פעולת בדיקה כדי לבדוק אם מספר השורות שהושלמו מתחלק ב-10 (למשל: 10, 20, 30, או אפילו 100) כי אז צריך לעלות רמה. איזה פעולת בדיקה תוכל לבדוק את זה? הפעולה לבדיקת ערך של משתנה Gmaker if var.png לא תתאים, כי אנחנו לא רוצים לבדוק רק ערך אחד אלא סוג שלם של ערכים: כל הערכים שמתחלקים ב-10. לכן נשתמש בפעולת בדיקה אחרת בלשונית control: הפעולה לבדיקת ביטוי Gmaker if expr.png.

Gmaker if expr dialog.png

הפעולה לבדיקת ביטוי מאפשרת לבדוק ביטוי שרוצים (ממש כמו פקודת if בקוד). אנחנו צריכים ביטוי שאומר אם מספר מתחלק ב-10. אין ב-GML פונקציה שבודקת את זה, אבל יש אפשרות לחשב את השארית שנשארת כשמחלקים מספר ב-10, באמצעות פעולת החשבון mod. הביטוי 27 mod 10 ייתן את השארית שנשארת כשמחלקים 27 ב-10, כלומר: 7.

לכן בחלון אפשרויות הפעולה לבדיקת ביטוי נכתוב global.lines mod 10 == 0 כי הביטוי הזה יהיה נכון רק אם מספר השורות מתחלק ב-10 בדיוק (השארית שווה ל-0).

אם הבדיקה מצליחה, צריך להעלות את הרמה: Gmaker set var.png להגדיל את המשתנה global.level ב-1.


Gmaker test save.png נסו להשלים שורות ולראות אם הרמה בלוח הניקוד עולה בהתאם.




קודים לבדיקות[עריכה]

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

בשביל לעשות את זה נוסיף לאובייקט לוח הניקוד ארוע הקשה על איזשהו מקש Gmaker key down.png, למשל Control (אפשר לבחור משהו אחר אם רוצים). בארוע הזה נוסיף פעולת הצבה Gmaker set var.png ובה נגדיל את global.lines ב-1. ככה נוכל להגדיל את מספר השורות ל-9 או 19 או 29 במהירות, ואז לבדוק בקלות את עליית הרמה.


Gmaker test save.png עכשיו אפשר לבדוק גם עליה לרמות גבוהות.




ניקוד לפי הרמה[עריכה]

הניקוד על השלמת שורה והנחתת צורה צריך להיות תלוי ברמה: ברמה 0 מקבלים 40 נקודות לשורה, ברמה 1 מקבלים 80 נקודות לשורה, ברמה 2 מקבלים 120 נקודות לשורה, וכן הלאה. במלים אחרות, כל פעם שמשלימים שורה (בארוע סוף ההנפשה של השורה Gmaker other.png) צריך להוסיף לניקוד Gmaker set score.png 40 * (global.level + 1).

גם את הניקוד על הנחתת צורה צריך להכפיל ב-(global.level + 1). כלומר, בארוע הקשה על רווח של הצורה Gmaker key down.png צריך לשנות את פעולת קביעת הניקוד Gmaker set score.png כך שתוסיף (y - yprevious) / 16 * (global.level + 1) נקודות.


Gmaker test save.png ככל שהרמה יותר גבוהה, השלמת שורות והנחתת צורות תתן יותר נקודות.




מהירות הנפילה[עריכה]

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

בשביל זה צריך:

  1. Gmaker create.png ללכת לארוע היצירה של הצורה.
  2. Gmaker set var.png לשים בתחילתו פעולת הצבה, ובה לאתחל ל-20 משתנה בשם delay.
  3. Gmaker clock button.png לשנות את פעולת כיוון השעון המעורר ככה שהשעון יצלצל עוד delay צעדים (במקום 20).
  4. Gmaker alarm.png ללכת לארוע השעון המעורר שבו מתבצעת הנפילה של הצורה.
  5. Gmaker clock button.png גם כאן לשנות את פעולת כיוון השעון המעורר ככה שהשעון יצלצל עוד delay צעדים במקום 20.

Gmaker test save.png המשחק אמור להתנהג כמו קודם, כי בינתיים רק עשינו refactoring בלי לשנות התנהגות.




עכשיו צריך להאיץ את קצב הנפילה בכל פעם שעולים רמה:

  1. Gmaker other.png ללכת לארוע סוף ההנפשה של אובייקט השורה.
  2. Gmaker if expr.png הפעולה לבדיקת ביטוי אומרת מתי עולים רמה, לכן צריך להוסיף אחריה את הפעולות להתחלת וסוף בלוק. (לשמור שפעולת ההצבה Gmaker set var.png שמעלה את הרמה תהיה בתוך הבלוק הזה.)
  3. Gmaker set var.png להוסיף לבלוק עוד פעולת הצבה, ובה להקטין ב-1 את המשתנה delay של הצורה: shape.delay.

Gmaker test save.png עכשיו המשחק אמור להיות קצת יותר מהיר כל פעם שעולים רמה.




מה קורה אם מגיעים לרמה 20? המשתנה delay יהיה 0! לכן לפני שמקטינים אותו צריך להכניס פעולה לבדיקת ערך של משתנה Gmaker if var.png ובה לוודא שהוא גדול מ-2 או אולי אפילו 3.


Gmaker test save.png עכשיו המשחק לא ייתקע כשמגיעים לרמות גבוהות.




המשך העבודה[עריכה]

בואו נראה איפה אנחנו ברשימת העבודה:

  • לוח ניקוד
  • האצת מהירות הנפילה
  • רקע
  • אריזה

נשאר לנו הגימור של המשחק - צעד 13: גימור המשחק