مشروع Python: لعبة تخمين الرقم
أنهيت أساسيات Python! حان الوقت لتجمع كل ما تعلمته حتى الآن في مشروع حقيقي: لعبة يفكر فيها الكمبيوتر في رقم سري بين 1 و 100، وأنت تحاول تخمينه. بعد كل محاولة يخبرك البرنامج: «أكبر» أو «أصغر»، حتى تصل للرقم الصحيح. سنبني اللعبة خطوة بخطوة، وكل خطوة تستخدم مفهوماً من دروس سابقة.
الخطوة 1: الرقم العشوائي
Section titled “الخطوة 1: الرقم العشوائي”نحتاج أن يختار الكمبيوتر رقماً لا نعرفه. Python فيها مكتبة (Module) جاهزة اسمها random للأرقام العشوائية. المكتبة مثل صندوق أدوات إضافي، نستدعيه بالكلمة import:
import random
secret = random.randint(1, 100)print(secret)الدالة randint(1, 100) تختار رقماً صحيحاً عشوائياً بين 1 و 100، والرقمان 1 و 100 داخلان (على عكس range). شغّل الكود عدة مرات، وستحصل على رقم مختلف كل مرة.
الخطوة 2: محاولة واحدة
Section titled “الخطوة 2: محاولة واحدة”لنبدأ بأبسط نسخة: يخمّن المستخدم مرة واحدة، ونقارن تخمينه بالرقم السري:
import random
secret = random.randint(1, 100)guess = int(input("خمّن الرقم: "))
if guess < secret: print("أكبر من ذلك!")elif guess > secret: print("أصغر من ذلك!")else: print("صح! أحسنت")هنا استخدمنا input وتحويل الأنواع، والشروط if و elif و else.
الخطوة 3: التكرار حتى الفوز
Section titled “الخطوة 3: التكرار حتى الفوز”محاولة واحدة لا تكفي. نريد أن نكرر السؤال حتى يخمّن المستخدم الرقم الصحيح، ولا نعرف كم محاولة سيحتاج. إذن نستخدم while True مع break:
while True: guess = int(input("تخمينك: ")) if guess < secret: print("أكبر من ذلك!") elif guess > secret: print("أصغر من ذلك!") else: print("صح! أحسنت") breakالخطوة 4: عدّ المحاولات
Section titled “الخطوة 4: عدّ المحاولات”لنجعل اللعبة أكثر تحدياً، نعدّ عدد المحاولات بمتغير يبدأ من صفر، ونزيده بعد كل تخمين:
attempts = 0while True: guess = int(input("تخمينك: ")) attempts += 1 ...الخطوة 5: حماية اللعبة من الأخطاء
Section titled “الخطوة 5: حماية اللعبة من الأخطاء”ماذا لو كتب المستخدم «عشرة» بدلاً من 10؟ ستتوقف اللعبة بخطأ ValueError. نحميها بـ try و except، ونستخدم continue لإعادة السؤال دون احتساب محاولة. ونتأكد أيضاً أن الرقم بين 1 و 100.
اللعبة كاملة
Section titled “اللعبة كاملة”import random
secret = random.randint(1, 100)attempts = 0
print("فكرت في رقم بين 1 و 100. حاول أن تخمّنه!")
while True: text = input("تخمينك: ")
try: guess = int(text) except ValueError: print("من فضلك اكتب رقماً صحيحاً") continue
if guess < 1 or guess > 100: print("الرقم يجب أن يكون بين 1 و 100") continue
attempts += 1
if guess < secret: print("أكبر من ذلك!") elif guess > secret: print("أصغر من ذلك!") else: print(f"صح! الرقم هو {secret}، وعرفته في {attempts} محاولات") breakمثال على جولة لعب (لنفترض أن الرقم السري كان 42):
فكرت في رقم بين 1 و 100. حاول أن تخمّنه!تخمينك: 50أصغر من ذلك!تخمينك: 25أكبر من ذلك!تخمينك: عشرةمن فضلك اكتب رقماً صحيحاًتخمينك: 37أكبر من ذلك!تخمينك: 42صح! الرقم هو 42، وعرفته في 4 محاولاتلاحظ أن «عشرة» لم تُحسب محاولة، لأن continue أعادت السؤال قبل سطر attempts += 1.
ماذا استخدمنا من الكورس؟
Section titled “ماذا استخدمنا من الكورس؟”- المتغيرات لحفظ الرقم السري وعدد المحاولات.
inputوتحويل الأنواع لقراءة التخمين.- الشروط للمقارنة وتحديد «أكبر» أو «أصغر».
- حلقة
while Trueمعbreakوcontinue. tryوexceptلحماية اللعبة من الإدخال الخاطئ.- f-strings لرسالة الفوز.
- مكتبة
randomللرقم العشوائي.
جرّب بنفسك: طوّر اللعبة
Section titled “جرّب بنفسك: طوّر اللعبة”انسخ الكود في ملف guess.py وشغّله والعب عدة جولات. ثم جرّب هذه التطويرات واحداً تلو الآخر:
- حد أقصى للمحاولات: إذا وصل المستخدم إلى 7 محاولات بدون فوز، أخبره بالرقم وأنهِ اللعبة.
- مستويات صعوبة: اسأل المستخدم في البداية عن المستوى: سهل (1 إلى 10)، أو متوسط (1 إلى 100)، أو صعب (1 إلى 1000).
- العب مرة أخرى: بعد الفوز اسأل «هل تريد اللعب مرة أخرى؟»، وضع اللعبة كلها داخل حلقة أكبر.
- أفضل نتيجة: احفظ أقل عدد محاولات حققه اللاعب عبر الجولات.
أخطاء شائعة
Section titled “أخطاء شائعة”- وضع
random.randintداخل الحلقة: سيتغير الرقم السري مع كل تخمين، فتصبح اللعبة مستحيلة! اختره مرة واحدة قبل الحلقة. - زيادة العدّاد قبل التحقق من الإدخال: ستُحسب المحاولات الخاطئة. ضع
attempts += 1بعد التأكد من صحة الرقم. - نسيان
breakعند الفوز: تستمر اللعبة في السؤال للأبد.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ما الأرقام الممكنة من random.randint(1, 6)؟
randint تشمل الطرفين، فالنتيجة أي رقم من 1 إلى 6، مثل حجر النرد تماماً.
سؤال
لماذا استخدمنا continue بعد خطأ الإدخال؟
continue تعود لبداية الحلقة مباشرة، فتتخطى سطر زيادة المحاولات والمقارنة.
الخلاصة
Section titled “الخلاصة”import randomثمrandom.randint(أ, ب)يعطيك رقماً عشوائياً يشمل الطرفين.while Trueمعbreakمثالية لتكرار السؤال حتى يتحقق الهدف.tryوexceptمعcontinueتحمي البرنامج من الإدخال الخاطئ.- المشاريع الحقيقية تجمع عدة مفاهيم بسيطة معاً.
- اختر الرقم العشوائي مرة واحدة خارج الحلقة.