القائمة الرئيسية

الصفحات

دليل شامل لبرمجة لعبة سودوكو باستخدام Python Pygame

best-guide-to-Coding-Sudoku-game-in-Python-Pygame، best guide to، programming Sudoku game، using Python Pygame، best guide to programming  Sudoku game using Python Pygame، تثبيت Pygame، إعداد بيئة Python، حفظ النقاط Python، ملفات Python، التحقق من صحة سودوكو Pygame، حل سودوكو Python، إدخال الأرقام Pygame، التحقق من صحة الإدخال Pygame، تحديد خلية Pygame، تفاعل المستخدم Pygame، رسم Pygame، شبكة سودوكو Pygame، خلايا سودوكو Pygame، لوحة سودوكو Python، مصفوفة ثنائية الأبعاد Python، نافذة Pygame، تهيئة Pygame، ألوان Pygame، خطوط Pygame، لعبة سودوكو Pygame، برمجة ألعاب Python، تطوير ألعاب Pygame، واجهة مستخدم Pygame، حفظ نقاط اللعبة Python، تطبيق سودوكو Python، منطق لعبة سودوكو Python، دليل شامل من الواجهة إلى حفظ النقاط، لعبة سودوكو: pygame، خطوة بخطوة لبرمجة لعبة سودوكو باستخدام مكتبة Pygame في Python، دليل شامل لبرمجة لعبة سودوكو باستخدام Python Pygame، برمجة ألعاب Python، تطبيق سودوكو Python، تهيئة Pygame، حفظ نقاط اللعبة Python،



دليل شامل لبرمجة لعبة سودوكو باستخدام Python Pygame



تُعد سودوكو من أشهر ألعاب الألغاز المنطقية في العالم، وتقديمها كتطبيق 
تفاعلي يمكن أن يكون مشروعًا ممتعًا وتعليميًا. في هذا المقال، سنستعرض خطوات
 برمجة لعبة سودوكو كاملة باستخدام مكتبة Pygame في Python، بدءًا م
ن تصميم واجهة المستخدم الرسومية، وتنفيذ منطق اللعبة، وصولًا إلى حفظ نقاط اللاعبين.


خطوات برمجة لعبة سودوكو باستخدام Pygame :


يتطلب بناء لعبة سودوكو تفاعلية باستخدام مكتبة Pygame اتباع سلسلة 
من الخطوات المنظمة لتحويل الفكرة إلى تطبيق عملي. بدءًا من تهيئة البيئة وتصميم 
الهيكل الأساسي للعبة، مرورًا بتنفيذ العناصر المرئية والتفاعلات، وصولًا إلى إضافة
 المنطق والوظائف المتقدمة، تهدف هذه الخطوات إلى توجيه المطورين خلال عملية
 إنشاء لعبة سودوكو جذابة وقابلة للعب باستخدام Python و Pygame.

* إعداد البيئة وتثبيت Pygame :
تأكد من تثبيت Python على جهازك.
قم بتثبيت مكتبة Pygame باستخدام مدير الحزم pip : 
    pip install pygame

* إنشاء النافذة الأساسية :
قم بإنشاء ملف Python جديد واستورد مكتبة Pygame.
قم بتهيئة Pygame وإنشاء نافذة اللعبة :
Python

    import pygame

    pygame.init()

    screen_width = 540
    screen_height = 600
    screen = pygame.display.set_mode((screen_width, screen_height))
    pygame.display.set_caption("Sudoku")

    font = pygame.font.Font(None, 40)
    small_font = pygame.font.Font(None, 25)

    # ألوان
    white = (255, 255, 255)
    black = (0, 0, 0)
    light_gray = (200, 200, 200)
    blue = (0, 0, 255)
    green = (0, 255, 0)
    red = (255, 0, 0)

    grid_color = black
    cell_color = white
    text_color = black
    selected_color = light_gray
    correct_color = green
    incorrect_color = red

--

* تمثيل لوحة السودوكو :
قم بإنشاء دالة لإنشاء لوحة سودوكو أولية (يمكن أن تكون ثابتة أو يتم إنشاؤها عشوائيًا).
قم بتمثيل اللوحة كمصفوفة ثنائية الأبعاد (list of lists) :
Python

    def generate_board():
        # يمكنك هنا إضافة منطق لإنشاء لوحة سودوكو صالحة
        # حاليًا، سنستخدم لوحة ثابتة كمثال
        board = [
            [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, 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]
        ]
        return board

    board = generate_board()
    original_board = [row[:] for row in board] # حفظ النسخة الأصلية

--




* رسم لوحة السودوكو :
قم بإنشاء دالة لرسم خطوط الشبكة وأرقام الخلايا على الشاشة.
قم بتمييز الخلايا الأصلية عن الخلايا التي يمكن تعديلها :

Python

    def draw_board(bo):
        for i in range(9):
            for j in range(9):
                pygame.draw.rect(screen, cell_color, (j * 60, i * 60, 60, 60), 0)
                pygame.draw.rect(screen, grid_color, (j * 60, i * 60, 60, 60), 1)
                if bo[i][j] != 0:
                    text_surface = font.render(str(bo[i][j]), True, text_color)
                    text_rect = text_surface.get_rect(center=(j * 60 + 30, i * 60 + 30))
                    screen.blit(text_surface, text_rect)

        for i in range(0, 10, 3):
            pygame.draw.line(screen, grid_color, (0, i * 60), (screen_width, i * 60), 3)
            pygame.draw.line(screen, grid_color, (i * 60, 0), (i * 60, screen_height - 60), 3)

--

* تحديد الخلية المحددة :
قم بتتبع موقع الفأرة وعند النقر، حدد الخلية التي تم النقر عليها.
قم بتمييز الخلية المحددة بصريًا :
Python

    selected_cell = None

    def select_cell(pos):
        x = pos[0] // 60
        y = pos[1] // 60
        return (y, x)

    def draw_selection(cell):
        if cell:
            row, col = cell
            pygame.draw.rect(screen, selected_color, (col * 60, row * 60, 60, 60), 3)

--

* إدخال الأرقام :
اسمح للمستخدم بإدخال أرقام من 1 إلى 9 في الخلية المحددة باستخدام لوحة المفاتيح.
قم بالتحقق من صحة الإدخال (يجب أن يكون الرقم بين 1 و 9 ولا يجب تعديل الخلايا الأصلية) :
Python

    def insert_number(bo, number, pos):
        row, col = pos
        if original_board[row][col] == 0:
            bo[row][col] = number

    def is_valid(bo, num, pos):
        # التحقق من الصف
        for c in range(len(bo[0])):
            if bo[pos[0]][c] == num and pos[1] != c:
                return False

        # التحقق من العمود
        for r in range(len(bo)):
            if bo[r][pos[1]] == num and pos[0] != r:
                return False

        # التحقق من المربع 3x3
        box_x = pos[1] // 3
        box_y = pos[0] // 3

        for i in range(box_y * 3, box_y * 3 + 3):
            for j in range(box_x * 3, box_x * 3 + 3):
                if bo[i][j] == num and (i, j) != pos:
                    return False

        return True

--

* التحقق من صحة اللعبة :
قم بإنشاء دالة للتحقق مما إذا كانت لوحة السودوكو الحالية صالحة وكاملة.
قم بتمييز الأرقام الصحيحة والخاطئة بصريًا :


        

Python

    def check_board(bo):
        for i in range(9):
            for j in range(9):
                if bo[i][j] != 0:
                    if not is_valid(bo, bo[i][j], (i, j)):
                        return False
        return True

    def solve(bo):
        find = find_empty(bo)
        if not find:
            return True
        else:
            row, col = find

        for i in range(1, 10):
            if is_valid(bo, i, (row, col)):
                bo[row][col] = i

                if solve(bo):
                    return True

                bo[row][col] = 0

        return False

    def find_empty(bo):
        for i in range(len(bo)):
            for j in range(len(bo[0])):
                if bo[i][j] == 0:
                    return (i, j)  # row, col

        return None




* حفظ النقاط (اختياري) :
يمكنك إضافة منطق لحفظ نقاط اللاعبين في ملف (مثل ملف نصي أو JSON) وتحديثها عند إكمال اللعبة.
الكود (مثال بسيط للحفظ في ملف نصي) :
Python

    def save_score(score):
        try:
            with open("scores.txt", "a") as f:
                f.write(str(score) + "\n")
        except Exception as e:
            print(f"Error saving score: {e}")

    def load_scores():
        scores = []
        try:
            with open("scores.txt", "r") as f:
                for line in f:
                    scores.append(int(line.strip()))
        except FileNotFoundError:
            pass
        return sorted(scores, reverse=True)

--

* واجهة المستخدم الإضافية (اختياري) : 
يمكنك إضافة أزرار للتحقق من اللعبة، وحل اللعبة، وإعادة تعيين اللوحة، وعرض قائمة النقاط.
الكود (إضافة زر التحقق كمثال) :
Python

    check_button = pygame.Rect(10, 550, 100, 40)

    def draw_buttons():
        pygame.draw.rect(screen, blue, check_button)
        text_surface = small_font.render("تحقق", True, white)
        text_rect = text_surface.get_rect(center=check_button.center)
        screen.blit(text_surface, text_rect)

--




* حلقة اللعبة الرئيسية :
قم بإنشاء حلقة while تستمر حتى يتم إغلاق النافذة.
داخل الحلقة، قم بمعالجة الأحداث (مثل ضغطات المفاتيح ونقرات الفأرة)، 
وتحديث حالة اللعبة، وإعادة رسم الشاشة :
Python

    running = True
    key = None

    while running:
        screen.fill(white)
        draw_board(board)
        draw_selection(selected_cell)
        draw_buttons()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            if event.type == pygame.MOUSEBUTTONDOWN:
                pos = pygame.mouse.get_pos()
                if pos[1] < screen_height - 50: # التأكد من النقر داخل لوحة اللعبة
                    selected_cell = select_cell(pos)
                elif check_button.collidepoint(pos):
                    if check_board(board):
                        print("اللوحة صحيحة!")
                    else:
                        print("هناك أخطاء في اللوحة.")
            if event.type == pygame.KEYDOWN:
                if event.key in range(pygame.K_1, pygame.K_9 + 1):
                    number = event.key - pygame.K_0
                    if selected_cell:
                        insert_number(board, number, selected_cell)
                if event.key == pygame.K_DELETE or event.key == pygame.K_BACKSPACE:
                    if selected_cell and original_board[selected_cell[0]][selected_cell[1]] == 0:
                        board[selected_cell[0]][selected_cell[1]] = 0
                if event.key == pygame.K_SPACE:
                    solve(board)

        pygame.display.flip()

    pygame.quit()

--

* الشكل النهائي للتطبيق :

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

* الخاتمة :
في هذا المقال، قمنا ببرمجة لعبة سودوكو أساسية باستخدام مكتبة Pygame في Python. 
يمكنك تطوير هذا التطبيق بشكل أكبر عن طريق إضافة المزيد من الميزات مثل 
مستويات الصعوبة المختلفة، وتوليد ألغاز عشوائية، ومؤقت للوقت، 
وواجهة مستخدم أكثر جاذبية، ونظام حفظ نقاط متقدم .


جدول المحتويات