ساخت یک بازی ریاضی ساده با پایتون

https://virgool.io/p/en4rdspflniy/%D8%AF%D8%B1%D8%A7%DB%8C%D9%86%D9%85%D8%B7%D9%84%D8%A8%D9%82%D8%B5%D8%AF%D8%AF%D8%A7%D8%B1%D9%85%D9%86%D8%AD%D9%88%D9%87%D8%B3%D8%A7%D8%AE%D8%AA%DB%8C%DA%A9%D8%A8%D8%A7%D8%B2%DB%8C%D8%B3%D8%A7%D8%AF%D9%87%D8%B1%DB%8C%D8%A7%D8%B6%DB%8C%D8%AF%D8%B1%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86%DA%A9%D9%87%D8%AF%D8%B1%D8%AA%D8%B1%D9%85%DB%8C%D9%86%D8%A7%D9%84%D8%A7%D8%AC%D8%B1%D8%A7%D9%85%DB%8C%D8%B4%D9%88%D8%AF%D8%B1%D8%A7%D9%85%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C%D9%82%D8%B1%D8%A7%D8%B1%D8%AF%D9%87%D9%85.%D9%87%D8%AF%D9%81%DA%A9%D8%AF%D9%86%D9%88%DB%8C%D8%B3%DB%8C%D8%A7%DB%8C%D9%86%D8%A8%D8%A7%D8%B2%DB%8C%D8%AF%D8%B1%DA%A9%D8%A8%D9%87%D8%AA%D8%B1%D8%B2%D8%A8%D8%A7%D9%86%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87%D9%86%D9%88%DB%8C%D8%B3%DB%8C%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86%D8%8C%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C%D8%A8%D9%87%D8%AA%D8%B1%D9%88%D8%AF%D9%82%DB%8C%D9%82%D8%AA%D8%B1%D8%A8%D8%A7%D8%B3%DB%8C%D9%86%DA%A9%D8%B3%D8%A7%DB%8C%D9%86%D8%B2%D8%A8%D8%A7%D9%86%D8%8C%D9%87%D9%85%DA%86%D9%86%DB%8C%D9%86%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF%D9%86%DA%AF%D8%B1%D8%B4%D8%B5%D8%AD%DB%8C%D8%AD%D8%A8%D9%87%DA%A9%D8%AF%D9%86%D9%88%DB%8C%D8%B3%DB%8C%D9%88%D8%AA%D9%82%D9%88%DB%8C%D8%AA%D8%AA%D9%88%D8%A7%D9%86%D8%A7%DB%8C%DB%8C%D9%82%D8%B1%D8%A7%D8%B1%D8%AF%D8%A7%D8%AF%D9%86%DA%A9%D8%AF%D9%87%D8%A7%D8%AF%D8%B1%DA%A9%D9%86%D8%A7%D8%B1%DB%8C%DA%A9%D8%AF%DB%8C%DA%AF%D8%B1%D8%AC%D9%87%D8%AA%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF%DB%8C%DA%A9%D9%BE%D8%B1%D9%88%DA%98%D9%87.

پیش نیاز:

  • آشنایی با پایتون به صورت مقدماتی

توضیحی در رابطه با بازی

بازی در سه سطح ساده، متوسط، سخت تعریف می شود که توسط کاربر قابل انتخاب است. با توجه به سطح انتخاب شده در هر مرحله به کاربر سوالی جهت جمع کردن دو عدد نمایش داده می شود که با پاسخ صحیح به آن به امتیاز او افزوده می شود و در صورت پاسخ منفی از امتیاز او کسر می شود. بعد از هر سوال کابر امکان خروج از بازی را دارد.پس از خروج از بازی خلاصه ای از وضعیت کاربر شامل: امتیاز، تعداد سوال های پرسیده شده، تعداد پاسخ های صحیح و تعداد پاسخ های غلط نمایش داده می شود.

https://www.aparat.com/video/video/embed/videohash/wD4rH/vt/frame

قدم به قدم پیش می رویم

به دلیل اینکه بهتر با طرز تفکر نحوه کد نویسی برای انجام یک پروژه آشنا شوید کد به صورت خط به خط نوشته نمی شود و ممکن است نیاز باشد به خط های بالاتر کدی اضافه شود یا تغییر کند. چون در واقعیت امر به این شکل است که با توجه به طرز تفکر برنامه نویس و پیشبرد کار کد ها اصلاح می شود و به این صورت نیست که از ابتدا تا انتها یک دست کد ها نوشته شود. البته که با افزایش مهارت و انجام تمرین بیشتر به این سمت پیش خواهید رفت که بدانید در چند خط آینده چه خواهید نوشت پس پیش نیاز آن را نیز می نویسید که نیاز به بازگشت و اصلاح کد های قبلی نباشد.

شروع کد نویسی

در ابتدا سطح سختی بازی را از کاربر توسط تابع input سوال می کنیم و آن را در متغییری با نام level قرار می دهیم. ممکن است کاربر پاسخ را از میان گزینه ها به درستی انتخاب نکند و پاسخ که در انتظار آن هستیم را دریافت نکنیم که باعث ایجاد اختلال در روند کار می شود. پس متغییری با نام gotCorrectLevel را تعریف می کنیم و مقدار اولیه آن False را قرار می دهیم. سپس در while سوال خود را از کاربر می پرسیم و با ترکیب دستورهای if و in بررسی می کنیم که یکی از جواب های مورد انتظار ما را داده باشد در این صورت مقدار gotCorrectLevel را برابر با True قرار می دهیم که باعث می شود دیگر وارد while نشود و نرم افزار به کار خود ادامه دهد در غیر این صورت انقدر این پروسه تکرار می شود تا جواب صحیح از کابر دریافت شود.

gotCorrectLevel = False
while not gotCorrectLevel :
    level = input('Choose the level (easy, normal, difficult): ')
    if level in ['easy', 'normal', 'difficult'] :
        gotCorrectLevel = True


نیاز است در ابتدا ماژول random را جهت استفاده import کنیم.

سه تابع با نام های easyPlus, normalPlus, difficultPlus با توجه به سه سطح موجود جهت دریافت دو عدد رندوم با استفاده از تابع randrange برای انجام محاسبات می نویسیم.

سه تابع با نام های easyScore, normalScore, difficultScore جهت دریافت ضریب امتیاز می نویسیم (این سه می توانند به جای تابع متغییر نیز باشند.)

import random

def easyPlus():
    numberOne, numberTwo = random.randrange(0, 100), random.randrange(0, 100)
    return [numberOne, numberTwo]

def normalPlus():
    numberOne, numberTwo = random.randrange(100, 10000), random.randrange(100, 10000)
    return [numberOne, numberTwo]

def difficultPlus():
    numberOne, numberTwo = random.randrange(10000, 1000000000), random.randrange(10000, 1000000000)

def easyScore():
    return 1

def normalScore():
    return 2

def difficultScore():
  return 3


برنامه به این صورت طراحی خواهد شد: تا زمانی که کاربر خارج نشده است به صورت مستمر از او سوال های ریاضی پرسیده خواهد شد و پس جهت شروع نیاز است که کد ها را در while قرار دهیم. در بیرون while یک متغیر با نام exitApp و مقدار اولیه False تعریف می کنیم که جهت بررسی شرط while از آن استفاده می کنیم و در صورتیکه کابر تمایل خروج از بازی را داشت مقدار آن را True قرار می دهیم که while دیگر کار خود را ادامه ندهد. همچنین متغییری با نام score با مقدار اولیه 0 جهت نگهداری امتیاز کابر قبل تعریف می کنیم.

در ابتدا با بررسی سطح انتخابی کاربر توسط if دو متغییر numberOne و numberTwo را تعریف و با استفاده از توابعی که بالاتر تعریف کردیم مقدار دهی می کنیم.

exitApp = False
score = 0 

while not exitApp :      

    if level == 'easy' :
         numberOne, numberTwo = easyPlus()
     elif level == 'normal' :
         numberOne, numberTwo = normalPlus()
     elif level == 'difficult' :
         numberOne, numberTwo = difficultPlus()


سپس همچنین در داخل while پاسخ صحیح را محاسبه و در متغییر correctAnswer جهت مقایسه و امتیاز دهی به کاربر نگه داری می کنیم. سپس متغیری با نام question ایجاد و سوالی که قرار است از کابر بپرسیم را در آن نگه داری می کنیم (با استفاده از متد format دو brace {} داخل string را جایگزین می کنیم) پس از آن با استفاده از دستور input سوال را از کاربر پرسیده و در متغیر answer نگه داری می کنیم. با استفاده از تابع int آن را به integer تبدیل می کنیم.

    correctAnswer = numberOne + numberTwo

    question = '{0} + {1} = '.format(numberOne, numberTwo)
    answer = input(question)
    answer = int(answer)


در ابتدا در قبل از while متغیر های correctAnswers و incorrectAnswer را با مقدار 0 ایجاد می کنیم که نگه دارنده تعداد پاسخ صحیح و غلط کاربر است.

سپس همچنین در داخل while با توجه به سطح انتخابی کاربر ضریب امتیاز را در متغیر scoreLevel قرار می دهیم. سپس پاسخ کاربر را با پاسخ صحیح مقایسه می کنیم. با توجه به صحیح یا غلط بودن به امتیاز او اضافه یا کسر می کنیم، به پاسخ های صحیح یا غلط او یک واحد اضافه می کنیم و در انتها با استفاده از تابع print پیغامی به کاربر نمایش می دهیم که نشان دهنده صحیح یا غلط بودن پاسخ اوست و مجموع امتیاز او را نیز تا کنون نمایش می دهیم.

     if level == 'easy' :
         scoreLevel = easyScore()
     elif level == 'normal' :
         scoreLevel = normalScore()
     elif level == 'difficult' :
         scoreLevel = difficultScore()

      if answer == correctAnswer:
         score += scoreLevel
         correctAnswers += 1
         print('Hoora, your score is: {0}'.format(score))
     else :
         score -= scoreLevel
         incorrectAnswer += 1
         print('Bad lock, your score is: {0}'.format(score))


همانطور که پیش تر هم گفتم میخواهیم پس از هر دریافت جواب هر سوال از کاربر از اون بپرسیم که آیا میخواهد بازی را ادامه دهد یا خیر پس در ادامه کد های قبلی در داخل while کد های زیر را می نویسم.

در ابتدا متغیر gotCorrectCountinueAnswer را با False مقدار دهی می کنیم که بررسی کنیم آیا پاسخ دریافتی از کاربر جز موارد مورد انتظار ما است یا نه که اگر صحیح بود مقدار با True می کنیم که دوباره پرسش از کاربر تکرار نشود.

پاسخ دریافتی از کاربر را جهت مقایسه در متغییر userWantToCountinue قرار می دهیم. سپس بررسی میکنیم اگر پاسخ منفی بود مقدار exitApp را True می کنیم که شرط بررسی while اصلی برنامه است که در این صورت دیگر سوالی از کاربر پرسیده نخواهد شد و نرم افزار بسته خواهد شد. همچنین نیاز است که بررسی شود آیا پاسخ کاربر جزو موارد مورد انتظار ما بوده است یا خیر که در صورت صحیح بودن مقدار متغییر gotCorrectCountinueAnswer را True قرار می دهیم که پرسش خروج را دوباره از کاربر نپرسد.

    gotCorrectContinueAnswer = False

    while not gotCorrectContinueAnswer :
        userWantToContinue = input('Do you want to continue? (y/n)')

        if userWantToContinue == 'n' :
            exitApp = True

        if userWantToContinue in ['y', 'n'] :
            gotCorrectContinueAnswer = True


در اتنها پس از while اصلی قطعه کد زیر را قرار می دهیم و زمانی اجرا می شود که کاربر تمایل خروج از نرم افزار را داشته باشد که آمار بازی که شامل امتیاز، تعداد سوالات پاسخ داده شده، پاسخ های صحیح و پاسخ های نا درست است.

else :
    print('your score is: {0}'.format(score))
    print('You answered {0} questions'.format(correctAnswers + incorrectAnswer))
    print('Your correct answers : {0}'.format(correctAnswers))
    print('Your incorrect answers : {0}'.format(incorrectAnswer))


کد نهایی به صورت زیر خواهد بود

جهت دانلود کد کلیک کنید

import random

def easyScore():
    return 1

def normalScore():
    return 2

def difficultScore():
    return 3

def easyPlus():
    numberOne, numberTwo = random.randrange(0, 100), random.randrange(0, 100)
    return [numberOne, numberTwo]

def normalPlus():
    numberOne, numberTwo = random.randrange(100, 10000), random.randrange(100, 10000)
    return [numberOne, numberTwo]

def difficultPlus():
    numberOne, numberTwo = random.randrange(10000, 1000000000), random.randrange(10000, 1000000000)
    return [numberOne, numberTwo]

gotCorrectLevel = False
while not gotCorrectLevel :
    level = input('Choose the level (easy, normal, difficult): ')
    if level in ['easy', 'normal', 'difficult'] :
        gotCorrectLevel = True
        score = 0
        correctAnswers = 0
        incorrectAnswer = 0

exitApp = False
while not exitApp :
    if level == 'easy' :
        numberOne, numberTwo = easyPlus()
    elif level == 'normal' :
        numberOne, numberTwo = normalPlus()
    elif level == 'difficult' :
        numberOne, numberTwo = difficultPlus()

    correctAnswer = numberOne + numberTwo
    question = '{0} + {1} = '.format(numberOne, numberTwo)
    answer = input(question)
    answer = int(answer)
    
    if level == 'easy' :
        scoreLevel = easyScore()
    elif level == 'normal' :
        scoreLevel = normalScore()
    elif level == 'difficult' :
        scoreLevel = difficultScore()

    if answer == correctAnswer:
        score += scoreLevel
        correctAnswers += 1
        print('Hoora, your score is: {0}'.format(score))
    else :
        score -= scoreLevel
        incorrectAnswer += 1
        print('Bad lock, your score is: {0}'.format(score))

    gotCorrectContinueAnswer = False
    while not gotCorrectContinueAnswer :

        userWantToContinue = input('Do you want to continue? (y/n)')

        if userWantToContinue == 'n' :
            exitApp = True

        if userWantToContinue in ['y', 'n'] :
            gotCorrectContinueAnswer = True
else :
    print('your score is: {0}'.format(score))
    print('You answered {0} questions'.format(correctAnswers + incorrectAnswer))
    print('Your correct answers : {0}'.format(correctAnswers))
    print('Your incorrect answers : {0}'.format(incorrectAnswer))


امیدارم آموزش خوبی براتون بوده باشه و کمکی جهت آشنایی بهتر با پایتون و همچنین برنامه نویسی شده باشه. ممنون میشم نظراتتون رو با من درمیون بزارید تا تقاط قوت و ضعف کار مشخص بشه تا بتونم محتواهای با کیفیت تری تولید کنم که هم برای من به عنوان نویسنده و برای شما به عنوان خواننده مفید باشه.