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


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

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

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

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

 

עכשיו תורכם:

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

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


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




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


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




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

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

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




הרמה עריכה

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

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

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

 

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

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

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


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




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

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

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


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




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

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

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


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




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

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

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

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

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




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

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

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




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


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




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

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

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

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