برمجة لعبة أربع نقاط في صف واحد Four-in-a-Row باستخدام لغة بايثون
تُعدّ الألعاب البسيطة مثل “أربع نقاط في صف واحد” (Four-in-a-Row) من المشاريع الممتازة لتعلّم أساسيات البرمجة، إذ تجمع بين مفاهيم البرمجة الكائنية (OOP)، والتفاعل مع المستخدم، ومعالجة البيانات، وتصميم الخوارزميات، بطريقة عملية وتفاعلية. لعبة “أربع نقاط في صف واحد”، والمعروفة أيضًا باسم “Connect Four”، هي لعبة منطقية يتنافس فيها لاعبان بوضع أقراص في شبكة رأسية 6×7، بهدف تشكيل سلسلة متصلة من أربع قطع من نفس اللون أفقيًا، أو عموديًا، أو قطريًا. يتطلب تطوير هذه اللعبة بلغة بايثون فهمًا جيدًا لهيكلة الكود، والتعامل مع مصفوفات ثنائية الأبعاد، ومعالجة شروط الفوز، وتنظيم دورة اللعب بين اللاعبين.
هذا المقال يقدم شرحًا مفصلًا لكيفية برمجة لعبة Four-in-a-Row باستخدام لغة بايثون، انطلاقًا من تصميم الهيكل العام وحتى تنفيذ التفاصيل الدقيقة المتعلقة بالتفاعل بين اللاعبين.
مفهوم اللعبة وأساسياتها
تتمثل لعبة “أربع نقاط في صف واحد” في شبكة ذات 6 صفوف و7 أعمدة، يقوم كل لاعب بوضع قرص في أحد الأعمدة، وينزل القرص إلى أسفل العمود إلى أول خانة فارغة. يتم التناوب بين اللاعبين حتى ينجح أحدهم في وضع أربع أقراص متتالية من لونه.
مكونات اللعبة الأساسية:
-
لوحة اللعب: عبارة عن مصفوفة ثنائية الأبعاد 6×7.
-
الحركات: اللاعب يختار عمودًا، والبرنامج يُسقط قرصه في أقرب خانة فارغة في العمود.
-
الفحص: بعد كل حركة، يجب التحقق من حالة الفوز.
-
دورة اللعب: يتم التبديل بين اللاعبين بعد كل حركة.
إعداد بيئة التطوير
قبل الشروع في كتابة الكود، يجب التأكد من توفر بيئة بايثون مثبتة، ويمكن استخدام أي محرر نصوص مثل VS Code، أو PyCharm، أو حتى المحرر المدمج في Jupyter Notebook.
كما يمكن استخدام مكتبة خارجية بسيطة مثل numpy لتسهيل التعامل مع المصفوفات، بالإضافة إلى مكتبة pygame في حال رغبت في واجهة رسومية، ولكن هذا المقال يركز على تنفيذ اللعبة عبر واجهة سطر الأوامر (CLI).
bashpip install numpy
بناء لوحة اللعبة
في البداية، يجب إنشاء مصفوفة تمثل الشبكة 6×7، وتهيئتها بالقيم صفر للدلالة على الخانات الفارغة.
pythonimport numpy as np
ROWS = 6
COLUMNS = 7
def create_board():
return np.zeros((ROWS, COLUMNS), dtype=int)
إسقاط القرص في العمود
عند اختيار اللاعب للعمود، يجب التأكد من وجود خانة فارغة في العمود، ثم وضع الرقم الذي يمثل اللاعب (1 أو 2) في أول خانة متاحة من الأسفل.
pythondef drop_piece(board, row, col, piece):
board[row][col] = piece
def is_valid_location(board, col):
return board[0][col] == 0
def get_next_open_row(board, col):
for r in range(ROWS - 1, -1, -1):
if board[r][col] == 0:
return r
طباعة اللوحة
لأغراض سطر الأوامر، يتم طباعة اللوحة بعد كل حركة لعرض الحالة الحالية للمباراة.
pythondef print_board(board):
print(np.flip(board, 0)) # لقلب اللوحة رأسياً لتطابق طريقة العرض الواقعية
التحقق من الفوز
الجزء الحاسم في اللعبة هو التحقق من تحقق الشرط الفائز: وجود أربع قطع متتالية للاعب نفسه. ويتم ذلك بالتحقق من:
-
صفوف أفقيًا.
-
أعمدة رأسيًا.
-
أقطار إيجابية (+).
-
أقطار سلبية (-).
pythondef winning_move(board, piece):
# التحقق أفقيًا
for c in range(COLUMNS - 3):
for r in range(ROWS):
if all(board[r][c+i] == piece for i in range(4)):
return True
# التحقق رأسيًا
for c in range(COLUMNS):
for r in range(ROWS - 3):
if all(board[r+i][c] == piece for i in range(4)):
return True
# التحقق قطريًا (+)
for c in range(COLUMNS - 3):
for r in range(ROWS - 3):
if all(board[r+i][c+i] == piece for i in range(4)):
return True
# التحقق قطريًا (-)
for c in range(COLUMNS - 3):
for r in range(3, ROWS):
if all(board[r-i][c+i] == piece for i in range(4)):
return True
return False
دورة اللعب
تنفيذ منطق تبادل الأدوار بين اللاعبين، وإدخال الأعمدة من المستخدم، مع معالجة الحالات غير الصالحة (عمود ممتلئ، أو رقم غير صحيح).
pythonimport sys
def play_game():
board = create_board()
game_over = False
turn = 0 # 0 يعني اللاعب الأول، 1 يعني اللاعب الثاني
while not game_over:
print_board(board)
player = turn + 1
try:
col = int(input(f"اللاعب {player}، اختر عمودًا (0-6): "))
except ValueError:
print("يرجى إدخال رقم صحيح.")
continue
if col < 0 or col >= COLUMNS:
print("رقم العمود خارج النطاق.")
continue
if is_valid_location(board, col):
row = get_next_open_row(board, col)
drop_piece(board, row, col, player)
if winning_move(board, player):
print_board(board)
print(f"اللاعب {player} فاز باللعبة!")
game_over = True
else:
turn = (turn + 1) % 2
else:
print("العمود ممتلئ، اختر عمودًا آخر.")
الجدول التالي يوضح القيم المستخدمة في اللعبة
| الرمز | المعنى |
|---|---|
| 0 | خانة فارغة |
| 1 | قرص اللاعب الأول |
| 2 | قرص اللاعب الثاني |
تحسين تجربة المستخدم
يمكن تطوير نسخة محسّنة من اللعبة من خلال:
-
استخدام الألوان في سطر الأوامر باستخدام مكتبة مثل
coloramaلإظهار الأقراص بلون مختلف لكل لاعب. -
إضافة التحقق من التعادل: إذا امتلأت كل الخانات دون فوز أي لاعب.
-
بناء واجهة رسومية باستخدام
pygameلعرض اللعبة بشكل بصري وجذاب.
إضافة التحقق من التعادل
pythondef is_draw(board):
return all(board[0][col] != 0 for col in range(COLUMNS))
وإضافته في المنطق الرئيسي:
pythonif is_draw(board):
print_board(board)
print("انتهت اللعبة بالتعادل!")
game_over = True
إمكانيات التوسعة المستقبلية
برمجة لعبة “أربع نقاط في صف واحد” بلغة بايثون لا تمثل مجرد تطبيق بسيط، بل هي قاعدة يمكن البناء عليها لتطوير مهارات البرمجة، ومن خلال هذا المشروع يمكن التوسع في العديد من الجوانب:
-
الذكاء الاصطناعي: يمكن إضافة خصم آلي يستخدم خوارزميات مثل Minimax لتحديد أفضل حركة.
-
التفاعل الشبكي: إنشاء نسخة تلعب عبر الشبكة باستخدام بروتوكولات TCP أو HTTP.
-
تسجيل الإحصائيات: حفظ نتائج اللاعبين باستخدام ملفات JSON أو قاعدة بيانات SQLite.
-
تصميم واجهة باستخدام Tkinter أو PyQt: لمن يفضل بيئة تطبيق سطح المكتب.
الخاتمة
برمجة لعبة “أربع نقاط في صف واحد” باستخدام لغة بايثون تُعدّ تمرينًا مثاليًا لتجربة مفاهيم البرمجة العملية في مشروع متكامل. يجمع هذا النوع من المشاريع بين البنية المنطقية، وتصميم الخوارزميات، وتنظيم الكود، مما يُكسب المبرمج المبتدئ أو المتوسط خبرة قوية في هيكلة التطبيقات الحقيقية. إن تنفيذ اللعبة بلغة بايثون على سطر الأوامر يُعتبر مدخلًا رائعًا، ويمكن التوسعة عليه لاحقًا باستخدام واجهات رسومية أو تقنيات الذكاء الاصطناعي، مما يفتح آفاقًا أوسع للتعلم والتطوير.
المراجع:
-
Python Documentation: https://docs.python.org/3/
-
NumPy Documentation: https://numpy.org/doc/

