ادرس هذا الرمز بعناية واكتشف طريقة ذكية لاستخدام العودية لحل ألغاز سودوكو الصعبة تلك.

سودوكو هي لعبة ألغاز أرقام شائعة تتكون من شبكة 9x9 بأرقام من 1 إلى 9. يتضمن اللغز مجموعة من الأرقام وبعض المساحات الفارغة ، والتي تحتاج إلى تعبئتها.

عند ملء الفراغات ، يجب أن يحتوي كل صف وعمود وشبكة فرعية 3 × 3 على جميع الأرقام من 1 إلى 9.

يمكن أن يساعدك نص Python البسيط في حل أحجية Sudoku من أجلك. يمكنه تحليل جميع المساحات الفارغة على لوحة Sudoku ، والعثور على رقم محتمل لملء كل مساحة فارغة.

كيفية إنشاء وعرض لوحة سودوكو

داخل نص Python ، ستحتاج إلى استخدام قائمة من المصفوفات لتخزين قيم أحجية Sudoku التي لم يتم حلها.

الكود المستخدم في هذا المشروع متوفر في هذا جيثب ريبو بموجب ترخيص معهد ماساتشوستس للتكنولوجيا.

  1. داخل نص Python جديد يسمى sudoku.py ، قم بتخزين جميع القيم لشبكة 9x9. يمثل كل صف وعمود الأرقام التسعة عبر وأسفل لغز سودوكو. أضف 0s لتمثيل المسافات التي تحتاج إلى حل:
    اللوحة = [
    [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,
    instagram viewer
    0, 3, 0, 0, 1],
    [7, 0, 0, 0, 2, 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 لمعالجة كل صف في الشبكة:
    defلوحة الطباعة(سبورة):
    ل صف في يتراوح(9):
  3. لفصل كل صف إلى أثلاث ، تحقق مما إذا كان الصف قابلاً للقسمة على ثلاثة ، وأضف سطرًا:
    لو صف ٪ 3 == 0و صف! = 0:
    مطبعة("- - - - - - - - - - - - - - ")
  4. داخل كل صف ، قم بعمل تكرار حلقي خلال كل عمود. يمكنك أيضًا تقسيم الأعمدة إلى أثلاث عن طريق التحقق مما إذا كان العمود قابلاً للقسمة على ثلاثة:
    ل العمود في يتراوح(9):
    لو عمود٪ 3 == 0و عمود! = 0:
    مطبعة(" | "، النهاية ="")
  5. اطبع قيمة الرقم المخزنة في الشبكة. إذا كان العمود هو العمود الأخير لهذا الصف المحدد ، فقم بإضافة سطر فاصل ، بحيث يظهر الصف التالي في سطر جديد:
    لو عمود == 8:
    طباعة (لوحة [صف] [عمود])
    آخر:
    طباعة (str (board [row] [col]) + " "، النهاية ="")
  6. اتصل بالوظيفة لطباعة اللوحة:
    print_board (لوحة)
  7. في سطر الأوامر ، انتقل إلى المجلد حيث قمت بتخزين برنامج Python النصي ، على سبيل المثال:
    سطح المكتب cd
  8. استخدم الأمر python لتشغيل برنامج Sudoku النصي. اعرض اللغز المطبوع على الشاشة:
    سودوكو بيثون

كيفية تحديد المسافات الفارغة لحلها

يمكنك اجتياز القوائم للعثور على المسافات التي تتكون من 0 ثانية. هذه تحدد المساحات التي تحتاج إلى حل.

  1. في وظيفة جديدة تسمى find_empty () ، قم بالتكرار خلال كل صف وعمود على اللوحة:
    deffind_empty(سبورة):
    ل صف في يتراوح(9):
    ل العمود في يتراوح(9):
  2. إذا كانت قيمة الخلية الحالية تساوي 0 ، فقم بإرجاع الموضع الحالي للخلية الفارغة:
    لو اللوحة [الصف] [العمود] == 0:
    يعود (صف ، عمود)
  3. إذا وصل البرنامج النصي إلى نهاية الوظيفة ، فهذا يعني أن البرنامج النصي لم يتمكن من العثور على أي خلايا بقيمة 0. في هذه الحالة ، لا تقم بإرجاع أي شيء:
    يعودلا أحد
  4. في وظيفة جديدة تسمى حل () ، استخدم وظيفة البحث للعثور على أول مساحة فارغة على السبورة:
    defيحل(سبورة):
    find = find_empty (board)
  5. ترجع الدالة find_empty () موضع الخلية بتنسيق tuple ، على سبيل المثال ، (0، 2). احفظ هذه القيم بشكل منفصل في ملف صف و العمود المتغيرات. خلافًا لذلك ، عُد بصحيح للإشارة إلى عدم وجود مسافات فارغة لحلها:
    لولا يجد:
    يعودحقيقي
    آخر:
    صف ، عمود = بحث

كيفية حل اللغز لكل صف وعمود وشبكة 3x3

الآن بعد أن تمكنت من تحديد أول مساحة فارغة لحلها ، ستحتاج إلى محاولة العثور على رقم مناسب لملء تلك المساحة وحل اللغز.

باستخدام العودية، قم باستدعاء دالة حل () داخل نفسها لتجربة كل مجموعة ممكنة من القيم لجميع المسافات الأخرى أيضًا.

  1. داخل دالة الحل () ، بعد إيجاد المساحة الفارغة الأولى ، مرر كل رقم من 1 إلى 9. تمثل هذه الأرقام الأرقام المحتملة التي يمكن أن تملأ المساحة التي لم يتم حلها:
    ل الأس في يتراوح(1, 10):
  2. أدخل اللوحة والرقم المحتمل وموضع الخلية الفارغة في وظيفة جديدة. ستعود الدالة الجديدة صحيحًا إذا كان هذا الرقم رقمًا صالحًا يمكنه حل هذه المساحة الفارغة. إذا كان صحيحًا ، فقم بتعيين هذا الرقم إلى الخلية الموجودة على اللوحة:
    لو is_valid (board، num، (row، col)):
    اللوحة [الصف] [العمود] = العدد
  3. قم بإنشاء دالة is_valid () ، بمعلمات مطابقة:
    defصالح(board، num، pos):
  4. استخدم الوظيفة للتحقق مما إذا كان وضع الرقم في هذا الموضع ينتهك أي قواعد للعبة Sudoku. أولاً ، تحقق مما إذا كان هذا الرقم موجودًا بالفعل في صف أو عمود الخلية:
    ل العمود في يتراوح(9):
    لو لوحة [نقاط البيع]0]] [عمود] == عدد و نقاط البيع[1]! = العمود:
    يعودخطأ شنيع

    ل صف في يتراوح(9):
    لو لوحة [صف] [نقطة بيع [1]] == عدد و نقاط البيع[0]! = صف:
    يعودخطأ شنيع

  5. احصل على شبكة 3x3 التي تنتمي إليها الخلية. يمكنك القيام بذلك عن طريق قسمة موضع الخلية على ثلاثة:
     box_row = نقاط البيع [0] // 3
    box_col = نقاط البيع [1] // 3
  6. لكل صف وعمود في تلك الشبكة 3 × 3 ، تحقق مما إذا كان الرقم موجودًا بالفعل. إذا كان الأمر كذلك ، فأعد القيمة false:
    ل صف في النطاق (box_row *3، box_row *3 + 3):
    ل العمود في النطاق (box_col *3، box_col *3 + 3):
    لو لوحة [صف] [عمود] == عدد و (صف ، عمود)! = نقاط البيع:
    يعودخطأ شنيع
  7. إذا وصل البرنامج النصي إلى نهاية الوظيفة ، فهذا يعني أنه لم يتم فشل أي من قواعد Sudoku. العودة صحيحة:
    يعودحقيقي
  8. تتحقق الدالة is_valid () فقط مما إذا كان موضع الرقم صحيحًا أم لا ، لكن هذا لا يعني أنه الإجابة الصحيحة على الحل الشامل. داخل وظيفة حل () ، اتصل بوظيفة الحل () مرة أخرى باستخدام اللوحة المحدثة. قد تصل وظيفة حل () إلى حالة حيث لم يعد بإمكانها استخدام أي أرقام لملء أي فراغات. في هذه الحالة ، ترجع الوظيفة بأكملها خطأ ، وتعيد تعيين تلك الخلية المعينة مرة أخرى إلى 0 ، وتتراجع. ترجع الدالة حل () فقط صحيحًا عندما يتمكن البرنامج النصي من ملء جميع المسافات:
    ل الأس في يتراوح(1, 10):
    لو is_valid (board، num، (row، col)):
    اللوحة [الصف] [العمود] = العدد

    لو حل (لوحة):
    يعودحقيقي

    اللوحة [الصف] [العمود] = 0

    يعودخطأ شنيع

  9. لبدء حل اللغز ، اتصل بوظيفة الحل () باللوحة الأصلية ، أسفل البرنامج النصي ، بعد إعلان وظيفة الحل ():
    حل (مجلس)
  10. اطبع النتيجة النهائية:
    مطبعة("تم حلها:")
    print_board (لوحة)
  11. في سطر الأوامر ، استخدم الأمر python لإعادة تشغيل البرنامج النصي. اعرض اللغز الذي تم حله مطبوعًا على الشاشة:
    سودوكو بيثون

إنشاء ألعاب باستخدام بايثون

Sudoku هي مجرد واحدة من العديد من الألعاب التي يمكنك إنشاؤها وحلها باستخدام Python. يمكنك استخدام Python لإنشاء العديد من الألعاب الأخرى ، على سبيل المثال لا الحصر ، لعبة jumble ، أو لعبة مغامرات تعتمد على النص ، أو لعبة ملونة.