رشن | خدمات میزبانی وب

آموزش بازی حدس عدد در پایتون ۳

ابتدا بازی حدس عدد را توضیح دهیم و بعد سراغ نحوه نوشتن اسکریپتش در پایتون برویم. فرض کنیم که شما و دوست تان مقابل هم نشسته‌اید و شما یک عدد مثلا از بین x تا y انتخاب می‌کنید و دوست شما با n حدس باید عدد را پیدا کند و بیشتر از ۳ مرتبه هم نمی‌تواند حدس بزند. اگر هم حدس نزد می‌بازد و اگر هم درست حدس زد برنده می‌شود.

خب، حالا همین مثال را می‌خواهیم با کامپیوتر بازی کنیم و دوست ما کامپیوتر باشد و زبان رابط هم این وسط پایتون. مطلب را دنبال کنید تا ببینیم چطور می‌توانیم در پایتون چنین چیزی بنویسیم.


برای این که با کامپیوتر بازی کنیم دو راه داریم: اول این که یک عدد ثابت در یک متغیر ذخیره کنیم مثل ۱۸ و هر دفعه هم خواستیم حدس را شروع کنیم فقط با همان عدد ۱۸ مثلا بازی آغاز شود. و دفعه بعدی هم به صورت دستی عدد را تغییر دهیم.

دوم این که از ماژول و آبجکت‌ها و توابع خود پایتون استفاده کنیم که هر دفعه یک عدد را به صورت تصادفی به ما بدهد.

من در این آموزش از راه عدد تصادفی استفاده کردم.



اول از همه باید ماژولی به نام `random` را وارد کنیم تا بتوانیم به تابع randint یا randrange دسترسی پیدا کنیم و یا هم فقط یکی از این توابع را به صورت خاص ایمپورت می‌کنیم.

هر دو روش را می‌نویسم تا راه ایمپورت به هر دو صورت را مشاهده کنید.

روش اول برای ایمپورت کل ماژول:

Python
import random

روش دوم برای ایمپورت یک یا چند شئ از یک ماژول:

Python
from random import randrange # you can also use from random import randint

طبق لینک داکیومنت خود پایتون، تنها تفاوت randrange و randint در این است که تابع randrange می‌تواند عدد ابتدایی نگیرد و فقط عدد پایانی بگیرد:

Python
print(randrange(20))

که این یعنی در هر بار پرینت، یک عدد تصادفی از 0 تا 19 پرینت می‌کند و به صورت خودکار از صفر حساب می‌کند.

اما تابع randint حتما باید مشخص شود که عدد شروع و پایان چه هست:

Python
print(randint(0, 20))

به دلخواه یکی از این دو تابع را ایمپورت می‌کنیم و ما از تابع randrange استفاده کردیم. به ادامه آموزش بپردازیم.


خب خط اول اسکریپت ما به این صورت می‌شود:

Python
from random import rangrange

و عددی که در هر بار اجرای برنامه تولید می‌شود را در یک متغیر ذخیره می‌کنیم و بعدش البته فقط برای این که ببینیم برنامه تا به این جای کار درست کار می‌کند یا نه، متغیر جدید را پرینت می‌کنیم.

Python
random_int = randrange(21)
print(random_int)

خب، حالا تا این‌جای کار در هر بار اجرای اسکریپت مان یک عدد تصادفی از 0 تا 20 داریم (دقت کنید خود 21 حساب نمی‌شود و اگر می‌خواهید خود 21 هم باشد یا باید ورودی را به 22 تغییر دهید و یا به 1+21).

بعد گفتیم که قرار هست عدد را حدس بزنیم. خب در شروع برنامه حدس ما برابر با 0 هست و هنوز هیچ حدسی نزدیم. پس یک متغیر دیگر هم به نام guess می‌نویسیم و برابر با 0 قرار می‌دهیم.

Python
guess = 0

تا به این جا برنامه ما باید به این شکل باشد:

Python
from random import randrange
random_int = randrange(21)
print(random_int)
guess = 0

حالا باید سراغ خود بازی برویم و شروع کنیم به نوشتن حلقه‌ای که باید تکرار شوندگی حدس را برعهده بگیرد.

من از حلقه while استفاده می‌کنم و حلقه را به این صورت می‌نویسم که تا زمانی که ورودی‌های حلقه صحیح بود تکرار شود:

Python
while True

بعد من در این بخش از بلوک try except استفاده کردم که یک توضیح مختصر می‌دهم که این بلوک چیست و چه کاربردی دارد. و در یک مطلب جداگانه هم مفصل شرح می‌دهم.

برنامه زیر را در نظر بگیرید:

Python
var1 = int(input('Enter a digit between 0 and 20'))
print(var1)

در این جا متغیری به نام var1 ساختیم که از نوع integer هست و فقط هم باید ورودی عدد صحیح قبول کند. حالا اگر کاربر اشتباها عدد اعشاری یا کاراکتر غیر عددی وارد کند برنامه به خطا می‌خورد و متوقف می‌شود. برای این‌که مدیریت خطا را در دست بگیریم از بلوک try except استفاده می‌کنیم به این صورت:

Python
try:
my_code
except defined_error:
do_something_else


حالا به برنامه اصلی و حدس و گمان برگردیم.

بعد از شروع حلقه while من کد را با بلوک try except شروع کردم به این شکل:

در ابتدای حلقه ورودی که قرار هست از کاربر گرفته شود را داخل متغیری به نام var1 ذخیره می‌کنیم. و بعد حلقه را با شرط if ادامه می‌دهیم که اگر پاسخ درست نبود چه کاری انجام شود و اگر درست بود چه بشود.

عملگر =! به معنای نامساوی هست همان‌طور که در انواع اپراتورها نوشتیم و یعنی که اگر ورودی کاربر با عدد تولید شده برابر نبود، رشته پایینش را نمایش دهد.

و در این‌جا elseی که نوشتیم به لحاظ منطقی یعنی اگر var1 == random_int بود رشته بعدی را نمایش دهد.

اما چرا از break استفاده کردیم؟ اگر استفاده نمی‌کردیم حتی در صورتی هم که کاربر عدد درست را وارد می‌کرد حلقه ادامه پیدا می‌کرد و تا ابد پیش می‌رفت و کاربر در هر بار تکرار حلقه که تا بی‌نهایت ادامه پیدا می‌کرد می‌توانست عدد درست و نادرست وارد کند. پس به لحاظ منطقی باید زمانی که جواب درست بود برنامه قطع شود.

در ادامه مجددا از متغیر guess استفاده می‌کنیم که در بالای برنامه آن را برابر با صفر قرار داده بودیم. در این حلقه از اپراتور =+ استفاده می‌کنیم تا در هر بار تکرار حلقه یک مقدار به این متغیر اضافه شود. از آن‌جایی که می‌خواهیم کاربر حداکثر ۳ حدس داشته باشد پس یک بلوک شرط دیگری می‌نویسیم که پس از آن‌که متغیر guess برابر با عدد ۳ شد متنی را پرینت کند و حلقه را تمام کند.

تا این‌جای کار مربوط به بلوک try بوده که این در صورت صحیح بودن ورودی کاربر هست که مورد انتظار ما باشد. اما اگر کاربر به اشتباه کاراکتر دیگری جز عدد وارد کرد ما این‌جا باید مدیریت خطا را برعهده بگیریم تا برنامه ما به ارور نخورد و کاربر خطا نبیند.

بلوک try را با except و به این فرمت ادامه می‌دهیم:

Python
except ValueError:
print('Wrong character, try with numbers')
guess += 1
print(f'{guess} guess is used, and', 3 - guess, ' guess is left')
if guess == 3:
print('\nNo guess is left, let us break')
break

که از این لینک در حقیقت می‌توانید تمامی exceptionهای built-in خود پایتون را مشاهده کنید.

اکسپشن ValueError مربوط به خطای مقدار هست که زمانی که مقدار دریافتی مورد انتظار نباشد. مثلا در برنامه ما مقادیر مورد انتظار فقط عدد 0 تا 9 هست و هر کاراکتری جز این غیرمجاز محسوب می‌شود. بنابراین در این بلوک با به دست گرفتن مدیریت خطا داریم عنوان می‌کنیم که اگر کاربر مقدار نادرست وارد کرد برنامه بسته نشود و طوری که ما می‌خواهیم پیش برود.


بنابراین کد کامل برنامه به این صورت می‌شود:

نظرات