
دليل شامل لبرمجة لعبة سودوكو باستخدام 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.
يمكنك تطوير هذا التطبيق بشكل أكبر عن طريق إضافة المزيد من الميزات مثل
مستويات الصعوبة المختلفة، وتوليد ألغاز عشوائية، ومؤقت للوقت،
وواجهة مستخدم أكثر جاذبية، ونظام حفظ نقاط متقدم .