if(desire_to_program > 10)
לְהַמשִׁיך;
אַחֵר
לַחֲזוֹר;
כשאני אומר לאנשים שאני מתכנת, אני מקבל את המבט הזה. העיניים המזוגגות, החיוך המנומס, הרצון הברור לשנות נושא. אם יתמזל מזלי, אקבל רעיון לאפליקציית הנייד הרוצחת הבאה ששותף לשיחה שלי מתעקש שתעשה אותנו עשירים; אם יהיה לי פחות מזל, אני אסתכסך לספק תמיכה טכנית בחינם לשארית חיי. העניין הוא, עד כמה שזה נשמע בלתי אפשרי, תכנות יכול להיות מהנה יותר ממה שאנשים מבינים. כיף מספיק כדי להצדיק ז'אנר משחק וידאו משלו, אפילו.
אבל עד כמה המשחקים האלה חינוכיים? האם באמת אפשר להפוך למתכנת על ידי משחק? חפרתי ב-Steam ויצאתי עם שלושה מועמדים מבטיחים. בואו נסתכל עליהם, ונראה אם הם באמת יכולים ללמד אותך כישורים לשלם את החשבונות.
ברור שמעט משחקים ילמדו אותך איך לכתוב קוד C#, אבל משחקי התכנות האלה מתרגמים אתמושגיםשל תכנות למטאפורות חזותיות וחידות בר השגה. לכן אנחנו הולכים לסקור כל משחק במונחים של מושגי התכנות שהוא מציג ועד כמה הוא מלמד את המושגים האלה בצורה שתמשיך אם תתחיל ללמוד שפת תכנות מאוחר יותר. אנחנו גם נעבור על המשחקים האלה בסדר עולה של מורכבות מושגית, כך שהם עשויים להוות קורס שלם לקראת תכנות.
צריך גם להדגיש, לפני שנתחיל, שאף אחד מהמשחקים האלה לא טוען שהם ילמדו אותך לקוד; אנחנו רק חושבים שהם עשויים. הָלְאָה!
מכונת משאבי אנוש
קוֹשִׁי:מתחיל - בינוני
מכונת משאבי אנושהכל על עיבוד נתונים. מסוע המסומן 'IN' מספק אריחים שעליהם מודפסים מספרים ואותיות, ותפקידך לשלוח את הנכונים - לפי הגדרת כל חידה - למסוע המסומן 'OUT'. לשם כך, אתה מרכיב רשימה של פקודות שהעובד הלהוט שלך יוכל לבצע - תוכנית בעצם. מכיוון שהאריחים המתגלגלים הם באקראי, התוכנית שלך צריכה לתת את הדעת על כל השילובים האפשריים של מספרים ואותיות. זו דאגה שכל המתכנתים מכירים מקרוב.
HRM עושה עבודה מצוינת בהחדרת מושגים בצורה נגישה, ונותנת לך זמן להכיר כל פקודה חדשה לפני שתעבור לפקודה הבאה. אפילו טוב יותר, אתה יכול להאט את הזמן בזמן שהעובד שלך מבצע את התוכנית שלך, עובר דרך כל פקודה כדי שתוכל לראות בדיוק היכן ומדוע היא לא עובדת כפי שציפית. בהתחשב בכמה זמן שמתכנת מבלה בניפוי באגים, התרגל לפירוק תוכנית שורה אחר שורה הוא שימושי להפליא.
עם זאת, נגישות היא רק חלק ממשוואת התכנות. השאלה הקריטית היא: האם משחק HRM יכול ללמד אותך כיצד לתכנת? כדי לענות על זה, בואו נחפור קצת יותר לעומק המושגים המניעים את החידות של HRM.
מוּשָׂג:משתנים בסיסיים
מה הם?
התמודדות עם נתונים לא ידועים, בין אם זה מסוע של מספרים ואותיות אקראיים או פקודות מקלדת במהירות האור שלStarCraftpro, הוא מרכיב בסיסי כמעט בכל תוכנית שנכתבה אי פעם. מכיוון שתוכניות אינן יכולות לחזות את העתיד - עדיין, בכל מקרה - הן זקוקות למציין מיקום גנרי לאחסון והתייחסות לנתונים לא ידועים במהלך ביצוען. כאן נכנסים משתנים. משתנה הוא בעצם מיכל מסומן עבור נתונים שניתן לרוקן ולמלא מחדש לפי הצורך.
איך מלמדים אותו?
ב-HRM, אריחי הרצפה משמשים כתחליף למשתנים. במרכז כל חדר פאזלים, הרצפה מחולקת לרשת ממוספרת שבה ניתן לאחסן זמנית את המספרים והאותיות הנכנסות על המסוע. ברשימת הפקודות שלך, אתה מתייחס לאריחים האלה לפי התוויות המספריות שלהם - החל מ-0, כי בתכנות הספירה מתחילה תמיד ב-0, לא 1. לחלופין, אתה יכול לתת להם תוויות משלך כמו 'FirstAdder' או 'Tally' כדי לעזור להפוך את התוכנית שלך לקלה יותר להבנה. זוהי טכניקה חיונית בתכנות, במיוחד אם מספר אנשים עובדים על אותו קוד. משתנים בעלי שם טוב יכולים להוות את ההבדל בין אבחון מיידית של התוכנית הפגומה שלך, לבין לבזבז שעות רק בניסיון להיזכר מה לעזאזל הקוד שלך עושה.
מוּשָׂג:מערכים
מה הם?
כאשר משתנים משמשים להתייחסות לערך בודד או אובייקט, מערכים משמשים כאשר אתה צריך לקבץ חבורה שלמה של אובייקטים דומים יחד. במקום להזדקק למשתנה נפרד עבור כל משבצת במלאי של שחקן, למשל, למשחק עשוי להיות מערך 'מלאי' יחיד שבתוכו מאוחסנים כל פריטי המלאי. היתרון בגישה זו הוא שניתן להתייחס לפריטים הללו ביחס לאובייקט 'מלאי' כך: מלאי
, מלאי
, מלאי
... זה מקל מאוד על כתיבת קוד שבודק את כל המשבצות במלאי של שחקן, ומבחינת ביצועים גולמיים, מערכים הם הרבה יותר מהירים ממשתנים בודדים.איך מלמדים אותו?
HRM לא מושך אגרופים עם הטמעת מערכים. במקום להפנות את אריחי הרצפה ישירות דרך התוויות שלהם, אתה יכול להשתמש בערך בתוך אריח אחד בתור התווית שמצביעה על אחר. לדוגמה, אריח '0' עשוי להכיל בתוכו את המספר 7. אם אתה משתמש בפקודה הסטנדרטית copyfrom '0' עליו, תקבל את ה-7 בחזרה. אם במקום זאת אתה משתמש ב-copy from
הפקודה, התוכנית תשתמש ב-7 כתווית נוספת ותחזיר את הערך בתוך Tile 7. אל תדאג יותר מדי אם זה נשמע קצת מבלבל; אתה באמת צריך לראות מערכים בפעולה כדי להבין איך הם עובדים. חשוב לציין, HRM מאפשר לך לעשות זאת עם מספר חידות בקצב טוב.
מוּשָׂג:
הצהרות מותנות (הידוע גם בהצהרות IF...THEN)
מה הם?תוכנית לא הייתה תועלת הרבה אם היא תפיק את אותו פלט בדיוק בכל פעם, ללא קשר לנתונים שהזנת לתוכה. זה יהיה כמו משחק שממש שיחק את עצמו, מתעלם מכל הקלטות של השחקנים וחוזר שוב ושוב את אותה הרצה. תוכניות צריכות לקבל החלטות, בין אם הן פשוטות כמו להחליט איזה משני מספרים הוא גדול יותר, או לקבוע אם בורג הקשת של שחקן יפגע במטרה שלו או לא. הצהרות מותנות הן המוח האמיתי של תוכנית, המקבילה המלאכותית של הניאוקורטקס שלנו.
איך מלמדים אותו?
כדי לשמור על פשטות, HRM כולל רק שני סוגים של הצהרות מותנות: קפיצה אם אפס, וקפיצה אם שלילית. פקודות אלה בודקות את הערך בידי העובד שלך ו'קופצות' לחלק אחר של התוכנית שלך אם התנאי נכון. אם העובד שלך מחזיק -5, הפקודה jump-if-negative תפתר כאמת ותעקוב אחר חץ הקפיצה לחלק של התוכנית שאליו הצבעת. אם העובד שלך מחזיק במקום 1, התוכנית תמשיך כרגיל אל הפקודה הבאה בתור. זה אולי נראה די פשוט, אבל פאזלים מאוחרים יותר דורשים חבורה של פקודות קפיצה אם כולן פועלות יחד, חיצי הקפיצה שלהן משתלבים כמו משחק כדורגל שהגה השטן עצמו.
מוּשָׂג:
איטרציה (המכונה גם לולאה)
מה זה?
איך מלמדים אותו?החזרה היא הלחם והחמאה של המחשוב. אנחנו כותבים תוכניות לאוטומציה של המשימות שאין לנו זמן לעשות בעצמנו, ולשם כך אנחנו משתמשים בלופים. לולאות עדר NPCs קדימה ואחורה לאורך אותו נתיב סיור. לולאות פוגעות באויבים עם נזק בוער בכל שנייה שהם בוערים. לולאות מונעות מכונית להאיץ עד שהיא מגיעה למהירותה המרבית. קידוד ידני של כל איטרציה של תהליכים אלה יהיה מאוד לא יעיל, וכשזה מגיע לתכנות, חוסר יעילות הוא חטא.HRM משלב את ההצהרות המותנות שהוזכרו לעיל עם פקודת הקפיצה הסטנדרטית כדי להעביר את היסודות של לולאה. ישנם שני סוגים עיקריים של לולאות, לולאות ו-while, ו-HRM מלמד את שניהם. עבור לולאות, המבצעות קבוצה של פקודות מספר קבוע מראש של פעמים, מיושמות באמצעות אריחי רצפה אחת כמונה שמתקתק מטה עד שהוא עומד בבדיקת הקפיצה אם אפס ו'פורץ' מהלולאה. בעוד לולאות פועלות באותה צורה, למעט לולאה מספר קבוע של פעמים, הן חוזרות על עצמן כל עוד תנאי מסוים נכון. ככל שהפאזלים נעשים קשים יותר, עליך לשלב את שני סוגי הלולאות עם אריחי המערך כדי לעבד רשימות של נתונים באורך לא ידוע. זוהי אבן יסוד נוספת בתכנות בסיסי, ו-HRM עושה עבודה טובה בלבנות אותך בהדרגה.
פְּסַק דִין:
מכונת משאבי אנוש
על ידי מסגור עצמי במושגים מוכרים כמו מסוע ואריחי רצפה, ועל ידי הצעת רק רשימה קטנה של פקודות לעבוד איתן,משמש כמבוא מוצק לעקרונות הליבה של התכנות. פקודות מקודדות צבע וחיצי קפיצה מועילים מהדהדים את שפת תרשימי הזרימה, מה שמקל על מעקב אחר מה שתוכנית עושה בזמן שהיא מבצעת. הטרמינולוגיה המותאמת אישית כמו העתקה ו-bump אולי לא תתרגם 1:1 לשפות תכנות מודרניות, אבל המושגים שהם מלמדים זהים. לאחר כיבוש HRM, תהיו מצוידים היטב להתחיל ללמוד כיצד לקודד באמת.
Hack'n'Slashבעמוד השני, אנו מסתכלים על Hack 'n' Slash של Double Fine.קוֹשִׁי:
בינוני - מתקדם
Hack'n'Slashאולי, עם זאת, אתה רוצה להתכונן עוד קצת לפני שאתה צולל לעולם התכנות. זה המקום שבו
נכנס לפעולה. במבט ראשון, זה נראה כמו משחק הרפתקאות אקשן טיפוסי בסגנון זלדה, אבל במקום לחתוך אויבים אתה 'פורץ' אותם, באמצעות מקל ה-USB החרב שלך כדי לתכנת מחדש את ההתנהגות שלהם. כמעט את כל האובייקטים בעולם ניתן לתכנת מחדש בדרך זו, עד לנקודה שבה אתה יכול למעשה לגרום למשחק לקרוס על ידי שכתוב הקוד שלו. זה גם לטובת המשחק וגם לרעתו; מצד אחד, יש לך כמות מדהימה של חופש לגשת לכל חידה, אבל יחד עם זאת, זה יכול להיות נורא מאיים אם אתה לא מבין למה הפתרון שלך פשוט לא עבד. עם זאת, למען ההגינות, זה פחות או יותר תכנות בקצרה.
הבעיה העיקרית עם Hack 'n' Slash היא שלמעשה מדובר בשני משחקים שונים, האחד הוא הפאזל בסגנון זלדה שחוקר מושגים כמו משתנים ושגרות לעומק יותר מאשר Human Resource Machine, והשני הוא מאפר קוד מלא מכניס אותך לקוד גולמי בלי שום קרש לצוף עליו. הקושי הזה הופך את Hack 'n Slash למשחק קשה לשחק, אבל אם אתה יכול לעבור את זה, יש הרבה דברים טובים ללמוד.
מוּשָׂג:
משתנים מתקדמים
מה הם?
כפי שהוזכר קודם לכן, משתנים הם דרכים לאחסון והתייחסות לנתונים בתוכנית. ב-Hack 'n' Slash, הם משמשים לאחסון הרבה יותר מהאותיות והמספרים הבודדים של Human Resource Machine, ותפקידם בהגדרת התנהגות של תוכנית ברור הרבה יותר.איך מלמדים אותם?
Hack 'n' Slash מפתח את הרעיון של משתנים על ידי הצגת מה שידוע בתור משתנים 'מוקלדים'. אלו משתנים שיכולים להחזיק רק סוג מסוים של ערך, למשל רק מספרים, או רק את הערכים 'true' או 'false'. כאשר אתה פורץ לאויב, צצה רשימה של משתנים שאתה יכול להתעסק איתם, אבל אתה יכול לשנות רק את הערכים שלהם לפי סוג שלהם: אי אפשר לאחסן אותיות במשתנה מספר, ואי אפשר להגדיל מספר מעבר הגבולות המוגדרים שלו. הודות לכללים הבלתי כתובים הללו, אתה לומד בהדרגה את ההבדל בין בוליאנים, מספרים שלמים ומחרוזות, גם אם אינך מכיר אותם בשמם.
עיקר השיעור של Hack 'n' Slash במשתנים, לעומת זאת, הוא לראות כיצד הערכים שלהם מכתיבים את התנהגות התוכנית. ניסוי וטעייה בדרכך בטווח הערכים של משתנה הוא תרגול מנטלי טוב עבור כל מתכנת, במיוחד בעת בדיקה ואיתור באגים. תוכנית צריכה להיות מסוגלת לטפל בכל הנתונים האפשריים שנזרקים עליה, גם אם זה אומר לזרוק את הנתונים שיגרום לה להתנהג בצורה מופרכת. ההבנה עד כמה קל לשבור את האויבים של Hack 'n' Slash על ידי הגדרת משתנה Damage שלהם ל-1 משמשת כלקח שלא יסולא בפז בחשיבות של בדיקה נכונה.
מוּשָׂג:
תַחבִּיר
מה זה?
בדיוק כמו השפות שבהן אנו משתמשים כדי לתקשר זו עם זו, לשפות התכנות יש כללים לאופן שבו המילים שלהן מתחברות יחד ליצירת משפטים. דקדוק זה ידוע בתור תחביר, ולמרות שהוא יכול להיות ייחודי לכל שפה, רוב שפות התכנות המודרניות עוקבות אחר המוסכמות שקבע C לפני כארבעה עשורים.איך מלמדים אותו?
Hack 'n' Slash מציג את מושג התחביר בחציו השני, כאשר הוא עובר את ההתעסקות עם משתנים ומעמת אותך עם קוד עירום. בהתבסס על שפת התכנות Lua, הקוד לוקח מספר חירויות עם התחביר שלו, ככל הנראה במאמץ להקל על הבנתו. אולם בפועל, המינוח המורכב מחליף רק טעם אחד של בלבול באחר, ומגביל את הישימות שלו בעולם האמיתי בתהליך. למרבה המזל, האלמנטים התחביריים הנפוצים ביותר נשארים שלמים, ומכירים אותך עם המבנה הכללי של הקוד המודרני.
כללים דקדוקיים כאלה כוללים את תחביר הנקודה המשמש במונחים כמו Port.Value, המתייחס למשתנה Value של אובייקט שנקרא Port, ואת המבנה של if... then הצהרות לקבלת החלטות. כדי לעזור לך לפענח את הכללים המבלבלים האלה, ה-Hack 'n' Slash מכניס אותך לגרסה חזותית של הקוד, שבה משתנים מיוצגים כגבישים מקודדי צבע שמוזנים למכונות שמעבדות אותם לפעולות. קווים צבעוניים עוקבים אחר זרימת התוכנית בין מכונות, למרות שהמכונות מוערמות כל כך קרוב זו לזו שלעתים קרובות קשה לעקוב אחר סדר הפעולות.
מוּשָׂג:
פונקציות/שיטות
מה הם?
יש פתגם ישן בתכנות ש-90% מזמן הביצוע של תוכנית מושקעת בהפעלת 10% מהקוד שלה. במילים אחרות, תוכניות מקדישות זמן רב לחזרה על אותן פעולות. כדי לנצל זאת, אנו מחלקים את הקוד הנפוץ ביותר לפונקציות בדידות, ובכל פעם שהתוכנית צריכה להריץ את הקוד הזה, אנחנו פשוט קוראים לפונקציה עם פקודה כמו funFunction(). זה חוסך מאיתנו לכתוב מחדש את אותו קוד מספר פעמים במהלך התוכנית, וחשוב מכך, זה אומר שאנחנו צריכים לשנות רק גוש אחד של קוד אם פונקציה שנמצאת בשימוש תכוף זקוקה לשינוי.
איך מלמדים אותו?
בצורת המכונות הגדולות ביותר בגרסה המדומיינת של הקוד, ניתן לפרוץ לפונקציות עצמן בדיוק כמו אויבים וחפצים אחרים, מה שיוצר תרחיש דמוי התחלה של צלילה לתוך הקוד בתוך הקוד. שינויים שיבוצעו בקוד של פונקציה יתפשטו בכל המשחק, ועלולים להוביל לתוצאות בלתי צפויות בהמשך הדרך. זוהי סכנה שכיחה מדי בתכנות, במיוחד בפרויקטים גדולים יותר, ולמידת היזהר מההשפעות הגדולות יותר של אפילו שינויים קטנים היא רק תרגול תכנות טוב.
פְּסַק דִין:כמשחק, ל-Hack 'n' Slash יש הרבה בעיות. בתור הדרכה לתכנות, זה טוב יותר באופן ניכר. על ידי הדגשת ההשפעה של כוונון משתנים, והצגה של פונקציות כמכונות פיזיות, היא מכסה מושגים שלא יסולא בפז לכל המתכנתים השואפים. כל עוד אתה מוכן ללמוד בדרך הקשה עד כמה ניסוי, שגיאה ותסכול הולך בקידוד, אתה יכול לצאת עם אחיזה איתנה במערכות ובתהליכים העומדים בבסיס כל השפות של העידן המודרני.
TIS-100בעמוד שלוש, העולם המפחיד של שפת ההרכבה ב-TIS-100.קוֹשִׁי:
מתקדם+
TIS-100הדבר הראשון שאתה שומע כשאתה מתחיל
הוא מגף קר של CRT ישן. אם זה מעורר או לא ייסורי נוסטלגיה זה מבחן לקמוס טוב לאופן שבו תרגישו לגבי המהדר בשפת ההרכבה המחופש למשחק. אל תטעו: TIS-100 מיועד למתכנתים הנלהבים ביותר בלבד. אם אינכם מכירים כבר הצהרות מותנות ואיטרציה וכדומה, תעמוד לפניכם עקומת למידה מפותלת. אפילו אם (have_exp == true), TIS-100 הוא בקושי עוגה.
שפת אסמבלי, למי שלא מכיר, היא סוג של שפת תכנות שהייתה נפוצה בשנות ה-50 וה-60, לפני שהוחלפה על ידי שפות ברמה גבוהה יותר כמו C בשנות ה-70 ואילך. הוראות שפת ההרכבה מבוססות בדרך כלל על קוד המכונה שבו משתמש מחשב כדי לדבר עם עצמו, וככאלה הן קשות משמעותית לקריאה ולכתיבה בהשוואה לאלה כמו Java ו-C#. ובכל זאת, למרות הרגישויות הארכאיות שלו, TIS-100 מתמודד עם מספר מושגים שנשארו רלוונטיים עד היום.
מוּשָׂג:
תִקשׁוֹרֶת
מה זה?תקשורת היא מרכיב חיוני בתכנות מודרני. מ-Leaderboards מקוונים ועד FPS מרובי משתתפים ועד MMO, משחקים מסתמכים יותר ויותר בימינו על דיבור אחד עם השני כדי להקל על הכיף שלהם. הבעיה היא שבעצם זה בלתי אפשרי שתוכנית אחת תדע מה אחרת עושה בכל רגע נתון, ולכן ניהול התקשורת הופך להיות מסובך. תחשוב על זה כמו שני אנשים שמנהלים שיחה ובו בזמן מתעסקים בטלפונים שלהם. אם תשומת הלב של אדם אחד ממוקדת בטלפון שלו, ייתכן שהוא לא ישמע את מה שהאדם השני אומר. כדי לתקן זאת, תוכניות מתקשרות באמצעות יציאות ושקעים, שהם בעצם תיבות דואר המנוהלות על ידי מערכת ההפעלה. תוכנית יכולה לשלוח את הנתונים שלה ואז להתעסק בעניינים שלה, בעוד שהאחריות לבדיקת הודעות חדשות מוטלת על הנמען.
איך מלמדים אותו?
תוכניות ב-TIS-100 מחולקות לצמתים, שכל אחד מהם יכול לבצע רק מספר מוגבל של הוראות. כדי להשיג את המטרות שנקבעו עבורך נדרש הרבה מאוד שיתוף נתונים בין צמתים. גרוע מכך, כל צומת יכול לדבר רק עם אלה שסמוכים לו, מה שמסבך את העניינים עוד יותר. יצירת פתרון עובד מחייבת אותך לחשוב על כל צומת כתוכנית נפרדת, המוכרת רק לפעולות שלו. לגרום לכולם לשתף פעולה פירושה הקמת פרוטוקול תקשורת, בדיוק כפי שמתכנת רשת חייב לעשות. אתה מגלה מהר מאוד שלשכנע תוכניות שונות לשחק יפה ביחד זה קשה יותר ממה שזה נראה.
מוּשָׂג:
המחסנית
מה זה?
ככל שהתוכניות שאתה כותב עולות במורכבות, העברת נתונים בין צמתים שיכולים לאחסן רק שני דברים בו-זמנית הופכת למשחק של לחישות סיניות, כשהסבירות לטעות רק הולכת וגדלה. ההקדמה של צמתי מחסנית עם דלי הנתונים הבלתי מוגבלים שלהם נותנת לך את האמצעים להתמודד עם סטים גדולים בהרבה של נתונים, אם כי הקיבולת הנוספת אינה ניתנת בחינם. אתה צריך לשקול בעיות כמו מבוי סתום, שבו צומת אחד ממתין למילוי מחדש של מחסנית ריקה, אבל הצומת שימלא אותו מחדש ממתין בתורו למשהו מהצומת המקורי - קיפאון! ואז יש את הבעיה של אחסון מערכי נתונים מרובים על מחסנית אחת מבלי לערבב את כולם. שקלול הפשרות של שימוש בצמתי מחסנית לעומת ניהול נתונים ידני הוא סוג השיקולים שמתכנתים עושים על בסיס קבוע.כמו מערכים, המחסנית היא מיכל לקיבוץ נתונים קשורים. המחסנית, עם זאת, מתאימה יותר לסביבות נתונים משותפים שבהן תוכניות שונות, או חלקים שונים של תוכנית, צריכות לגשת לאותם נתונים מבלי לתקשר ישירות אחד עם השני. כפי שהשם מרמז, המחסנית מאחסנת נתונים ברשימה אנכית, תוך הקפדה על פרוטוקול Last In, First Out (LIFO): כאשר פריט חדש מתווסף, הוא עובר לראש הרשימה, וכאשר פריט מוסר, זה נלקח מראש הרשימה. תחשוב על זה כמו ערימה של צלחות במסעדת מזנון, שבה הלקוחות לוקחים מלמעלה, בעוד מנות נקיות מונחות גם למעלה. או כפתור 'הקודם' של דפדפן אינטרנט והתיעוד שלו של היסטוריית הדפים האחרונה שלך.פְּסַק דִין:איך מלמדים אותו?שכבות על תפריטים
תכנות מרובה ליבות
למרות ש-TIS-100 נראה כמו שריד מהעבר, הוא בשום אופן לא מיושן. מִן
אֶל