למד את הקוד הזה בקפידה וגלה דרך חכמה להשתמש ברקורסיה כדי לפתור את חידות סודוקו מסובכות.

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

בעת מילוי הרווחים הריקים, כל שורה, עמודה ורשת משנה בגודל 3x3 צריכים להכיל את כל הספרות מ-1 עד 9.

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

כיצד ליצור ולהציג את לוח הסודוקו

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

הקוד המשמש בפרויקט זה זמין בזה ריפו של GitHub תחת רישיון MIT.

  1. בתוך סקריפט Python חדש בשם sudoku.py, אחסן את כל הערכים עבור הרשת של 9x9. כל שורה ועמודה מייצגים את תשעת המספרים לאורך ולמטה של ​​פאזל הסודוקו. הוסף 0 כדי לייצג את הרווחים שצריך לפתור:
    לוח = [
    [5, 3, 0, 0, 7, 0, 0, 0, 0],
    [6, 0, 0, 1, 9, 5, 0, 0, 0],
    [0, 9, 8, 0, 0, 0, 0, 6, 0],
    [8, 0, 0, 0, 6, 0, 0, 0, 3],
    [4, 0, 0, 8, 0, 3, 0, 0, 1],
    [7, 0, 0, 0, 2,
    instagram viewer
    0, 0, 0, 6],
    [0, 6, 0, 0, 0, 0, 2, 8, 0],
    [0, 0, 0, 4, 1, 9, 0, 0, 5],
    [0, 0, 0, 0, 8, 0, 0, 7, 9]
    ]
  2. בתוך פונקציה חדשה בשם print_board, השתמש בלולאת for כדי לעבד כל שורה ברשת:
    defprint_board(גלשן):
    ל שׁוּרָה ב טווח(9):
  3. כדי להפריד כל שורה לשלישים, בדוק אם השורה מתחלקת בשלוש, והוסף שורה:
    אם שורה % 3 == 0ו שורה != 0:
    הדפס("- - - - - - - - - - - - - - ")
  4. בתוך כל שורה, לולאה דרך כל עמודה. אתה יכול גם לפצל עמודות לשלישים על ידי בדיקה אם העמודה מתחלקת בשלוש:
    ל קול ב טווח(9):
    אם קול % 3 == 0ו קול != 0:
    הדפס(" | ", סוף="")
  5. הדפס את ערך המספר המאוחסן ברשת. אם העמודה היא העמודה האחרונה עבור אותה שורה מסוימת, הוסף קו הפסקה, כך שהשורה הבאה תופיע בשורה חדשה:
    אם col == 8:
    הדפס (לוח[שורה][קול])
    אַחֵר:
    print (str (לוח[שורה][col]) + " ", סוף="")
  6. קרא לפונקציה כדי להדפיס את הלוח:
    print_board (לוח)
  7. בשורת פקודה, נווט לתיקיה שבה אחסנת את סקריפט ה-python שלך, לדוגמה:
    CD Desktop
  8. השתמש בפקודה python כדי להפעיל את סקריפט הסודוקו שלך. צפו בפאזל המודפס על המסך:
    python sudoku.py

כיצד לזהות את החללים הריקים לפתרון

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

  1. בפונקציה חדשה בשם find_empty(), לולאה דרך כל שורה ועמודה בלוח:
    defמצא_ריק(גלשן):
    ל שׁוּרָה ב טווח(9):
    ל קול ב טווח(9):
  2. אם הערך של התא הנוכחי הוא 0, החזר את המיקום הנוכחי של התא הריק:
    אם board[row][col] == 0:
    לַחֲזוֹר (שורה, קול)
  3. אם הסקריפט מגיע לסוף הפונקציה, זה אומר שהסקריפט לא הצליח למצוא תאים עם הערך 0. במקרה זה, אל תחזיר דבר:
    לַחֲזוֹראף אחד
  4. בפונקציה חדשה בשם solve(), השתמש בפונקציית find כדי למצוא את החלל הריק הראשון על הלוח:
    defלִפְתוֹר(גלשן):
    find = find_empty (לוח)
  5. הפונקציה find_empty() מחזירה את מיקום התא בפורמט tuple, לדוגמה, (0, 2). שמור ערכים אלה בנפרד ב- שׁוּרָה ו קול משתנים. אחרת, החזר נכון כדי לציין שלא נותרו רווחים ריקים לפתרון:
    אםלֹא למצוא:
    לַחֲזוֹרנָכוֹן
    אַחֵר:
    שורה, קול = מצא

כיצד לפתור את הפאזל עבור כל שורה, עמודה ורשת 3x3

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

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

  1. בתוך הפונקציה solve(), לאחר מציאת החלל הריק הראשון, בצע לולאה דרך כל מספר מ-1 עד 9. המספרים האלה מייצגים את המספרים האפשריים שיכולים למלא את החלל הלא פתור:
    ל מספר ב טווח(1, 10):
  2. הזן את הלוח, המספר האפשרי ומיקום התא הריק לפונקציה חדשה. הפונקציה החדשה תחזיר true אם המספר הזה הוא מספר חוקי שיכול לפתור את החלל הריק הזה. אם הוא חוקי, הקצה את המספר הזה לתא על הלוח:
    אם is_valid (לוח, מספר, (שורה, קול)):
    board[row][col] = num
  3. צור את הפונקציה is_valid() עם פרמטרים תואמים:
    defהוא_תקף(לוח, מספר, מיקום):
  4. השתמש בפונקציה כדי לבדוק אם הצבת המספר בעמדה זו מפרה כללים כלשהם של משחק הסודוקו. ראשית, בדוק אם המספר הזה כבר קיים בשורה או בעמודה של התא:
    ל קול ב טווח(9):
    אם לוח[פוזי[0]][col] == מספר ו pos[1] != קול:
    לַחֲזוֹרשֶׁקֶר

    ל שׁוּרָה ב טווח(9):
    אם לוח[שורה][pos[1]] == מספר ו pos[0] != שורה:
    לַחֲזוֹרשֶׁקֶר

  5. קבל את הרשת 3x3 שהתא שייך אליה. אתה יכול לעשות זאת על ידי חלוקת מיקום התא בשלוש:
     box_row = pos[0] // 3
    box_col = pos[1] // 3
  6. עבור כל שורה ועמודה ברשת בגודל 3x3 זו, בדוק אם המספר כבר קיים. אם כן, החזר false:
    ל שׁוּרָה ב טווח (שורת_תיבה*3, box_row*3 + 3):
    ל קול ב טווח (תיבה_קול*3, box_col*3 + 3):
    אם board[row][col] == num ו (שורה, קול) != pos:
    לַחֲזוֹרשֶׁקֶר
  7. אם הסקריפט מגיע לסוף הפונקציה, זה אומר שאף אחד מכללי הסודוקו לא נכשל. החזר נכון:
    לַחֲזוֹרנָכוֹן
  8. הפונקציה is_valid() בודקת רק אם מיקום המספר חוקי, אבל זה לא אומר שזו התשובה הנכונה לפתרון הכולל. בתוך הפונקציה solve(), קרא שוב לפונקציה solve() עם הלוח המעודכן. הפונקציה solve() עשויה להגיע למצב שבו היא לא יכולה יותר להשתמש במספרים כלשהם כדי למלא רווחים כלשהם. במקרה זה, הפונקציה כולה מחזירה false, מאפסת את התא המסוים הזה בחזרה ל-0 וחוזרת לאחור. הפונקציה solve() מחזירה true רק כאשר הסקריפט יכול למלא את כל החללים:
    ל מספר ב טווח(1, 10):
    אם is_valid (לוח, מספר, (שורה, קול)):
    board[row][col] = num

    אם לפתור (לוח):
    לַחֲזוֹרנָכוֹן

    board[row][col] = 0

    לַחֲזוֹרשֶׁקֶר

  9. כדי להתחיל לפתור את הפאזל, קרא לפונקציה solve() עם הלוח המקורי, בתחתית הסקריפט, לאחר הכרזת הפונקציה solve():
    לפתור (לוח)
  10. הדפס את התוצאה הסופית:
    הדפס("נפתר:")
    print_board (לוח)
  11. בשורת הפקודה, השתמש בפקודה python כדי להפעיל מחדש את הסקריפט. צפה בפאזל שנפתר המודפס על המסך:
    python sudoku.py

יצירת משחקים באמצעות Python

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