ROB אודן: היי. אני רוב, ואני מקווה שלך משחק למשחק של 15. עכשיו, יש ארבע פונקציות שאתה צריך כדי ליישם בתכנית זו - init, לצייר, לנוע, וניצח. אז, בואו נסתכל על init. כאן, אנו רואים את הדבר הראשון שאנחנו הולך לעשות הוא להצהיר על משתנה קרא דלפק. זה הולך להיות מאותחל לפעמי ד ד מינוס 1. זכור כי ד הוא הממד מועצת המנהלים שלנו. איך init הולך לעבוד הוא שזה הולך כדי לחזר בכל המערכת ואנחנו הולכים להתחיל בפינה השמאלית העליונה. ובואו נגיד לנו יש 4 על 4 לוח. אז למעלה משמאל אנחנו הולך להגיד הוא 15. ואז אנחנו פשוט הולכים לספור דרך הלוחות, ואמר 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, וכן הלאה. אז בפינה השמאלית העליונה, אנו מצפים להיות פעמים ד מינוס ד 1, אשר ב4 על 4 מקרה הולך להיות 16 מינוס 1, שהוא בצורה נכונה 15. והנה המקום שבו אנחנו הולכים לחזר בכל המערכת. ואנחנו הולכים להגדיר כל עמדה ב הלוח לערך הנוכחי של נגדנו, ולאחר מכן המונה הולך להפחה, כך שלמחרת עמדה שאנחנו מגיעים הוא הולכת להיות דלפק יהיה אחד פחות העמדה הקודמת. אז בהתחלה היו לנו 15 ו הפחת דלפק. אז אנחנו הולכים להקצות ל14 העמדה הבאה, דלפק מפחית, ואנחנו הולכים הוקצו 13, וכן הלאה. לבסוף, אנחנו צריכים להתמודד עם הפינה ש מקרה שבו, אם בלוח יש גם ממד, ואז פשוט עושה 15, 14, 13, 12, כל הדרך למטה עד 3, 2, 1, הוא הולך לעזוב אותנו עם לוח בלתי פתיר. ואנחנו צריכים להחליף את 1 ו 2. לכן, אם ד mod 2 שווה 0, זה איך אנחנו הולכים לבדוק כדי לראות אם זה אפילו. אם ד mod 2 שווה 0, ואז במינוס ד שורה 1, שהוא בשורה התחתונה, ו מינוס מינוס 2 ד ד העמדה, או בעמודה 2, אנחנו הולכים להגדיר את זה 2, ו ד עמודת מינוס 3 אנחנו הולך מוגדר 1. אז זה פשוט היפוך שבו 1 ו -2 הם כיום. לבסוף, אנחנו הולכים להגדיר מאוד ימני תחתון שווה לריק, שבו ריק הוגדר חשיש בראש כמו 0. אז, זה לא היה הכרחי, מאז זה ללולאה הולך להיות להגדיר ימני התחתון כדי 0, שכן הדלפק באופן טבעי יגיע 0. אבל זה מסתמך עלינו בידיעה כי הריק היה מרוסק למצוא 0. אם אני נכנסתי לתכנית זו, ולאחר מכן לשנות ריק בחלק העליון ל100, זה עדיין צריך לעבוד. אז זה רק כדי לוודא ש הימני תחתון הוא למעשה שווה לשלנו ערך ריק. לבסוף, יש לנו שני משתנים גלובליים, אז אני וj הריק ריק, ואנחנו רואים אלה הכריזו בראש. ואנחנו הולכים להשתמש בשני גלובליים אלה משתנים כדי לעקוב אחר עמדה הריקה, כך שאין לנו צריך להסתכל דרך כל לוח כדי למצוא את החסר בכל אחת פעם שאנחנו מנסים לעשות צעד. אז העמדה הריקה תמיד הולך להתחיל בפינה הימנית התחתונה. אז הימני התחתונה ניתן על ידי מדדי ד מינוס 1, ד מינוס 1. אז, זה init. עכשיו אנחנו עוברים לצייר. אז, תיקו הוא הולך להיות דומה לאן אנחנו הולכים לחזר בכל המערכת. ואנחנו רק רוצים להדפיס את הערך כי הוא בכל עמדה של הלוח. אז הנה, אנחנו מדפיסים את הערך זה בכל עמדה של הלוח. ושים לב שאנחנו עושים -. וזה רק אומר שprintf ללא קשר אם מדוברת בספרה אחת או שתי ספרות, אנחנו עדיין רוצים אותו לקחת את שתי עמודות בהדפסה החוצה, כך שאם יש לנו שתי ספרות ואחד מספרי ספרות באותו הלוח, לוח עדיין ייראה יפה ומרובע. אז אנחנו רוצים לעשות את זה לכל ערך בלוח, פרט לריק. לכן, אם העמדה בלוח שווה הריק, אז אנחנו באופן ספציפי רוצה להדפיס רק תחתון כדי לייצג את ריק, במקום מה הערך של ריק באמת. לבסוף, אנו רוצים להדפיס את הקו חדש. שים לב שזה עדיין בתוך החיצוני ללולאה, אך מחוץ הפנימי ללולאה. מאז חיצוני זה ללולאה iterating על כל השורות, וכך printf זה הולך רק כדי להדפיס שורה חדשה, ולכן אנחנו לעבור להדפיס את השורה הבאה. וזה אותו לתיקו. אז, עכשיו בואו לעבור לזוז. עכשיו, אנחנו עוברים מהלך, האריחים ש משתמש נכנס במשחק - הם להיכנס למשבצת שהם רוצים להעביר - ו אתה אמור לחזור בול, ולכן אמת או שקר, בהתאם אם המהלך שהיה למעשה תוקף - אם אריח שיכול להיות עבר לגור בחלל הריק. אז הנה, אנחנו מכריזים על משתנה מקומיים, tile_1 וtile_j, אשר הולכים להיות דומה לblank_i וblank_j, מלבד זה הולך לעקוב אחר עמדתו של האריח. עכשיו הוא כאן, אנחנו הולכים להשתמש blank_i וblank_j ואומר בסדר, כל כך הנה הריק על הלוח. עכשיו, הוא האריחים מעל הריק? האם האריח מהשמאל לריק? האם האריח מימין הריק? האם האריחים מתחת לריק? לכן, אם האריחים הוא בכל אלה עמדות, אז אנחנו יודעים שהאריחים ניתן להעביר למקום הריק ו הריק ניתן להעביר למקום שבי אריח הוא כיום. אז הנה, אנחנו אומרים אם לוח בעמדה blank_i מינוס blank_j 1. אז זה אומר זה האריח מעל ריק הנוכחית? ואם כן, אנחנו הולכים לזכור זה את עמדתו של האריח. האריח הוא בעמדה blank_i מינוס 1 וblank_j. החברה הראשונה, יש לנו גם סימון זו ממש כאן, כך blank_i הוא גדול מ 0. למה אנחנו רוצים לעשות את זה? ובכן, אם הריק הוא בשורה העליונה של הלוח, אז אנחנו לא רוצים להסתכל מעל ריק לאריח שכן אין שום דבר מעל הראש שורה של הלוח. זה איך אתה עלול בסופו של דבר מקבל משהו כמו אשמה או פילוח התכנית שלך יכולה לעבוד רק בדרכים בלתי צפויות. אז, זה הוא לוודא שאנחנו לא להסתכל במקומות שאינם בתוקף. עכשיו אנחנו הולכים לעשות את אותו דבר עבור כל שילובים האפשריים האחרים. אז הנה, אנחנו מחפשים מתחת לריקים כדי לראות אם זה האריח. ואנחנו גם צריכים לוודא שאנחנו לא בשורה התחתונה, או שאנחנו לא צריך לחפש את האריח. הנה, אנחנו הולכים להסתכל בצד השמאל של הריק כדי לראות אם זה האריח. ואנחנו לא צריכים להסתכל לשמאל אם אנחנו בעמודה השמאלית ביותר. וכאן אנחנו הולכים להסתכל על זכותו של ריק, ואנחנו לא צריכים מבט ימינה ואם אנחנו בעמודה הימנית ביותר. לכן, אם אף אחד מהדברים האלה היו נכונים, זה אומר שהאריח לא היה צמוד לריק ואנחנו יכולים לחזור שווא. המעבר לא היה בתוקף. אבל, אם אחד מאותם היו נכונים, אז ב שלב זה, אנחנו יודעים את זה וtile_i tile_j שווה עמדתו של האריח. וכך, אנו יכולים לעדכן את הלוח ב tile_i עמדות וtile_j. אנחנו יודעים את הערך החדש יהיה ריק ושblank_i העמדה blank_j, שהיה מקורי ריק - אנחנו יודעים את האריח הולך לעבור לשם. שים לב שאנחנו באמת לא צריכים לעשות החלפה אמיתית כאן, מאחר שאנו יודעים ערכים שצריכים להיות מוכנסים לעמדות אלה. אנחנו לא צריכים זמניים משתנה מסביב. לבסוף, אנו צריכים לזכור שאנו כי יש המשתנים הגלובליים שלנו, כי הם מעקב אחר המיקום מריק. אז אנחנו רוצים לעדכן את המיקום של הריק כדי להיות איפה האריח היה במקור. לבסוף, אנו החזר אמיתי מאז המהלך היה מוצלח. אנחנו בהצלחה להחליף את ריק עם האריח. כל מה שאנחנו צודקים, אז שעבר צריך לבדוק וון. אז, ניצח באופן דומה מחזיר bool בי נכון הוא הולך להצביע על כך ש משתמש ניצח את המשחק. ושקר הוא המציין כי המשחק עדיין נמשך. המשתמש לא ניצח. אז, זה הולך להיות פחות או יותר ההפך מinit, שבו init, זוכר, לאתחל את הלוח ל15, 14, 13, 12, כן הלאה. אילו ניצח, אנחנו רוצים לבדוק אם לוח הוא 1, 2, 3, 4, 5, וכן הלאה. אז, אנחנו הולכים לאתחלנו בניגוד ל1 מאז שזה מה שהחלק העליון שמאלי של הלוח צריך להיות. ואז אנחנו הולכים ללולאה בכל המערכת. בואו נתעלם מצב זה לשנייה אחת. ואת המצב הזה רק הולך סימון הוא הלוח בעמדה זו שווה לספירה הנוכחית? אם כן, להגדיל את הספירה כך ש התפקיד הבא אנחנו מסתכלים הוא אחד גבוה יותר מהעמדה שאנו נמצאים ברגע זה. אז ככה אנחנו מקבלים את שמאלי עליון צריך להיות 1. להגדיל את הספירה ל -2. תסתכל על התפקיד הבא. האם זה 2? אם כן, להגדיל את הספירה ל -3. עמדה בשלב הבאה, היא 3 הזה? אם כן, להגדיל את הספירה עד 4, וכן הלאה. לכן, אם יש כל עמדה על לוח שאינו שווה הספירה שלנו, אז אנחנו רוצים לחזור שווא מאז ש אומר שיש כמה אריחים שהם לא במיקום הנכון. אז הנה, מה עושה במצב זה? ובכן, זוכר שהריק הוא אמור ללכת בצד הימין למטה. ואולי לא הערך של ריק בהכרח שווה הערך של נגד כי הוא הולך להגיע בפינה הימנית התחתונה. אז אנחנו רוצים במיוחד כדי לבדוק אם אני שווה שווה ד מינוס 1 וי שווים שווה ד מינוס 1 - וזה אומר אם אנחנו מחפשים בפינה הימנית התחתונה של הלוח - אז אנחנו פשוט רוצה להמשיך. אנחנו רוצים לדלג על זה בפרט איטרציה של הלולאה for. וכך, אם תצליח לעבור את זה מקוננות עבור לולאה, זה אומר ש לא היו אריחים שהיו ב העמדה שגויה. ואנו לפרוץ את הלולאה ובאו כאן, שבו אנחנו יכולים לחזור נכון. כל האריחים היו בעמדות הנכונות וזה אומר שיש למשתמש ניצח את המשחק. וזהו זה. שמי רוב אודן, וזה היה 15.