البرمجة

برمجة لعبة أربع نقاط ببايثون

برمجة لعبة أربع نقاط في صف واحد Four-in-a-Row باستخدام لغة بايثون

تُعدّ الألعاب البسيطة مثل “أربع نقاط في صف واحد” (Four-in-a-Row) من المشاريع الممتازة لتعلّم أساسيات البرمجة، إذ تجمع بين مفاهيم البرمجة الكائنية (OOP)، والتفاعل مع المستخدم، ومعالجة البيانات، وتصميم الخوارزميات، بطريقة عملية وتفاعلية. لعبة “أربع نقاط في صف واحد”، والمعروفة أيضًا باسم “Connect Four”، هي لعبة منطقية يتنافس فيها لاعبان بوضع أقراص في شبكة رأسية 6×7، بهدف تشكيل سلسلة متصلة من أربع قطع من نفس اللون أفقيًا، أو عموديًا، أو قطريًا. يتطلب تطوير هذه اللعبة بلغة بايثون فهمًا جيدًا لهيكلة الكود، والتعامل مع مصفوفات ثنائية الأبعاد، ومعالجة شروط الفوز، وتنظيم دورة اللعب بين اللاعبين.

هذا المقال يقدم شرحًا مفصلًا لكيفية برمجة لعبة Four-in-a-Row باستخدام لغة بايثون، انطلاقًا من تصميم الهيكل العام وحتى تنفيذ التفاصيل الدقيقة المتعلقة بالتفاعل بين اللاعبين.


مفهوم اللعبة وأساسياتها

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

مكونات اللعبة الأساسية:

  1. لوحة اللعب: عبارة عن مصفوفة ثنائية الأبعاد 6×7.

  2. الحركات: اللاعب يختار عمودًا، والبرنامج يُسقط قرصه في أقرب خانة فارغة في العمود.

  3. الفحص: بعد كل حركة، يجب التحقق من حالة الفوز.

  4. دورة اللعب: يتم التبديل بين اللاعبين بعد كل حركة.


إعداد بيئة التطوير

قبل الشروع في كتابة الكود، يجب التأكد من توفر بيئة بايثون مثبتة، ويمكن استخدام أي محرر نصوص مثل VS Code، أو PyCharm، أو حتى المحرر المدمج في Jupyter Notebook.

كما يمكن استخدام مكتبة خارجية بسيطة مثل numpy لتسهيل التعامل مع المصفوفات، بالإضافة إلى مكتبة pygame في حال رغبت في واجهة رسومية، ولكن هذا المقال يركز على تنفيذ اللعبة عبر واجهة سطر الأوامر (CLI).

bash
pip install numpy

بناء لوحة اللعبة

في البداية، يجب إنشاء مصفوفة تمثل الشبكة 6×7، وتهيئتها بالقيم صفر للدلالة على الخانات الفارغة.

python
import numpy as np ROWS = 6 COLUMNS = 7 def create_board(): return np.zeros((ROWS, COLUMNS), dtype=int)

إسقاط القرص في العمود

عند اختيار اللاعب للعمود، يجب التأكد من وجود خانة فارغة في العمود، ثم وضع الرقم الذي يمثل اللاعب (1 أو 2) في أول خانة متاحة من الأسفل.

python
def 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

طباعة اللوحة

لأغراض سطر الأوامر، يتم طباعة اللوحة بعد كل حركة لعرض الحالة الحالية للمباراة.

python
def print_board(board): print(np.flip(board, 0)) # لقلب اللوحة رأسياً لتطابق طريقة العرض الواقعية

التحقق من الفوز

الجزء الحاسم في اللعبة هو التحقق من تحقق الشرط الفائز: وجود أربع قطع متتالية للاعب نفسه. ويتم ذلك بالتحقق من:

  1. صفوف أفقيًا.

  2. أعمدة رأسيًا.

  3. أقطار إيجابية (+).

  4. أقطار سلبية (-).

python
def 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

دورة اللعب

تنفيذ منطق تبادل الأدوار بين اللاعبين، وإدخال الأعمدة من المستخدم، مع معالجة الحالات غير الصالحة (عمود ممتلئ، أو رقم غير صحيح).

python
import 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 قرص اللاعب الثاني

تحسين تجربة المستخدم

يمكن تطوير نسخة محسّنة من اللعبة من خلال:

  1. استخدام الألوان في سطر الأوامر باستخدام مكتبة مثل colorama لإظهار الأقراص بلون مختلف لكل لاعب.

  2. إضافة التحقق من التعادل: إذا امتلأت كل الخانات دون فوز أي لاعب.

  3. بناء واجهة رسومية باستخدام pygame لعرض اللعبة بشكل بصري وجذاب.


إضافة التحقق من التعادل

python
def is_draw(board): return all(board[0][col] != 0 for col in range(COLUMNS))

وإضافته في المنطق الرئيسي:

python
if is_draw(board): print_board(board) print("انتهت اللعبة بالتعادل!") game_over = True

إمكانيات التوسعة المستقبلية

برمجة لعبة “أربع نقاط في صف واحد” بلغة بايثون لا تمثل مجرد تطبيق بسيط، بل هي قاعدة يمكن البناء عليها لتطوير مهارات البرمجة، ومن خلال هذا المشروع يمكن التوسع في العديد من الجوانب:

  1. الذكاء الاصطناعي: يمكن إضافة خصم آلي يستخدم خوارزميات مثل Minimax لتحديد أفضل حركة.

  2. التفاعل الشبكي: إنشاء نسخة تلعب عبر الشبكة باستخدام بروتوكولات TCP أو HTTP.

  3. تسجيل الإحصائيات: حفظ نتائج اللاعبين باستخدام ملفات JSON أو قاعدة بيانات SQLite.

  4. تصميم واجهة باستخدام Tkinter أو PyQt: لمن يفضل بيئة تطبيق سطح المكتب.


الخاتمة

برمجة لعبة “أربع نقاط في صف واحد” باستخدام لغة بايثون تُعدّ تمرينًا مثاليًا لتجربة مفاهيم البرمجة العملية في مشروع متكامل. يجمع هذا النوع من المشاريع بين البنية المنطقية، وتصميم الخوارزميات، وتنظيم الكود، مما يُكسب المبرمج المبتدئ أو المتوسط خبرة قوية في هيكلة التطبيقات الحقيقية. إن تنفيذ اللعبة بلغة بايثون على سطر الأوامر يُعتبر مدخلًا رائعًا، ويمكن التوسعة عليه لاحقًا باستخدام واجهات رسومية أو تقنيات الذكاء الاصطناعي، مما يفتح آفاقًا أوسع للتعلم والتطوير.


المراجع:

  1. Python Documentation: https://docs.python.org/3/

  2. NumPy Documentation: https://numpy.org/doc/