חלק VI: סימולציה • סעיף 16.1 הכללת חידת 8 המלכות ללוח דו-ממדי כללי

16.1 לוח שחמט בגודל N × N: חידת המלכות הכללית

איך אנחנו מרחיבים את פתרון חידת 8 המלכות בשני כיוונים (לוח דו-ממדי כללי N×N ולוח תלת-ממדי N×N×N), מהי ההגדרה המדויקת של חידת המלכות הכללית, ואיפה מסתתרים הערכים הקשיחים (Hard-coded) של הספרה 8 שעלינו להחליף בפרמטר.

♟️
🧠

מודל מנטלי ועיקרון מנחה: משחררים את הקוד מכבלי הקבוע הקשיח 8 אל פרמטר גמיש N

💡 האנלוגיה המוחשית

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

⚖️ חוק הברזל הפדגוגי

הגדרה 16.1 (חידת המלכות הכללית): יש להציב N מלכות על גבי לוח שחמט בגודל N × N, כך שאף מלכה אינה מאיימת על אף מלכה אחרת (אין שתי מלכות באותה שורה, באותה עמודה או באותו אלכסון).

🎯 תובנת המפתח

כדי להכליל את הפתרון לכל N, עלינו לאתר את שתי הנקודות שבהן קובע המספר 8 באופן קשיח (Hard-coded): לולאת יצירת המלכות ב-Board>>initialize ובדיקת גבול הלוח ב-Queen>>advance.

1. שני כיווני ההרחבה שלנו בפרק 16 והגדרת חידת המלכות הכללית

מעבר מלוח קבוע של 8×8 אל לוח דו-ממדי כללי N×N ואל לוח מרחבי תלת-ממדי N×N×N

שלום לך! אחרי שבפרק 15 בנינו יחד את הפתרון המבוזר והאלגנטי לחידת 8 המלכות (באמצעות שרשרת של מלכות ששולחות הודעות זו לזו ומבצעות חיפוש עם נסיגה – Backtracking), בפרק 16 אנחנו לוקחים את הפתרון הזה ומרחיבים אותו בשני כיוונים מרתקים:

  • כיוון ראשון (סעיף 16.1): הכללה ללוח דו-ממדי כללי בגודל N × N.
  • כיוון שני (סעיף 16.2): הכללה ללוח שחמט תלת-ממדי (מרחבי) בגודל N × N × N.

נתחיל בכיוון הראשון שלנו. ההכללה של חידת 8 המלכות ללוח דו-ממדי כללי מנוסחת כך:

📌 הגדרה 16.1 · חידת המלכות הכללית N Queens on N × N Board

הצב N מלכות על לוח שחמט N × N כך שאף מלכה אינה מאיימת על מלכה אחרת.

🔍 במילים אחרות – פירוק ההגדרה לתנאים גיאומטריים על הלוח:

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

↔️ באותה שורה (Row)
↕️ באותה עמודה (Column)
⤡ באותו אלכסון (Diagonal)

2. האתגר התכנותי בהכללה: איפה קובע המספר 8 באופן קשיח (Hard-coded)?

איתור שתי נקודות הקיבוע בפתרון של פרק 15 ב-Board>>initialize וב-Queen>>advance

כשאנחנו חוזרים אל הקוד שכתבנו בפרק 15 עבור 8 מלכות ושואלים את עצמנו: "מה בעצם מונע מהקוד שלנו לפתור לוח בגודל 5×5 או 10×10?", אנחנו מגלים שבפתרון של פרק 15 קובעו ערכים קשיחים (Hard-coded) של הספרה 8 בשני מקומות קריטיים:

מוקד קשיח 1 · יצירת שרשרת המלכות

בלולאת יצירת המלכות ב-Board>>initialize

הלוח יצר תמיד בדיוק 8 מלכות באמצעות הלולאה הקשיחה (1 to: 8) do: [...].

Board >> initialize
    lastQueen := QueenTerminator new.
    (1 to: 8) do: [:i |
        lastQueen := Queen new setColumn: i neighbor: lastQueen]
מוקד קשיח 2 · בדיקת קצה הלוח

בבדיקת גבול הלוח ב-Queen>>advance

כל מלכה בדקה האם הגיעה לשורה האחרונה באמצעות התנאי הקשיח row = 8 ifTrue: [...].

Queen >> advance
    row = 8 ifTrue: [
        neighbor nextSolution ifFalse: [^ false].
        row := 0].
    row := row + 1.
    ^ true

לכן, כדי להכליל את הפתרון לכל N, יש לאפשר ללוח לקבל את גודלו כפרמטר, ולהבטיח שכל מלכה על הלוח תדע מהו גבול השורות של הלוח שבו היא נמצאת!

✍️ תרגיל 16.1

משימת מימוש בעקבות ההגדרה:

ממשו פתרון בסמולטוק (Smalltalk) לחידת N המלכות.

עזר גרפי 16.1 • תחומי האיום של מלכה ומעבר מקבוע 8 לפרמטר N

איום בשורה, בעמודה ובשני האלכסונים על לוח N × N והסרת הקבוע הקשיח 8

הגדרה 16.1 · N × N
♛ תחומי האיום: שורה, עמודה ואלכסונים ❌ בפתרון פרק 15 – קיבוע קשיח (Hard-coded) של הספרה 8: 1. Board>>initialize: (1 to: 8) do: [:i | ...] 2. Queen>>advance: row = 8 ifTrue: [...] ✅ בהכללה בפרק 16 – גודל הלוח N מתקבל כפרמטר: • הלוח מקבל את גודלו N בעת האתחול ויוצר שרשרת של N מלכות • כל מלכה בודקת את גבול השורה מול גודל הלוח N שלה (ולא מול 8!)
🔍

מיני-סימולציה 16.1: סייר ההכללה ל-N × N ותחומי האיום של מלכה

לחץ על כל היבט כדי לבחון את משמעותו בקוד
♛
סימולציה אינטראקטיבית גדולה 16.1

ארגז החול של N המלכות: התאמת גודל הלוח N × N, הצבת מלכות וזיהוי קווי איום

בחר את גודל הלוח N (מ-1 ועד 8), לחץ על משבצות בלוח כדי להציב או להסיר מלכות, או לחץ על "מצא פתרון אוטומטי (solve)". המערכת תצבע באדום עדין את כל תחומי האיום (שורה, עמודה ואלכסונים) ותתריע מיד אם שתי מלכות מאיימות זו על זו לפי הגדרה 16.1!

גודל הלוח הפעיל: 5 × 5 (N = 5) מלכות: 0 / 5
"Smalltalk Generalized Code:"
board := Board new initialize: 5.
board solve.
⚡

הגשר הנרטיבי: רגע, איך שומרים את הפרמטר N כך שגם הלוח וגם כל המלכות יכירו אותו?

ראינו שגם המחלקה Board (בלולאת האתחול) וגם המחלקה Queen (במתודה advance) זקוקות למספר N. סטודנטים רבים מתפתים לפתרון שנראה קצר ונוח במבט ראשון: להגדיר את N כמשתנה מחלקה (classVariableNames: 'N') ב-Board ולחשוף אותו דרך מתודת המחלקה Board N! מה קורה כשמריצים את ההצעה הזו על שני לוחות במקביל ב-Workspace? בלשונית הבאה ננתח יחד את מלכודת הבחינה הקלאסית הזו!

סוף יחידה 16.1 א' • לוח שחמט בגודל N × N
חלק VI: סימולציה • סעיף 16.1 (מקרה בוחן) מלכודת משתנה המחלקה מול משתני מופע

מקרה בוחן ושאלת בחינה מרכזית: מלכודת משתנה המחלקה N בהכללת הלוח

מה מתרחש כאשר מגדירים את גודל הלוח N כמשתנה מחלקה משותף (classVariableNames: 'N'), מדוע הרצת board1 solve על לוח בגודל 5×5 מדפיסה פתאום No solution.!, וכיצד מתכננים את הפתרון התקני מונחה העצמים.

⚠️
🧠

מודל מנטלי ועיקרון מנחה: תכונה שמשתנה ממופע למופע אסור שתישמר כמשתנה מחלקה משותף!

💡 האנלוגיה המוחשית

להגדיר את גודל הלוח N כמשתנה מחלקה זה כמו לתלות שלט אחד ויחיד בכניסה לבניין שכתוב עליו "מספר החדרים בכל דירה". ברגע שדייר בדירה של חדר אחד מעדכן את השלט ל-1, גם דירת ה-5 חדרים בטוחה שיש לה רק חדר אחד!

⚖️ חוק הברזל הפדגוגי

משתנה מחלקה (classVariableNames) הוא עותק יחיד המשותף לכל המופעים של אותה המחלקה! כל אתחול של לוח חדש דורס את הערך של הלוחות הקודמים שנוצרו לפניו.

🎯 תובנת המפתח

כדי לאפשר קיומם של מספר לוחות בגדלים שונים בו-זמנית, חל איסור להשתמש במשתנה מחלקה: יש להגדיר את boardSize (או n) כמשתנה מופע ולהעבירו לכל מלכה כמשתנה מופע פרטי משלה (או כקישור למופע הלוח שלה).

1. ההצעה המפתה להכללת הלוח ל-N × N באמצעות משתנה מחלקה

בחינת הקוד המוצע שבו N מוגדר ב-classVariableNames של המחלקה Board

בוא נבחן יחד הצעה נפוצה מאוד להכללת בעיית המלכות ללוח בגודל N × N. מי שכתב את ההצעה הזו אמר לעצמו: "כדי שלא אצטרך לשנות את חתימת האתחול של כל מלכה ולהעביר לה את גודל הלוח, אשמור את N כמשתנה מחלקה ב-Board, ואכתוב מתודת מחלקה Board class >> N שכל מלכה תוכל לקרוא לה מתוך advance!"

הנה הקוד המוצע במלואו — קרא אותו בעיון:

⚠️ הקוד המוצע לבחינה (שימוש במשתנה מחלקה N):
Object subclass: #Board
    instanceVariableNames: 'lastQueen'
    classVariableNames: 'N'
    poolDictionaries: ''
    category: 'OOD-NQueens'

Board >> initialize: queensNum
    N := queensNum.
    lastQueen := QueenTerminator new.
    (1 to: N) do: [:i |
        lastQueen := Queen new setColumn: i neighbor: lastQueen]

Board class >> N
    ^ N

Queen >> advance
    row = Board N
        ifTrue: [
            neighbor nextSolution ifFalse: [^ false].
            row := 0].
    row := row + 1.
    ^ true

2. ניתוח הכשל והתוצאה המפתיעה בחלון ה-Workspace

למה לוח בגודל 5×5 (שיש לו 10 פתרונות חוקיים!) מחזיר פתאום No solution.!?

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

הקוד המורץ בחלון ה-Workspace:
board1 := Board new.
board2 := Board new.
board1 initialize: 5.
board2 initialize: 1.
board1 solve.
הפלט המתקבל בחלון ה-Transcript:
No solution.!

למרות שללוח בגודל 5×5 יש פתרונות חוקיים רבים, המערכת מדפיסה No solution.! — מדוע?!

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

1. משתנה מחלקה הוא עותק יחיד משותף

המשתנה N הוגדר כמשתנה מחלקה (classVariableNames: 'N'). כפי שלמדנו בעקרונות השפה, משתנה מחלקה הוא עותק יחיד המשותף לכל המופעים של אותה המחלקה.

2. אתחול הלוח הראשון (board1 initialize: 5)

כאשר נוצר ואותחל הלוח הראשון (board1 initialize: 5), ערכו של משתנה המחלקה N נקבע ל-5, ונוצרה ב-board1 שרשרת של 5 מלכות.

3. הדריסה הקטלנית (board2 initialize: 1)

מיד לאחר מכן, כאשר אותחל הלוח השני (board2 initialize: 1), הוא ניגש לאותו משתנה מחלקה משותף N, דרס את ערכו הקודם ושינה אותו מ-5 ל-1!

4. קריסת החיפוש ב-board1 solve

כאשר מופעלת המתודה board1 solve, 5 המלכות של הלוח הראשון פונות במתודה advance אל Board N ומקבלות כולן את הערך המעודכן: 1! לכן ברגע שמלכה מגיעה לשורה 1 היא מניחה שהגיעה לקצה הלוח ונסוגה — ואי אפשר להציב 5 מלכות בשורה אחת בלבד!

3. הפתרון התקני מונחה העצמים: משתני מופע פרטיים לכל לוח ולכל מלכה

איך מאפשרים למספר לוחות בגדלים שונים להתקיים ולפעול בו-זמנית ללא התנגשות?

✅ כללי הפתרון התקני מונחה העצמים:

  • כדי לאפשר קיומם של מספר לוחות בגדלים שונים בו-זמנית, חל איסור להשתמש במשתנה מחלקה משותף עבור גודל הלוח.
  • במקום זאת, יש להגדיר את boardSize (או n) כמשתנה מופע (instanceVariableNames) של המחלקה Board.
  • בעת יצירת המלכות, גודל הלוח מועבר לכל מלכה כמשתנה מופע פרטי משלה (למשל במתודת אתחול מורחבת setColumn:neighbor:boardSize:), או לחלופין כל מלכה מחזיקה קישור למופע הלוח שלה.
עזר גרפי 16.2 • תמונת הזיכרון בהכללת הלוח

דריסת משתנה המחלקה המשותף N מול עצמאות מוחלטת במשתני מופע (boardSize)

Class Var vs. Instance Var
❌ תכנון שגוי: משתנה מחלקה משותף (Board N) משתנה מחלקה יחיד ב-Board N = 5 ➔ נדרס ל-1! board1 (5 מלכות) ב-advance שואלות Board N ומקבלות 1 במקום 5! board2 (מלכה אחת) initialize: 1 דורס את N ל-1! תוצאת board1 solve: "No solution.!" ✅ הפתרון התקני: משתנה מופע פרטי (boardSize) מופע board1 boardSize = 5 5 מלכות שכל אחת מהן יודעת שגבולה הוא 5 ✓ מוצא פתרון ל-5×5! מופע board2 boardSize = 1 מלכה אחת שיודעת שגבולה הפרטי הוא 1 ✓ מופרד לחלוטין מ-board1! מספר לוחות בגדלים שונים פועלים יחד ללא התנגשות!
🔬

מיני-סימולציה 16.2: מעקב שורה-אחר-שורה אחרי ריצת ה-Workspace

לחץ על כל שורת קוד ב-Workspace כדי לראות את מצב הזיכרון
🧪
סימולציה אינטראקטיבית גדולה 16.2

מעבדת הבחינה החיה: השוואת משתנה מחלקה משותף (N) מול משתנה מופע פרטי (boardSize)

החלף בין המימוש השגוי (משתנה מחלקה N) לבין המימוש התקני מונחה העצמים (משתנה מופע boardSize), בחר גדלים עבור board1 ועבור board2, והרץ את board1 solve כדי לראות את ההבדל בזמן אמת:

בחר ארכיטקטורת מימוש במחלקות Board ו-Queen:
🔍 מצב המופעים בזיכרון ופלט ה-Transcript בעת הרצת board1 solve:
⚡

הגשר הנרטיבי: פתרנו במלואה את ההכללה הדו-ממדית ל-N × N – עכשיו בוא נמריא אל הממד השלישי!

אחרי שהבנו איך להכליל את הלוח הדו-ממדי לכל N × N באמצעות משתני מופע תקניים, אנחנו מוכנים לכיוון ההכללה השני והמרתק של פרק 16: לוח שחמט תלת-ממדי (מרחבי) בגודל N × N × N! כמה מלכות עלינו להציב במרחב תלת-ממדי כזה? איך מיוצגות הקואורדינטות של שתי מלכות Q1(i,j,k) ו-Q2(row,col,lev)? ואיך 7 שורות קוד קצרות בסמולטוק (איור 16.1) מזהות כל איום מרחבי באחד המישורים או האלכסונים? בוא נעבור ללשונית 3!

חלק VI: סימולציה • סעיף 16.2 חידת המלכות המרחבית ואיור 16.1

16.2 לוח שחמט תלת-ממדי (מרחבי) ובדיקת איום מרחבי בסמולטוק

הצבת N² מלכות על לוח שחמט תלת-ממדי בגודל N × N × N, ייצוג מלכות באמצעות שלשה סדורה של שורה, עמודה ומפלס Q1(i,j,k) ו-Q2(row,col,lev), ופירוק מעמיק של קוד הסמולטוק באיור 16.1.

🧊
🧠

מודל מנטלי ועיקרון מנחה: משלושה מרחקים מוחלטים (dx, dy, dz) לארבעת תנאי האיום המרחביים

💡 האנלוגיה המוחשית

דמיין בניין קומות של לוחות שחמט: N מפלסים שמונחים זה מעל זה ויוצרים קובייה של N × N × N. מיקומה של כל מלכה נקבע על ידי שורה, עמודה ומפלס (קומה): (row, col, lev).

⚖️ חוק הברזל הפדגוגי

הגדרה 16.2 (חידת המלכות המרחבית): הצב N² מלכות על לוח שחמט תלת-ממדי N × N × N כך שבכל אחד מהמישורים אף מלכה אינה מאיימת על מלכה אחרת.

🎯 תובנת המפתח

חישוב הערך המוחלט (abs) של ההפרשים בשלושת הצירים (dx, dy, dz) מתרגם את בדיקת האיום הגיאומטרית לארבע השוואות אלגבריות פשוטות של איפוס צירים או שוויון ביניהם!

1. הגדרה 16.2: חידת המלכות המרחבית בלוח N × N × N

כמה מלכות מציבים במרחב תלת-ממדי ואיך מיוצג מיקומה של כל מלכה?

הכללה פחות ידועה — אך מרתקת במיוחד — של חידת המלכות היא החידה התלת-ממדית (המרחבית), המנוסחת כך:

📌 הגדרה 16.2 · חידת המלכות המרחבית N² Queens on N × N × N Cube

הצב N² מלכות על לוח שחמט תלת ממדי N × N × N כך שבכל אחד מהמישורים אף מלכה אינה מאיימת על מלכה אחרת.

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

יש להציב N² מלכות על גבי לוח שחמט תלת-ממדי בגודל N × N × N כך שכל שתי מלכות Q1, Q2 אינן מאיימות זו על זו. כל מלכה ממוקמת במרחב באמצעות שלשה סדורה של שורה, עמודה ומפלס:

מיקום מלכה ראשונה (Q1): Q1(i, j, k)
מיקום מלכה שנייה (Q2): Q2(row, col, lev)

2. איור 16.1: הקוד בסמולטוק לבדיקת איום מרחבי ופירוק הלוגיקה שלו

איך מחשבים את המרחקים המוחלטים dx, dy, dz ומה בודק כל אחד מארבעת תנאי ה-ifTrue?

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

💻 איור 16.1: בדיקת איום מרחבי (Smalltalk) Spatial Threat Detection
dx := (row - i) abs.
dy := (col - j) abs.
dz := (lev - k) abs.
((dx = 0) and: [ dy = 0 ]) ifTrue: [ ^ true ].
((dx = 0) and: [ dy = dz ]) ifTrue: [ ^ true ].
((dx = dz) and: [ dy = 0 ]) ifTrue: [ ^ true ].
((dx = dy) and: [ dx = dz ]) ifTrue: [ ^ true ]

🧠 איך זה עובד מתחת לפני השטח? פירוק מלא של איור 16.1:

כדי לקבוע האם שתי מלכות Q1(i,j,k) ו-Q2(row,col,lev) מאיימות זו על זו באחד המישורים או האלכסונים המרחביים, הקוד פועל בשני שלבים:

שלב א': חישוב המרחקים המוחלטים בכל אחד משלושת הצירים באמצעות ההודעה abs:
  • dx := (row - i) abs. — המרחק המוחלט בציר השורות (בין row ל-i).
  • dy := (col - j) abs. — המרחק המוחלט בציר העמודות (בין col ל-j).
  • dz := (lev - k) abs. — המרחק המוחלט בציר המפלסים/הקומות (בין lev ל-k).
שלב ב': בדיקת ארבעת תנאי האיום (שכל אחד מהם מחזיר ^ true אם מתקיים איום):
1. ((dx = 0) and: [ dy = 0 ]) ifTrue: [ ^ true ].

שתי המלכות חולקות את אותה שורה ואותה עמודה — כלומר הן נמצאות זו מעל זו באותו עמוד אנכי לאורך ציר המפלסים!

2. ((dx = 0) and: [ dy = dz ]) ifTrue: [ ^ true ].

המלכות נמצאות באותה שורה (dx = 0), ונמצאות על אלכסון במישור עמודה-מפלס (Y-Z) שבו המרחק בעמודות שווה למרחק במפלסים (dy = dz).

3. ((dx = dz) and: [ dy = 0 ]) ifTrue: [ ^ true ].

המלכות נמצאות באותה עמודה (dy = 0), ונמצאות על אלכסון במישור שורה-מפלס (X-Z) שבו המרחק בשורות שווה למרחק במפלסים (dx = dz).

4. ((dx = dy) and: [ dx = dz ]) ifTrue: [ ^ true ]

המלכות נמצאות על אלכסון מרחבי תלת-ממדי מלא, שבו כל שלושת ההפרשים שווים זה לזה (dx = dy = dz)!

✍️ תרגיל 16.2

משימת מימוש לחידה התלת-ממדית:

ממשו פתרון בסמולטוק (Smalltalk) לחידת המלכות התלת־ממדית.

עזר גרפי 16.3 • המחשת הלוח התלת-ממדי N × N × N ואיור 16.1

קואורדינטות Q1(i,j,k) ו-Q2(row,col,lev) במרחב וארבעת וקטורי האיום המרחביים

הגדרה 16.2 · איור 16.1
לוח תלת-ממדי N×N×N (מפלסים k / lev) lev=3 lev=2 lev=1 Q1 Q2 Q2' אדום: עמוד אנכי (dx=0,dy=0) · ירוק: אלכסון מרחבי (dx=dy=dz) תנאי 1: ((dx = 0) and: [ dy = 0 ]) ifTrue: [ ^ true ]. אותה שורה ואותה עמודה — איום בעמוד אנכי לאורך המפלסים תנאי 2: ((dx = 0) and: [ dy = dz ]) ifTrue: [ ^ true ]. אותה שורה (dx=0) ואלכסון במישור עמודה-מפלס (dy = dz) תנאי 3: ((dx = dz) and: [ dy = 0 ]) ifTrue: [ ^ true ]. אותה עמודה (dy=0) ואלכסון במישור שורה-מפלס (dx = dz) תנאי 4: ((dx = dy) and: [ dx = dz ]) ifTrue: [ ^ true ] אלכסון מרחבי תלת-ממדי מלא — כל שלושת ההפרשים שווים (dx = dy = dz)
🧊

מיני-סימולציה 16.3: חוקר 4 תנאי האיום המרחביים באיור 16.1

לחץ על כל תנאי כדי לראות דוגמה מספרית והסבר גיאומטרי
💻
סימולציה אינטראקטיבית גדולה 16.3 · Code Stepper

מחשבון וסימולטור מעקב ביצוע לבדיקת איום מרחבי (איור 16.1)

הזן קואורדינטות עבור המלכה הראשונה Q1(i, j, k) ועבור המלכה השנייה Q2(row, col, lev) (או בחר אחד מתרחישי הבדיקה המוכנים). הסימולטור יחשב בזמן אמת את הערכים המוחלטים של dx, dy, dz ויצבע בירוק זוהר את שורת התנאי הראשונה באיור 16.1 שהחזירה ^ true ועצרה את הריצה!

מיקום מלכה ראשונה Q1(i, j, k):
מיקום מלכה שנייה Q2(row, col, lev):
🔍 מעקב ביצוע חי על שורות הקוד של איור 16.1:
⚡

הגשר הנרטיבי: סיימנו את סעיפים 16.1 ו-16.2 – בוא נסכם את פרק 16 ואת חלק VI כולו!

ראינו כיצד מכלילים את חידת המלכות הן ללוח דו-ממדי N × N (תוך הימנעות ממלכודת משתנה המחלקה N) והן ללוח תלת-ממדי מרחבי N × N × N עם N² מלכות ובדיקת האיום המרחבי באיור 16.1. בלשונית הבאה נרכז את כל ההגדרות, הנוסחאות והקוד בכרטיסיות זיכרון תלת-ממדיות (3D Flashcards) ונתכונן לפרק 17 (הסביבה הגרפית Morphic)!

חלק VI: סימולציה • יחידה 16.3 אינטגרציה, כרטיסיות שינון (Flashcards) וסיכום ההגדרות

מילון מושגים אינטראקטיבי וסיכום פרק 16 (הכללה של חידת המלכות)

חיבור שני כיווני ההכללה שלמדנו בפרק — מלוח דו-ממדי N × N (והפתרון התקני מונחה העצמים ללא משתנה מחלקה) ועד ללוח תלת-ממדי מרחבי N × N × N וקוד בדיקת האיום באיור 16.1.

🏆
🧠

מודל מנטלי ועיקרון מנחה: סיכום שני צירי ההכללה של פרק 16

💡 ציר 1: הכללת הממד (N × N)

הגדרה 16.1 מציבה N מלכות על לוח N × N ללא איום בשורה, בעמודה או באלכסון, תוך החלפת הקבוע הקשיח 8 בפרמטר ב-Board>>initialize וב-Queen>>advance.

⚖️ חוק הברזל המונחה עצמים

אסור לשמור את גודל הלוח כמשתנה מחלקה N (שנדרס בין board1 ל-board2 וגורם ל-No solution.!), אלא רק כמשתנה מופע פרטי (boardSize).

🎯 ציר 2: הכללה מרחבית (N × N × N)

הגדרה 16.2 מציבה N² מלכות בקואורדינטות Q1(i,j,k) ו-Q2(row,col,lev), ואיור 16.1 בודק איום מרחבי באמצעות dx, dy, dz בערך מוחלט (abs) ו-4 תנאי ifTrue.

עזר גרפי 16.4 • מפת המושגים השלמה של פרק 16

מהכללת הלוח הדו-ממדי (16.1) ומלכודת משתנה המחלקה ועד להכללה המרחבית (16.2)

Chapter 16 Synthesis
1. חידה כללית N × N (16.1) • הגדרה 16.1: הצבת N מלכות • ללא איום בשורה, עמודה או אלכסון • הסרת הקבוע הקשיח 8 מ-initialize ומבדיקת הגבול ב-Queen>>advance • תרגיל 16.1: מימוש בסמולטוק ⟵ 2. מלכודת משתנה המחלקה N • classVariableNames: 'N' משותף • board2 initialize: 1 דורס את 5 • פלט ב-Transcript: No solution.! • הפתרון התקני: boardSize כמשתנה מופע בלוח ובכל מלכה! ⟵ 3. לוח תלת-ממדי (16.2) • הגדרה 16.2: הצבת N² מלכות • קואורדינטות (i,j,k) ו-(row,col,lev) • איור 16.1: מרחקי dx, dy, dz ב-abs ו-4 תנאי האיום המרחביים • תרגיל 16.2: מימוש בסמולטוק
⚡

מיני-סימולציה 16.4: בוחן אבחנה מהיר – בדוק את שליטתך בפרק 16!

לחץ על כל שאלת מפתח
🃏
סימולציה אינטראקטיבית גדולה 16.4

כרטיסיות זיכרון תלת-ממדיות (3D Flashcards) לכל ההגדרות והקוד של פרק 16

לחץ על כל כרטיסייה כדי להפוך אותה ולבחון את עצמך על כל 9 מושגי המפתח של פרק 16:

נחשפו: 0 / 9
🚀

בכך סיימנו במלואו את פרק 16 ואת חלק VI (סימולציה)! מה מחכה לנו בפרק 17?

בפרק 16 השלמנו את ההכללה של חידת המלכות הן למימד הדו-ממדי הכללי N × N (תוך הבנה עמוקה של ההבדל בין משתנה מחלקה משותף למשתנה מופע פרטי) והן למימד המרחבי התלת-ממדי N × N × N עם בדיקת האיום המרחבי באיור 16.1.

🎯 הפרק הבא שלנו – פרק 17: הסביבה הגרפית Morphic: בפרק 17 נחקור את עקרונות הממשק הגרפי, עץ הרכיבים של מורפיק (Morphic), טיפול באירועי עכבר, ויצירת אנימציות חיות באמצעות מנגנון ה-stepping וה-Threads!
🕹️

מעבדת חקר אינטראקטיבית

❓

5 שאלות פתוחות מדורגות + 5 שאלות אמריקאיות עם הסברים מלאים לכל יחידה

🚀 התחנה הבאה שלנו: פרק 17 – הסביבה הגרפית Morphic

בכך סיימנו במלואו את פרק 16: הכללה של חידת המלכות ואת חלק VI (סימולציה)! הפרק הבא שלנו הוא פרק 17: הסביבה הגרפית Morphic, שבו נחקור יחד: