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


الدرس: TP : اصنع جلادًا قديمًا


الصفحة السابقة
حان الوقت الآن لتطبيق ما تعلمته. لن تحتاج إلى كل شيء ، بالطبع ، لكنني سأحاول أن أجعلك تعمل قدر الإمكان.

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

مهمتك



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

لعبة الجلاد


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

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

سيكون من السهل حساب نقاط اللاعب: نأخذ النتيجة الحالية (0 إذا لم يكن اللاعب قد سجل أي نتيجة بالفعل) ، ولكل لعبة ، نضيف عدد الحركات المتبقية كنقاط لعبة. على سبيل المثال ، إذا كان لدي ثلاث ضربات متبقية في الوقت الذي أجد فيه الكلمة ، فسأربح ثلاث نقاط.

بعد ذلك ، يمكنك الاستمتاع بعمل إحصاء أكثر تفصيلاً للنتيجة ، وهذا يكفي الآن.

الجانب التقني للمشكلة


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

  • الملف  donnees.py الذي سيحتوي على المتغيرات اللازمة لتطبيقنا (قائمة الكلمات ، عدد الفرص المسموح بها ...).
  • الملف fonctions.py الذي سيحتوي على الوظائف المفيدة لتطبيقنا. هناك ، لا أجعلك قائمة واضحة ، أنصحك بالتفكير في الأمر جيدًا ، مع ورقة وقلم إذا كان ذلك يساعدك (ما هي إجراءات برنامجي؟ ما الذي يمكنني وضعه في الوظائف؟).
  • أخيرًا ، ملفنا pendu.py الذي سيحتوي على لعبة الجلاد الخاصة بنا.

إدارة النتائج


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

يجب إدارة الحالات التالية:

  • الملف غير موجود. هناك ، قمنا بإنشاء قاموس فارغ ، ولم يتم العثور على أي نتيجة.
  • المشغل غير موجود في القاموس. في هذه الحالة ، نضيفها بعلامة 0 .

دوركم الآن


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

حظا سعيدا !

التصحيح المقترح



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

هذا هو كود الملفات الثلاثة.

donnees.py


""" يعرف هذا الملف بعض البيانات في شكل متغيرات ،
مفيد لبرنامج الجلاد """

# عدد المحاولات لكل لعبة
nb_coups = 8

# اسم الملف الذي تم تخزين الدرجات
nom_fichier_scores = "scores"

# قائمة كلمات الجلاد
liste_mots = [
    "armoire",
    "boucle",
    "buisson",
    "bureau",
    "chaise",
    "carton",
    "couteau",
    "fichier",
    "garage",
    "glace",
    "journal",
    "kiwi",
    "lampe",
    "liste",
    "montagne",
    "remise",
    "sandale",
    "taxi",
    "vampire",
    "volant",
]
 

fonctions.py


""" يحدد هذا الملف وظائف مفيدة لبرنامج الجلاد.

 donnees.py  نحن نستخدم بيانات البرنامج الواردة في  """

import os
import pickle
from random import choice

from donnees import *

# Gestion des scores

def recup_scores():
    """ تقوم هذه الوظيفة باسترداد الدرجات المسجلة إذا كان الملف موجودًا.
    في كل الأحوال نعيد القاموس ،
    (unpickled) إما الكائن غير المخلوط ,
    قاموس فارغ.

    data.py المحدد في nom_fichier_scores نحن نعتمد على """
    
    if os.path.exists(nom_fichier_scores): # الملف موجود
        # نعيدها
        fichier_scores = open(nom_fichier_scores, "rb")
        mon_depickler = pickle.Unpickler(fichier_scores)
        scores = mon_depickler.load()
        fichier_scores.close()
    else: # الملف غير موجود
        scores = {}
    return scores

def enregistrer_scores(scores):
    """ هذه الوظيفة مسؤولة عن تسجيل الدرجات في الملف.
    يتلقى قاموس الدرجات كمعامل nom_fichier_scores
    للحفظ """

    fichier_scores = open(nom_fichier_scores, "wb") # نقوم بالكتابة فوق الدرجات القديمة
    mon_pickler = pickle.Pickler(fichier_scores)
    mon_pickler.dump(scores)
    fichier_scores.close()

# وظائف إدارة العناصر التي يدخلها المستخدم

def recup_nom_utilisateur():
    """الوظيفة المسؤولة عن استرجاع اسم المستخدم.
     يجب أن يتكون اسم المستخدم من 4 أحرف على الأقل ،
     ارقام وحروف حصريا.

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

    nom_utilisateur = input("اكتب اسمك: ")
    # نضع الحرف الأول بالأحرف الكبيرة والآخرون بالأحرف الصغيرة
    nom_utilisateur = nom_utilisateur.capitalize()
    if not nom_utilisateur.isalnum() or len(nom_utilisateur)<4:
        print("هذا الاسم غير صالح.")
        # نسمي الوظيفة مرة أخرى للحصول على اسم آخر
        return recup_nom_utilisateur()
    else:
        return nom_utilisateur

def recup_lettre():
""" تسترد هذه الوظيفة الحرف الذي تم إدخاله بواسطة
     المستخدم. إذا لم تكن السلسلة المسترجعة حرفًا ،
     نسمي الدالة بشكل متكرر حتى نحصل على حرف """

    lettre = input("اكتب حرفا: ")
    lettre = lettre.lower()
    if len(lettre)>1 or not lettre.isalpha():
        print("لم تقم بإدخال حرف صحيح.")
        return recup_lettre()
    else:
        return lettre

# وظائف لعبة الجلاد

def choisir_mot():
    """ هذه الوظيفة بإرجاع الكلمة المختارة في قائمة الكلمات
     قائمة الكلمات.

     نستخدم وظيفة الاختيار للوحدة العشوائية (انظر التعليمات)."""
    
    return choice(liste_mots)

def recup_mot_masque(mot_complet, lettres_trouvees):
    """ بإرجاع الكلمة المخفية كليًا أو جزئيًا ، اعتمادًا على:
     - الكلمة الأصلية (type str)
     - الحروف موجودة بالفعل (قائمة النوع)

     نعيد الكلمة الأصلية مع استبدال الأحرف نحن
     لم يتم العثور عليها بعد."""
    
    mot_masque = ""
    for lettre in mot_complet:
        if lettre in lettres_trouvees:
            mot_masque += lettre
        else:
            mot_masque += "*"
    return mot_masque
 

pendu.py


""" يحتوي هذا الملف على لعبة الجلاد.

يعتمد على الملفات   :
   - donnees.py
   - fonctions.py"""


from donnees import *
from fonctions import *

# نقوم بجمع نتائج اللعبة
scores = recup_scores()

# نحصل على اسم مستخدم
utilisateur = recup_nom_utilisateur()

# إذا لم يكن لدى المستخدم درجة حتى الآن ، نضيفها
if utilisateur not in scores.keys():
    scores[utilisateur] = 0 # 0 نقطة للبدء

# المتغير لدينا لمعرفة متى تتوقف اللعبة
continuer_partie = 'y'

while continuer_partie != 'n':
    print("اللاعب {0}: {1} نقطة ".format(utilisateur, scores[utilisateur]))
    mot_a_trouver = choisir_mot()
    lettres_trouvees = []
    mot_trouve = recup_mot_masque(mot_a_trouver, lettres_trouvees)
    nb_chances = nb_coups
    while mot_a_trouver!=mot_trouve and nb_chances>0:
        print("كلمة للبحث عن {0} (لا تزال فرصًا {1})".format(mot_trouve, nb_chances))
        lettre = recup_lettre()
        if lettre in lettres_trouvees: # تم بالفعل اختيار الرسالة
            print("لقد اخترت بالفعل هذه الرسالة.")
        elif lettre in mot_a_trouver: # الرسالة موجودة في الكلمة لتجد
            lettres_trouvees.append(lettre)
            print("احسنت.")
        else:
            nb_chances -= 1
            print("... لا ، هذه الرسالة ليست في الكلمة ...")
        mot_trouve = recup_mot_masque(mot_a_trouver, lettres_trouvees)

    # هل وجدنا الكلمة أم فرصنا استنفدت؟
    if mot_a_trouver==mot_trouve:
    print("تهانينا! لقد عثرت على كلمة {0}.".format(mot_a_trouver))
    else:
        print("معلق !!! لقد خسرت.")

    # نقوم بتحديث نقاط المستخدم
    scores[utilisateur] += nb_chances

    continuer_partie = input(" هل ترغب في مواصلة اللعبة؟ (Y / N ) ")
    continuer_partie = continuer_partie.lower()

# انتهت اللعبة ، نسجل النتائج
enregistrer_scores(scores)

# نعرض نتائج المستخدم
print("تنتهي اللعبة بـ {0} نقطة.".format(scores[utilisateur]))
 

ملخص


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

مع هذا المثال ، أتمنى أن تتعود على توثيق ملفاتك ووظائفك قدر الإمكان. إنه حقًا رد فعل جيد.