تعلم البرمجة مع Python


الدرس: TP : كلها في ZCasino


الصفحة السابقة
حانت ساعة الحقيقة! في هذا العمل العملي الأول ، سأُظهر قسوتي اللامحدودة من خلال السماح لك بالذهاب إلى الطبيعة ... أو تقريبًا. هذا ليس مختبرك الأول تمامًا ، بمعنى أن منهج الفصل الرابع المتعلق بالظروف كان أول تجربة لك في هذا الموضوع. لكن ، في تلك المرحلة ، لم نقم بتنفيذ… برنامج ترفيهي للغاية.

هذه المرة ، سنبدأ في تطوير لعبة كازينو صغيرة. سوف تجد تفاصيل البيان أدناه ، بالإضافة إلى بعض النصائح لتنفيذ هذا العمل العملي.

إذا شعرت خلال هذا المختبر أنك تفتقر إلى معرفة معينة ، فارجع إلى الوراء ؛ خذ كل وقتك ، لسنا في عجلة من أمرنا!

موضوعنا



سنحاول في هذا الفصل عمل برنامج صغير نسميه ZCasino . ستكون لعبة روليت صغيرة مبسطة للغاية يمكنك من خلالها المراهنة بمبلغ معين والفوز أو خسارة المال (مثل الثروة ، في الكازينو!). عندما ينفد المال ، تكون قد خسرت.

حكمنا في اللعبة


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

  • يراهن اللاعب على رقم بين 0 و 49 (إجمالي 50 رقمًا). باختيار رقمه ، يقوم بإيداع المبلغ الذي يرغب في الرهان عليه.
  • تتكون الروليت من 50 مربعًا تتراوح بشكل طبيعي من 0 إلى 49. حتى الأرقام سوداء ، والأرقام الفردية حمراء. يقوم مدير اللعب بإطلاق عجلة الروليت ، وإطلاق الكرة وعندما تتوقف عجلة الروليت ، يلاحظ رقم الصندوق الذي توقفت فيه الكرة. في برنامجنا ، لن نغطي كل هذه التفاصيل "المادية" ، ولكن هذه التفسيرات مخصصة أيضًا لأولئك الذين حالفهم الحظ لتجنب غرف الكازينو حتى الآن. الرقم الذي هبطت عليه الكرة هو بالطبع الرقم الفائز.
  • إذا كان الرقم الفائز هو الرقم الذي راهن عليه اللاعب (احتمال 1/50 ، منخفض إلى حد ما) ، يعطيه الموزع 3 أضعاف مبلغ الرهان.
  • خلاف ذلك ، يتطلع التاجر لمعرفة ما إذا كان الرهان على الرقم من قبل اللاعب هو نفس الرقم الفائز (سواء كان كلاهما زوجي أو كلاهما فردي). إذا كان الأمر كذلك ، فإن الموزع يعطيه 50٪ من مبلغ الرهان. إذا لم يكن الأمر كذلك ، يخسر اللاعب رهانه.
في السيناريوهين الرابحين الموضحين أعلاه (رقم الرهان والرقم الفائز متطابقان أو لهما نفس المجموعة) ، يعطي الموزع للاعب المبلغ الذي راهن به في البداية قبل إضافة أرباحه. هذا يعني أنه في هذين السيناريوهين يستعيد اللاعب المال. في الحالة الثالثة فقط يخسر مبلغ الرهان. سنستخدم عملة الدولار $ .

دعونا ننظم مشروعنا



بالنسبة لهذا المشروع ، لن نكتب وحدة. سنستخدم تلك الموجودة في Python ، والتي تعد كافية تمامًا في الوقت الحالي ، ولا سيما تلك التي تسمح بتوليد أعداد عشوائية ، والتي سأقدمها أدناه. في غضون ذلك ، لا تحرم نفسك من إنشاء دليل ووضع الملف هناك ZCasino.py، فسيتم تشغيل كل شيء هنا.

يمكنك كتابة البرنامج ZCasino كما هو موضح في الجزء الأول دون صعوبة ... إلا لتوليد أرقام عشوائية. كرست Python وحدة كاملة لتوليد عناصر شبه عشوائية ، الوحدة النمطية random .

الوحدة random


في هذه الوحدة ، سنكون مهتمين بشكل خاص بالوظيفة randrange التي يمكن استخدامها بطريقتين:

  • من خلال تحديد معامل واحد فقط (  randrange(6) إرجاع رقم عشوائي بين 0 و 5) ؛
  • تحديد معلمتين ( randrange(1, 7) : إرجاع رقم عشوائي بين 1 و 6 ، وهو أمر مفيد ، على سبيل المثال ، لإعادة إنتاج تجربة ذات قالب من ستة جوانب) .
لرسم رقم عشوائي بين 0 و 49 وبالتالي محاكاة تجربة لعب الروليت ، سنستخدم التعليمات randrange(50) .

هناك طرق أخرى لاستخدامها ، randrange لكننا لن نحتاج إليها هنا ، بل أود أن أقول إن الاستخدام الأول فقط لهذا البرنامج سيكون مفيدًا لك.

لا تتردد في إجراء بعض الاختبارات في مترجم الأوامر (لم تنسَ مكانه ، أليس كذلك؟) وجرب عدة صيغ للوظيفة randrange . أذكرك أنه موجود في الوحدة النمطية random، لا تنسَ استيراده.

تقريب رقم


ربما لاحظت ذلك بشكل صحيح ، في شرح القواعد التي حددتها أنه إذا راهن اللاعب على اللون المناسب ، فسيحصل على 50٪ من حصته. نعم ، ولكن ... لا يزال من الأفضل العمل مع الأعداد الصحيحة. إذا راهن اللاعب على 3 دولارات ، على سبيل المثال ، يتم إرجاعه بمقدار 1.5 دولار. لا يزال هذا مقبولًا ، ولكن إذا استمر ذلك ، فهناك خطر في أن ينتهي بنا المطاف بأرقام ذات فاصلة مع الكثير من الأرقام بعد الفاصلة العشرية. لذلك يمكنك أيضًا التقريب إلى الرقم التالي. وبالتالي ، إذا راهن اللاعب على 3 دولارات ، فسيتم إرجاعه بمقدار 2 دولار. لذلك ، سوف نستخدم دالة math مسماة للوحدة ceil . سأدعك تشاهد ما تفعله ، لا يوجد شيء معقد.

دوركم الآن



أنت هنا ، لديك كل المفاتيح في متناول اليد لترميز هذا البرنامج. خذ الوقت الذي تحتاجه للوصول إلى هناك ، ولا تتسرع في التصحيح ، فهدف المختبر هو أن تتعلم كتابة برنامج بنفسك ... وهذا ليس صعبًا للغاية. إذا كنت تواجه مشكلة في تفكيك البرنامج ، فلا تندمج فجأة. ولا تتردد في مراجعة المترجم الفوري لاختبار الميزات: إنها حقًا فرصة أتيحت لك ، لا تدعها تمر.

دوركم الآن !

تصحيح!



مرة أخرى ، حان الوقت لمقارنة إصداراتنا. ومرة أخرى ، من غير المحتمل أن يكون لديك نفس الكود الخاص بي. لذلك إذا كان عملك يعمل ، سأقول أن هذا هو جوهرة. إذا واجهت صعوبات لا يمكن التغلب عليها ، فالحل هنا لمساعدتك.

… تنبيه… ها هو… الحل!


# وهي لعبة روليتZCasino  يحتوي هذا الملف على كود 
import os
from random import randrange
from math import ceil

# إعلان متغيرات البداية
argent = 1000 # لدينا 1000 دولار في بداية اللعبة
continuer_partie = True # قيمة منطقية وهي صحيحة طالما أننا مضطرون لذلك                        

print("أنت تجلس على طاولة الروليت مع ", argent, "$.")

while continuer_partie: # طالما علينا مواصلة اللعبة
    # يُطلب من المستخدم إدخال الرقم الذي
    # سيراهن عليه
    nombre_mise = -1
    while nombre_mise < 0 or nombre_mise > 49:
        nombre_mise = input("اكتب الرقم الذي تريد المراهنة عليه (بين 0 و 49) : ")
        try:
            nombre_mise = int(nombre_mise)
        except ValueError:
            print("لم تقم بإدخال رقم ")
            nombre_mise = -1
            continue
        if nombre_mise < 0:
            print("هذا الرقم سلبي ")
        if nombre_mise > 49:
            print("هذا الرقم أكبر من 49")

    # À présent, on sélectionne la somme à miser sur le nombre
    mise = 0
    while mise <= 0 or mise > argent:
        mise = input("أدخل مبلغ رهانك: ")
        # On convertit la mise
        try:
            mise = int(mise)
        except ValueError:
            print("لم تقم بإدخال رقم ")
            mise = -1
            continue
        if mise <= 0:
            print("الرهان الذي تم إدخاله سلبي أو صفر.")
        if mise > argent:
            print("لا يمكنك المراهنة على هذا القدر ، لديك فقط ", argent, "$")

    # تم اختيار رقم الرهان والرهان بواسطة
    # المستخدم ، نقوم بتدوير العجلة
    numero_gagnant = randrange(50)
    print("عجلة الروليت تدور ... ... وتتوقف عند الرقم ", numero_gagnant)

    # نؤسس مكاسب اللاعب
    if numero_gagnant == nombre_mise:
        print("تهانينا! تحصلت على ", mise * 3, "$ !")
        argent += mise * 3
    elif numero_gagnant % 2 == nombre_mise % 2: # ils sont de la même couleur
        mise = ceil(mise * 0.5)
        print("أنت تراهن على اللون المناسب. و تحصل على", mise, "$")
        argent += mise
    else:
        print("آسف يا صديقي ، ليس لهذا الوقت. تخسر رهانك.")
        argent -= mise

    # On interrompt la partie si le joueur est ruiné
    if argent <= 0:
        print("لقد دمرت! إنها نهاية اللعبة.")
        continuer_partie = False
    else:
        # نعرض أموال اللاعب
        print("لديك الآن ", argent, "$")
        quitter = input("هل ترغب في مغادرة الكازينو (y/n) ? ")
        if quitter == "y" or quitter == "Y":
            print("تغادر الكازينو مع أرباحك.")
            continuer_partie = False

# نوقف النظام (Windows)
os.system("pause")
 
مرة أخرى ، لا تنس السطر الذي يحدد الترميز إذا كنت تريد تجنب المفاجآت.

الشيء الوحيد الذي قد يفاجئك هو بناء حلقات لاختبار ما إذا كان اللاعب قد أدخل قيمة صحيحة (عندما تطلب من المستخدم كتابة رقم بين 0 و 49 على سبيل المثال ، تأكد من أنه فعل جيدا). الأمر بسيط للغاية في الواقع: تنتظر حتى يقوم اللاعب بإدخال رقم. إذا كان الرقم غير صالح ، يُطلب من اللاعب مرة أخرى إدخال هذا الرقم. انتهزت الفرصة لاستخدام مفهوم الاستثناءات للتحقق من أن المستخدم يقوم بإدخال رقم. كما رأيت ، إذا لم يكن الأمر كذلك ، فسيتم عرض رسالة خطأ. يتم إعادة تعيين قيمة المتغير الذي يحتوي على الرقم -1 )أي القيمة التي تخبر الحلقة بأننا لم نحصل على continue لتخطي الإرشادات الأخرى في الكتلة (وإلا سترى رسالة أخرى تشير إلى أن الرقم الذي تم إدخاله سالب ... فمن العملي أكثر بهذه الطريقة). بهذه الطريقة ، إذا قدم المستخدم بيانات غير قابلة للتحويل ، فلن تتعطل اللعبة ويطلب منهم ببساطة كتابة قيمة صالحة مرة أخرى.

الحلقة الرئيسية تعمل حول منطقية. نستخدم متغيرًا مسمىًا continuer_partie يكون "صحيحًا" طالما يتعين علينا مواصلة اللعبة. بمجرد أن تنتهي اللعبة ، تصبح "خطأ" . تعمل الحلقة الخاصة بنا ، التي تدير تقدم اللعبة ، على هذا المنطقي ؛ لذلك ، بمجرد أن يتغير إلى "خطأ" ، تنتهي الحلقة ويتوقف البرنامج مؤقتًا. كل شيء آخر يجب عليك اكتشافه دون مساعدة ، التعليقات هنا للشرح. إذا كانت لديك أي شكوك ، فيمكنك اختبار سطور التعليمات الإشكالية في بايثون: مرة أخرى ، لا تنس هذه الأداة.

و الآن ؟



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

حسنًا ، هذا كل شيء عن الأساسيات. من الجزء التالي ، نتناول OOP ، البرمجة الشيئية ، وهو مفهوم رائع بصراحة وقوي للغاية في Python . سوف تتعلم بشكل خاص كيفية التعامل مع أنواع جديدة من البيانات ، خاصة القوائم والقواميس والملفات ... هل تجعلك لا تريد ذلك؟