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

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


מציאת שורות מלאות[עריכה]

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

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

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

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

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

לכן לא נוכל להשתמש בפעולת החזרה . נצטרך לתכנת לולאה בדרך אחרת.

לולאת while[עריכה]

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

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

while ( x < 640 )
{
    x = x + 16;
}

הסבר על הקוד:

  • while היא מילת מפתח שמסמנת פקודה ללולאה שחוזרת כל עוד מתקיים תנאי.
  • ( x < 640 ) הוא התנאי של הלולאה. הוא חייב להיות בתוך סוגריים. בתוך הסוגריים אפשר לכתוב כל ביטוי שרוצים.
  • סימני הצומדיים { ו-} מסמנים תחילת וסוף בלוק.
  • x = x + 16; היא פקודת הצבה, שמציבה במשתנה x את הביטוי x + 16. כלומר: מגדילה את x ב-16.

בעברית אפשר לנסח את הקוד הזה ככה: "כאשר x קטן מ-640, תגדיל את x כל פעם ב-16."

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

הפונקציה place_meeting[עריכה]

בשביל לבדוק אם הגענו לגבול בלי קוד, משתמשים בפעולה לבדיקת התנגשות באובייקט . בקוד, אפשר להשתמש בפונקציה שבודקת את זה: הפונקציה place_meeting( x, y, border ) מחזירה 1 ("כן") אם יש מופע גבול במקום (x, y). היא מחזירה 0 ("לא") אם אין שם מופע כזה. באנגלית place_meeting (פְּלֵייס מִיטִינְג) זה "מקום התקלות".

לכן נוכל לכתוב לולאה כזאת:

x_check = x + 16;
while ( !place_meeting( x_check, y, border ) )
{
    x_check = x_check + 16;
}

נעבור על הקוד לאט-לאט כדי להבין אותו:

  • x_check = x + 16; היא פעולת הצבה שמציבה למשתנה x_check את המיקום האופקי שנמצא משבצת אחת מימין למופע: x + 16.
  • while מסמנת לולאה. הלולאה תחזור כל עוד הביטוי בסוגריים שאחרי מילת המפתח while יהיה נכון.
  • הסימן ! מסמן להפוך את התוצאה של הביטוי, ממש כמו תיבת הסימון NOT שבפעולות הבדיקה. אפילו קוראים לו NOT. הוא גורם שבמקום שהלולאה תתבצע כאשר הביטוי נכון, היא תתבצע כל עוד הוא לא נכון.
  • place_meeting( x_check, y, border ) היא פונקציה שבודקת אם יש מופע גבול במקום (x_check, y). אם כן, היא תחזיר 1, הסימן ! יהפוך את זה ל-0, והלולאה תפסיק. אם אין שם גבול, הפונקציה תחזיר 0, הסימן ! יהפוך את זה ל-1, והבלוק שמתחת לפקודה while יתבצע. כלומר: הלולאה תחזור כל עוד אין מופע גבול במקום (x_check, y).
  • x_check = x_check + 16; היא פקודת הצבה שמגדילה את x_check ב-16. ככה בפעם הבאה שהלולאה תתבצע, נבדוק את המקום שנמצא משבצת אחת ימינה.

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

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

if ( !place_meeting( x_check, y, pile ) )
    exit;

נעבור עליו:

  • if היא מילת מפתח שמסמנת פקודת בדיקה. הפקודה שאחריה תתבצע רק אם התנאי בסוגריים נכון.
  • הסימן ! מסמן NOT: להפוך את התוצאה של הביטוי שבודקים.
  • place_meeting( x_check, y, pile ) היא פונקציה שבודקת אם יש מופע ערימה במקום (x_check, y). אם כן, היא תחזיר 1, הסימן ! יהפוך את התוצאה ל-0, והפעולה הבאה לא תתבצע. אם אין שם ערימה, הפונקציה תחזיר 0, הסימן ! יהפוך את התוצאה ל-1, והפעולה הבאה תתבצע. כלומר: הפעולה הבאה תתבצע אם אין מופע ערימה במקום (x_check, y).
  • exit; היא מילת מפתח שמסמנת פקודת יציאה מהקוד, בדומה לפעולה ליציאה מהארוע . באנגלית המילה exit (אֵקְסִיט) משמעה "צא" או "יציאה".

כלומר, הקוד הזה אומר: "אם אין ערימה במקום (x_check, y) - תפסיק לבצע את הקוד."

אם נכניס את הקוד הזה לתוך הלולאה, נקבל את הקוד:

x_check = x + 16;
while ( !place_meeting( x_check, y, border ) )
{
    if ( !place_meeting( x_check, y, pile ) )
        exit;
    x_check = x_check + 16;
}

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

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

x_check = x + 16;
while ( !place_meeting( x_check, y, border ) )
{
    if ( !place_meeting( x_check, y, pile ) )
        exit;
    x_check = x_check + 16;
}
sound_play(full);



נסו להזיז צורה ימינה עד הגבול - כשהיא תנחת אמור להישמע צליל. נסו להנחית צורה באמצע או משמאל - כשהיא תנחת לא אמור להיות צליל.




  • הערה : אם אתה משתמש בגירסת Game Maker Studio ואינך שומע את הצליל , נסה להחליף את הפעולה להשמעת צליל (sound_play(full בקוד
(audio_play_sound(full,1,false

הצד השני[עריכה]

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

x_check = x - 16;
while ( !place_meeting( x_check, y, border ) )
{
    if ( !place_meeting( x_check, y, pile ) )
        exit;
    x_check = x_check - 16;
}

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


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




כדאי לדעת:

מה קורה כשהצורה שנחתה יוצרת כמה מופעי ערימה באותה השורה?

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


כדאי לדעת:

איך מגלים איזה פונקציות ופקודות אפשר לכתוב בקוד?

מי שיודע אנגלית, יכול למצוא את כל הפונקציות והפקודות בעזרה של Game Maker, בחלק שנקרא The Game Maker Language.


אחרי שגילינו שורה מלאה, היא צריכה להבהב ולהעלם - צעד 10: שורה מלאה