خطأ شائع في لغة بايثون عند إنشاء لعبة تخمين تفاعلية
عند تعلم لغة بايثون، أحد أكثر المشاريع إثارة هو بناء ألعاب تفاعلية مثل لعبة تخمين الأرقام. تساعدك مثل هذه المشاريع على فهم كيفية تفاعل Python مع مدخلات المستخدم واستخدام تدفق التحكم لتوجيه سلوك البرنامج. في هذه الحالة، الهدف هو جعل بايثون تطالب المستخدم بتخمين رقم بين 1 و100، وإعطاء ملاحظات للتخمين أعلى أو أقل، وأخيرًا، تأكيد وقت إجراء التخمين الصحيح.
ومع ذلك، كما هو الحال مع العديد من تمارين البرمجة، يمكن أن تنشأ أخطاء ليست واضحة على الفور. أحد الأخطاء التي قد تواجهها أثناء متابعة البرنامج التعليمي لـ Python، مثل الذي تعمل عليه، هو نوع (أنواع) المعاملات غير المدعومة لـ %: 'Math' و'tuple'. قد يكون هذا الأمر محبطًا، خاصة عندما يبدو بناء الجملة صحيحًا للوهلة الأولى.
في لعبة التخمين هذه، يحدث الخطأ الذي تواجهه عادةً عندما تحاول تنسيق سلسلة بشكل غير صحيح أثناء استخدام الرياضيات وظيفة في IPython.display مكتبة. وهذا خطأ شائع، ولكن الحل واضح ومباشر بمجرد تحديده.
سيرشدك هذا الدليل إلى معنى الخطأ وسبب حدوثه وكيف يمكنك تعديل كود Python الخاص بك لإصلاحه. في النهاية، سيكون لديك لعبة تخمين تعمل بكامل طاقتها دون ظهور رسالة خطأ مربكة!
يأمر | مثال للاستخدام |
---|---|
random.randint() | هذه الوظيفة من عشوائي تقوم المكتبة بإنشاء عدد صحيح عشوائي ضمن نطاق محدد. في لعبة التخمين، يتم استخدامها لتوليد رقم عشوائي بين 1 و100 ليتمكن المستخدم من تخمينه. مثال: Randint(1, 100). |
IPython.display.Math() | هذا الأمر من IPython.display يتم استخدام الوحدة لعرض التعبيرات الرياضية بطريقة منسقة. في الحل، يساعد في تنسيق الإخراج لعرض الرقم الصحيح وتخمين المستخدم. مثال: Math(f'Congratulations! الرقم الصحيح كان {a}'). |
unittest.mock.patch() | تُستخدم هذه الوظيفة لاستبدال وظيفة أو كائن في التعليمات البرمجية الخاصة بك بنسخة وهمية أثناء الاختبار. إنه مفيد بشكل خاص في اختبارات الوحدة لمحاكاة إدخال المستخدم دون تفاعل يدوي. مثال: @patch('builtins.input', Side_effect=[50, 75, 85, 95, 100]). |
unittest.TestCase | فئة أساسية في com.unittest الوحدة المستخدمة لإنشاء اختبارات الوحدة. فهو يوفر إطارًا لاختبار الوظائف الفردية للتأكد من أنها تعمل كما هو متوقع. مثال: فئة TestGuessingGame(unittest.TestCase). |
continue | يتم استخدام أمر التحكم في التدفق داخل الحلقات لتخطي التكرار الحالي والانتقال إلى التكرار التالي. في البرنامج النصي، يضمن استمرار البرنامج بعد اكتشاف خطأ ValueError بسبب إدخال غير صالح. مثال: استمر. |
try-except | تستخدم هذه البنية لمعالجة الأخطاء، وتسمح للبرنامج بمواصلة التشغيل حتى عند ظهور استثناء. في لعبة التخمين، تتعامل مع الإدخال غير الصالح من قبل المستخدمين الذين لا يقومون بإدخال أعداد صحيحة. مثال: حاول: ... باستثناء ValueError:. |
input() | تلتقط هذه الوظيفة إدخال المستخدم كسلسلة. في لعبة التخمين، يتم استخدامه لمطالبة المستخدم بإدخال تخمينه. يتم تحويل الإدخال لاحقًا إلى عدد صحيح. مثال: user_guess = int(input('خمن رقمًا بين 1 و100:')). |
f-string | تم تقديمه في بايثون 3.6، سلاسل f السماح بتنسيق سلسلة أسهل عن طريق تضمين التعبيرات مباشرة في السلسلة. وفي الحل، يتم استخدامها لتنسيق إخراج الرسالة النهائية. مثال: تهانينا! الرقم الصحيح كان {أ}'. |
unittest.main() | يقوم هذا الأمر بتشغيل مجموعة الاختبار في Python com.unittest نطاق. يتم استخدامه لاكتشاف الاختبارات المكتوبة للبرنامج وتشغيلها تلقائيًا. مثال: إذا كان __name__ == '__main__':unittest.main(). |
فهم الآليات الكامنة وراء كود لعبة التخمين في بايثون
تم تصميم البرنامج النصي للعبة التخمين Python للسماح للمستخدم بتخمين رقم تم إنشاؤه عشوائيًا بين 1 و100. العنصر الأول المهم في هذا البرنامج هو استخدام عشوائي.راندنت() الدالة، التي تولد عددًا صحيحًا عشوائيًا ضمن النطاق المحدد (من 1 إلى 100). يشكل هذا المنطق الأساسي وراء اللعبة، حيث أنه يوفر الرقم السري الذي يجب على المستخدم تخمينه. ثم يطلب البرنامج من المستخدم إدخال تخمينه باستخدام الملف مدخل() الدالة، التي تلتقط مدخلات المستخدم كسلسلة ويتم تحويلها لاحقًا إلى عدد صحيح لأغراض المقارنة.
يلعب هيكل الحلقة دورًا حاسمًا في التحكم في تدفق اللعبة. أ بينما يتم استخدام الحلقة للتحقق بشكل مستمر من تخمينات المستخدم مقابل الرقم الذي تم إنشاؤه عشوائيًا. طالما أن تخمين المستخدم غير صحيح، تستمر الحلقة في مطالبة اللاعب إما بـ "التخمين الأعلى" أو "التخمين الأقل". يقارن الشرط الموجود داخل الحلقة تخمين المستخدم بالرقم السري، مما يضمن أن اللعبة توفر ردود فعل مناسبة دون أن تنتهي قبل الأوان. من خلال التعامل مع مدخلات المستخدم بهذه الطريقة، تصبح اللعبة تفاعلية، وتوجه اللاعب نحو الإجابة الصحيحة.
في البرنامج النصي الثاني باستخدام IPython.display، نقدم تنسيق إخراج أكثر تعقيدًا مع الرياضيات ()، دالة تستخدم لعرض الرسائل بالتدوين الرياضي. ومع ذلك، أدى الاستخدام الأولي لرمز النسبة المئوية (%) لتنسيق الرسالة بمتغيرات متعددة إلى حدوث خطأ: نوع (أنواع) المعامل غير مدعومة لـ %: 'Math' و'tuple'. ينشأ هذا الخطأ بسبب الرياضيات لا يدعم هذا النوع من استيفاء السلسلة. بدلاً من ذلك، يؤدي استخدام تنسيق f-string الحديث في Python، والذي يعد أكثر سهولة، إلى حل هذه المشكلة ويعرض رسالة منسقة بشكل صحيح في نهاية اللعبة عندما يخمن المستخدم بشكل صحيح.
بالإضافة إلى ذلك، يدمج البرنامج النصي الثالث مجموعة من اختبارات الوحدة مكتوبة باستخدام بايثون com.unittest نطاق. الغرض من هذه الاختبارات هو أتمتة التحقق من صحة وظائف اللعبة، والتأكد من أن اللعبة تتصرف كما هو متوقع في سيناريوهات مختلفة. بالسخرية من مدخل() وظيفة باستخدام Unittest.mock.patch، نحن نحاكي مدخلات المستخدم أثناء الاختبار دون الحاجة إلى إدخال يدوي. يعزز هذا الأسلوب قوة الكود، مما يسمح للمطورين بالتحقق من منطق اللعبة في ظل ظروف مختلفة. تساعد اختبارات الوحدة في اكتشاف الأخطاء المحتملة مبكرًا، مما يضمن أن أي تغييرات في البرنامج لا تؤدي إلى تعطيل الوظائف الحالية.
إصلاح خطأ المعامل غير المدعوم في لعبة تخمين بايثون
الحل 1: لعبة تخمين بسيطة بلغة بايثون باستخدام المكتبات القياسية
# Importing required libraries
import random
# Function for the guessing game
def guessing_game():
# Generate a random number between 1 and 100
number_to_guess = random.randint(1, 100)
user_guess = None
# Loop until the user guesses the correct number
while user_guess != number_to_guess:
try:
# Get input from the user
user_guess = int(input('Guess a number between 1 and 100: '))
except ValueError:
print('Please enter a valid number.')
continue
# Provide hints for guessing higher or lower
if user_guess < number_to_guess:
print('Guess higher!')
elif user_guess > number_to_guess:
print('Guess lower!')
# Congratulate the user when they guess correctly
print(f'Congratulations! The correct number was {number_to_guess}.')
# Call the function
guessing_game()
معالجة الأخطاء في IPython.display وإصلاح تنسيق السلسلة في Python
الحل 2: استخدام IPython.display للمخرجات المنسقة وإصلاح خطأ المجموعة
# Importing required libraries from IPython
from IPython.display import display, Math
import random
# Function for the guessing game with IPython display
def guessing_game_ipython():
number_to_guess = random.randint(1, 100)
user_guess = None
while user_guess != number_to_guess:
try:
user_guess = int(input('Guess a number between 1 and 100: '))
except ValueError:
print('Please enter a valid number.')
continue
if user_guess < number_to_guess:
print('Guess higher!')
elif user_guess > number_to_guess:
print('Guess lower!')
# Correctly formatting using the f-string instead of % formatting
display(Math(f'Congratulations! The correct number was {number_to_guess} and you typed {user_guess}'))
# Call the function
guessing_game_ipython()
إضافة اختبارات الوحدة لضمان الصحة عبر البيئات
الحل 3: تنفيذ اختبارات الوحدة للتحقق من منطق اللعبة
import unittest
from unittest.mock import patch
import random
# Function for the guessing game to be tested
def guessing_game_tested():
number_to_guess = random.randint(1, 100)
user_guess = None
while user_guess != number_to_guess:
user_guess = int(input('Guess a number between 1 and 100: '))
return number_to_guess, user_guess
# Test class for the guessing game
class TestGuessingGame(unittest.TestCase):
@patch('builtins.input', side_effect=[50, 75, 85, 95, 100])
def test_guessing_game(self, mock_input):
result = guessing_game_tested()
self.assertEqual(result, (100, 100))
# Run the tests
if __name__ == '__main__':
unittest.main()
تحسين تنسيق سلسلة بايثون للعرض في البرامج التفاعلية
أحد الجوانب الرئيسية لتطوير لعبة تخمين الأرقام في بايثون هو كيفية تفاعل البرنامج مع المستخدم. على وجه التحديد، عند عرض رسائل مثل "خمن أعلى" أو "خمن أقل"، يعد ضمان التنسيق الواضح والدقيق أمرًا ضروريًا. هناك تحدٍ شائع عند استخدام مكتبات مثل IPython.display يتم تنسيق سلاسل الإخراج بشكل صحيح. على الرغم من أن استخدام رمز النسبة المئوية (%) لاستكمال السلسلة يعد أمرًا تقليديًا، إلا أنه يمكن أن يؤدي إلى أخطاء مثل نوع (أنواع) المعاملات غير المدعومة لـ %: 'Math' و'tuple'. تحدث هذه المشكلة لأن بعض المكتبات، مثل الرياضيات ()، تتطلب أساليب بديلة مثل تنسيق السلسلة f.
في برمجة بايثون الحديثة، توفر السلاسل f طريقة أكثر كفاءة وقابلية للقراءة لإدراج المتغيرات في السلاسل. على سبيل المثال، بدلًا من كتابة "تهانينا! الرقم الصحيح كان %g،" يمكنك استخدام سلسلة f مثل f'Congratulations! The correct number was {number}'. تسمح لك سلاسل F بتضمين التعبيرات مباشرة، مما يجعل التعليمات البرمجية أكثر إيجازًا والقضاء على المخاطر المرتبطة باستيفاء السلاسل التقليدية. وهذا لا يعزز إمكانية القراءة فحسب، بل يمنع أيضًا أخطاء التنسيق الشائعة.
بالإضافة إلى استخدام f-strings، هناك اعتبار آخر مهم عند إنشاء برامج تفاعلية وهو التحقق من صحة مدخلات المستخدم. عند قبول المدخلات من المستخدمين، خاصة في لعبة يتم فيها إدخال التخمينات بشكل متكرر، يعد التعامل مع الاستثناءات المحتملة، مثل المدخلات غير الصحيحة، أمرًا حيويًا. التنفيذ try-except تضمن الكتل عدم تعطل البرنامج بسبب إدخال غير صالح. وبدلاً من ذلك، يمكنه مطالبة المستخدم بأمان بإدخال بيانات صالحة، وبالتالي تحسين تجربة المستخدم بشكل عام. يؤدي هذا المزيج من تنسيق السلسلة المحسّن والتحقق من صحة الإدخال إلى تطبيقات Python أكثر قوة وسهولة في الاستخدام.
الأسئلة المتداولة حول لعبة التخمين بايثون والأخطاء
- ماذا يعني الخطأ "نوع (أنواع) المعاملات غير المدعومة لـ %: 'Math' و'tuple'"؟
- يحدث هذا الخطأ عندما Math() يتم استخدام الدالة مع تنسيق سلسلة غير صحيح. يؤدي استبدال رمز النسبة المئوية (%) بسلاسل f إلى حل هذه المشكلة.
- لماذا نستخدم سلاسل f على طريقة النسبة المئوية (٪) في بايثون؟
- توفر سلاسل F تنسيقًا أكثر قابلية للقراءة وكفاءة مقارنةً بالتنسيق التقليدي % طريقة. كما أنها تقلل من مخاطر الأخطاء في تنسيق السلسلة المعقدة.
- كيف يمكنني التعامل مع إدخالات المستخدم غير الصالحة في لعبة التخمين؟
- يمكنك استخدام أ try-except منع لاكتشاف الأخطاء مثل ValueError عندما يقوم المستخدم بإدخال بيانات غير صحيحة، مما يضمن استمرار اللعبة بسلاسة.
- ما هو دور random.randint() في هذه اللعبة؟
- random.randint() يقوم بإنشاء رقم عشوائي ضمن النطاق المحدد (من 1 إلى 100) ليتمكن المستخدم من تخمينه في اللعبة.
- كيف while حلقة مساعدة في لعبة التخمين؟
- ال while تضمن الحلقة استمرار تشغيل اللعبة حتى يخمن المستخدم الرقم الذي تم إنشاؤه عشوائيًا بشكل صحيح.
إصلاح أخطاء التنسيق في ألعاب تخمين بايثون
يمكن تشغيل لعبة التخمين في Python بسلاسة بمجرد معالجة مشكلة تنسيق السلسلة. باستخدام سلاسل f، الخطأ المتعلق بـ الرياضيات () وتم حل المشكلة، مما يضمن تجربة مستخدم أكثر سلاسة. يعد أسلوب التنسيق الحديث هذا سهل التنفيذ ويتجنب المخاطر الشائعة.
بالإضافة إلى ذلك، التعامل مع أخطاء إدخال المستخدم مع محاولة باستثناء تضمن الكتل عدم تعطل اللعبة بسبب إدخال غير صالح. تجعل هذه التعديلات اللعبة أكثر قوة وسهولة في الاستخدام، مما يوفر ردود الفعل اللازمة للاعبين للاستمتاع بالتجربة التفاعلية دون مواجهة أخطاء محبطة.
مراجع وموارد إضافية للعبة التخمين بايثون
- يشرح استخدام IPython.display و الرياضيات () وظائف الإخراج المنسق في البرامج التفاعلية. لمزيد من التفاصيل، قم بزيارة توثيق آي بايثون .
- يقدم معلومات عن تنسيق سلسلة f في بيثون لاستيفاء السلسلة الأنظف. لمزيد من القراءة، انظر وثائق بايثون الرسمية .
- يوضح هذا المصدر كيفية التعامل مع الأخطاء والاستثناءات في بايثون باستخدام محاولة باستثناء كتل. يرى بيثون الحقيقية: استثناءات بايثون .
- يغطي أساسيات بايثون عشوائي الوحدة وتطبيقها في إنشاء ألعاب التخمين. المرجع الكامل متاح في وحدة بايثون العشوائية .