البرمجة

برمجة لعبة حجر ورقة مقص

برمجة لعبة حجرة ورقة مقص باستخدام لغة بايثون: دليل شامل ومفصل

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


مقدمة عن لعبة حجرة ورقة مقص وقواعدها

تقوم اللعبة على اختيار كل لاعب واحدًا من ثلاثة خيارات:

  • الحجرة (Rock): تفوز على المقص، لكنها تخسر أمام الورقة.

  • الورقة (Paper): تفوز على الحجرة، لكنها تخسر أمام المقص.

  • المقص (Scissors): يفوز على الورقة، لكنه يخسر أمام الحجرة.

تُعد قواعد اللعبة بسيطة جدًا، لكنها تشكل حالة مثالية لتعليم المنطق البرمجي والبرمجة التفاعلية، لأنها تتطلب مقارنة مدخلات مختلفة واتخاذ قرارات بناءً عليها.


بيئة البرمجة: لغة بايثون

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

  • قراءة مدخلات المستخدم

  • تنفيذ شروط متعددة (if-else)

  • استخدام الحلقات التكرارية

  • توليد أرقام عشوائية

  • تنظيم الكود في دوال


الخطوات التفصيلية لبرمجة لعبة حجرة ورقة مقص

1. استيراد المكتبات اللازمة

لأن اللعبة تحتاج إلى توليد اختيار عشوائي للحاسوب، فيجب استخدام مكتبة random المدمجة في بايثون.

python
import random

2. تعريف خيارات اللعبة

يمكن تعريف الخيارات الثلاثة في قائمة (list) لتسهيل التعامل معها عند اختيار اللاعب أو الحاسوب.

python
choices = ["حجرة", "ورقة", "مقص"]

3. أخذ مدخلات المستخدم والتحقق منها

يتم طلب اختيار اللاعب من خلال إدخال نصي، ويجب التأكد من صحة الإدخال (أي أن يكون من ضمن الخيارات المتاحة). لتجنب الخطأ في حالة وجود اختلاف في الحروف الكبيرة والصغيرة، يمكن استخدام lower() أو توحيد الشكل.

python
player_choice = input("اختر: حجرة، ورقة، أو مقص: ").strip() while player_choice not in choices: print("اختيار غير صالح، يرجى المحاولة مرة أخرى.") player_choice = input("اختر: حجرة، ورقة، أو مقص: ").strip()

4. اختيار الحاسوب عشوائيًا

نستخدم دالة random.choice لاختيار خيار عشوائي من القائمة.

python
computer_choice = random.choice(choices) print(f"اختيار الحاسوب: {computer_choice}")

5. تحديد الفائز

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

  • إذا كانا متماثلين، تكون النتيجة تعادل.

  • إذا كان اللاعب اختار الحجرة والكمبيوتر المقص، يفوز اللاعب.

  • وهكذا لباقي الحالات.


6. هيكلية دالة تحديد النتيجة

لتسهيل التحكم، يمكن كتابة دالة خاصة لتحديد الفائز:

python
def determine_winner(player, computer): if player == computer: return "تعادل" elif (player == "حجرة" and computer == "مقص") or \ (player == "ورقة" and computer == "حجرة") or \ (player == "مقص" and computer == "ورقة"): return "فوز اللاعب" else: return "فوز الحاسوب"

7. دمج كل الأجزاء معًا في البرنامج النهائي

python
import random choices = ["حجرة", "ورقة", "مقص"] def determine_winner(player, computer): if player == computer: return "تعادل" elif (player == "حجرة" and computer == "مقص") or \ (player == "ورقة" and computer == "حجرة") or \ (player == "مقص" and computer == "ورقة"): return "فوز اللاعب" else: return "فوز الحاسوب" def play_game(): player_choice = input("اختر: حجرة، ورقة، أو مقص: ").strip() while player_choice not in choices: print("اختيار غير صالح، يرجى المحاولة مرة أخرى.") player_choice = input("اختر: حجرة، ورقة، أو مقص: ").strip() computer_choice = random.choice(choices) print(f"اختيار الحاسوب: {computer_choice}") result = determine_winner(player_choice, computer_choice) print(f"النتيجة: {result}") if __name__ == "__main__": play_game()

تطويرات وإضافات على اللعبة

1. إضافة ميزة اللعب المتكرر

بدلاً من إنهاء اللعبة بعد جولة واحدة، يمكن وضع اللعبة ضمن حلقة تكرارية تتيح للاعب تكرار اللعب عدة مرات.

python
def play_game(): while True: player_choice = input("اختر: حجرة، ورقة، أو مقص (أو 'خروج' لإنهاء): ").strip() if player_choice == "خروج": print("شكراً للعب!") break if player_choice not in choices: print("اختيار غير صالح، يرجى المحاولة مرة أخرى.") continue computer_choice = random.choice(choices) print(f"اختيار الحاسوب: {computer_choice}") result = determine_winner(player_choice, computer_choice) print(f"النتيجة: {result}\n")

2. تسجيل عدد الفوز والخسارة والتعادل

لزيادة تفاعل المستخدم ومعرفة أدائه، يمكن تتبع عدد مرات الفوز والخسارة والتعادل.

python
def play_game(): wins = 0 losses = 0 draws = 0 while True: player_choice = input("اختر: حجرة، ورقة، أو مقص (أو 'خروج' لإنهاء): ").strip() if player_choice == "خروج": print(f"الإحصائيات: فوز = {wins}, خسارة = {losses}, تعادل = {draws}") print("شكراً للعب!") break if player_choice not in choices: print("اختيار غير صالح، يرجى المحاولة مرة أخرى.") continue computer_choice = random.choice(choices) print(f"اختيار الحاسوب: {computer_choice}") result = determine_winner(player_choice, computer_choice) print(f"النتيجة: {result}\n") if result == "فوز اللاعب": wins += 1 elif result == "فوز الحاسوب": losses += 1 else: draws += 1

3. استخدام القواميس لتحسين كفاءة الكود

يمكن تبسيط منطق تحديد الفائز باستخدام القواميس (Dictionaries) التي تحدد الفائز حسب الأزواج.

python
winning_cases = { "حجرة": "مقص", "ورقة": "حجرة", "مقص": "ورقة" } def determine_winner(player, computer): if player == computer: return "تعادل" elif winning_cases[player] == computer: return "فوز اللاعب" else: return "فوز الحاسوب"

شرح علمي لمفاهيم البرمجة المستخدمة في اللعبة

1. المتغيرات وأنواع البيانات

يُستخدم المتغير choices لتخزين قائمة الخيارات، وهو نوع بيانات قائمة (List) تسمح بتخزين عدة قيم في متغير واحد. كما تُستخدم المتغيرات player_choice و computer_choice لتخزين القيم النصية التي تمثل اختيار كل من اللاعب والحاسوب.

2. حلقات التكرار

حلقة while تُستخدم لإعادة الطلب من المستخدم اختيار valid (صحيح) أو للعب مرات متعددة حسب اختيار المستخدم.

3. شروط التحكم

الشرط if-elif-else يحدد تدفق البرنامج ويقرر النتيجة بناءً على اختيار اللاعب واختيار الحاسوب. هذا يتيح معالجة كافة الحالات المحتملة وفق قواعد اللعبة.

4. دوال (Functions)

دالة determine_winner توضح أهمية تقسيم البرنامج إلى وحدات صغيرة يمكن إعادة استخدامها، كما تجعل الكود أكثر تنظيماً ووضوحاً.

5. مكتبة عشوائية (random)

باستخدام random.choice يتم اختيار قيمة عشوائية من قائمة، ما يجعل اللعب مع الحاسوب عشوائياً وغير متوقع، وهو ما يحاكي سلوك المنافس الحقيقي.


توضيح الجدول الخاص بحالات الفوز والخسارة

اختيار اللاعب اختيار الحاسوب النتيجة
حجرة مقص فوز اللاعب
حجرة ورقة فوز الحاسوب
ورقة حجرة فوز اللاعب
ورقة مقص فوز الحاسوب
مقص ورقة فوز اللاعب
مقص حجرة فوز الحاسوب
نفس الاختيار نفس الاختيار تعادل

استنتاجات عامة

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


المصادر والمراجع

  1. Python Documentation – الموقع الرسمي للغة بايثون والذي يشرح بشكل مفصل مكتبة random وأنواع البيانات والدوال:

    https://docs.python.org/3/library/random.html

  2. W3Schools Python Tutorial – دليل تعليمي تفاعلي في بايثون، يقدم شروحات مبسطة للمتغيرات، الحلقات، الشروط والدوال:

    https://www.w3schools.com/python/


بهذا التفصيل الكامل يمكن لأي مهتم ببرمجة الألعاب البسيطة أن يبدأ مشروعه في بايثون بثقة، ويطور مهاراته البرمجية بشكل منظم وعلمي.