ابتدا بازی حدس عدد را توضیح دهیم و بعد سراغ نحوه نوشتن اسکریپتش در پایتون برویم. فرض کنیم که شما و دوست تان مقابل هم نشستهاید و شما یک عدد مثلا از بین x تا y انتخاب میکنید و دوست شما با n حدس باید عدد را پیدا کند و بیشتر از ۳ مرتبه هم نمیتواند حدس بزند. اگر هم حدس نزد میبازد و اگر هم درست حدس زد برنده میشود.
خب، حالا همین مثال را میخواهیم با کامپیوتر بازی کنیم و دوست ما کامپیوتر باشد و زبان رابط هم این وسط پایتون. مطلب را دنبال کنید تا ببینیم چطور میتوانیم در پایتون چنین چیزی بنویسیم.
برای این که با کامپیوتر بازی کنیم دو راه داریم: اول این که یک عدد ثابت در یک متغیر ذخیره کنیم مثل ۱۸ و هر دفعه هم خواستیم حدس را شروع کنیم فقط با همان عدد ۱۸ مثلا بازی آغاز شود. و دفعه بعدی هم به صورت دستی عدد را تغییر دهیم.
دوم این که از ماژول و آبجکتها و توابع خود پایتون استفاده کنیم که هر دفعه یک عدد را به صورت تصادفی به ما بدهد.
من در این آموزش از راه عدد تصادفی استفاده کردم.
اول از همه باید ماژولی به نام `random` را وارد کنیم تا بتوانیم به تابع randint یا randrange دسترسی پیدا کنیم و یا هم فقط یکی از این توابع را به صورت خاص ایمپورت میکنیم.
هر دو روش را مینویسم تا راه ایمپورت به هر دو صورت را مشاهده کنید.
روش اول برای ایمپورت کل ماژول:
روش دوم برای ایمپورت یک یا چند شئ از یک ماژول:
طبق لینک داکیومنت خود پایتون، تنها تفاوت randrange و randint در این است که تابع randrange میتواند عدد ابتدایی نگیرد و فقط عدد پایانی بگیرد:
که این یعنی در هر بار پرینت، یک عدد تصادفی از 0 تا 19 پرینت میکند و به صورت خودکار از صفر حساب میکند.
اما تابع randint حتما باید مشخص شود که عدد شروع و پایان چه هست:
به دلخواه یکی از این دو تابع را ایمپورت میکنیم و ما از تابع randrange استفاده کردیم. به ادامه آموزش بپردازیم.
خب خط اول اسکریپت ما به این صورت میشود:
و عددی که در هر بار اجرای برنامه تولید میشود را در یک متغیر ذخیره میکنیم و بعدش البته فقط برای این که ببینیم برنامه تا به این جای کار درست کار میکند یا نه، متغیر جدید را پرینت میکنیم.
خب، حالا تا اینجای کار در هر بار اجرای اسکریپت مان یک عدد تصادفی از 0 تا 20 داریم (دقت کنید خود 21 حساب نمیشود و اگر میخواهید خود 21 هم باشد یا باید ورودی را به 22 تغییر دهید و یا به 1+21).
بعد گفتیم که قرار هست عدد را حدس بزنیم. خب در شروع برنامه حدس ما برابر با 0 هست و هنوز هیچ حدسی نزدیم. پس یک متغیر دیگر هم به نام guess مینویسیم و برابر با 0 قرار میدهیم.
تا به این جا برنامه ما باید به این شکل باشد:
حالا باید سراغ خود بازی برویم و شروع کنیم به نوشتن حلقهای که باید تکرار شوندگی حدس را برعهده بگیرد.
من از حلقه while استفاده میکنم و حلقه را به این صورت مینویسم که تا زمانی که ورودیهای حلقه صحیح بود تکرار شود:
بعد من در این بخش از بلوک try except استفاده کردم که یک توضیح مختصر میدهم که این بلوک چیست و چه کاربردی دارد. و در یک مطلب جداگانه هم مفصل شرح میدهم.
برنامه زیر را در نظر بگیرید:
در این جا متغیری به نام var1 ساختیم که از نوع integer هست و فقط هم باید ورودی عدد صحیح قبول کند. حالا اگر کاربر اشتباها عدد اعشاری یا کاراکتر غیر عددی وارد کند برنامه به خطا میخورد و متوقف میشود. برای اینکه مدیریت خطا را در دست بگیریم از بلوک try except استفاده میکنیم به این صورت:
حالا به برنامه اصلی و حدس و گمان برگردیم.
بعد از شروع حلقه while من کد را با بلوک try except شروع کردم به این شکل:
بیشتر
در ابتدای حلقه ورودی که قرار هست از کاربر گرفته شود را داخل متغیری به نام var1 ذخیره میکنیم. و بعد حلقه را با شرط if ادامه میدهیم که اگر پاسخ درست نبود چه کاری انجام شود و اگر درست بود چه بشود.
عملگر =! به معنای نامساوی هست همانطور که در انواع اپراتورها نوشتیم و یعنی که اگر ورودی کاربر با عدد تولید شده برابر نبود، رشته پایینش را نمایش دهد.
و در اینجا elseی که نوشتیم به لحاظ منطقی یعنی اگر var1 == random_int بود رشته بعدی را نمایش دهد.
اما چرا از break استفاده کردیم؟ اگر استفاده نمیکردیم حتی در صورتی هم که کاربر عدد درست را وارد میکرد حلقه ادامه پیدا میکرد و تا ابد پیش میرفت و کاربر در هر بار تکرار حلقه که تا بینهایت ادامه پیدا میکرد میتوانست عدد درست و نادرست وارد کند. پس به لحاظ منطقی باید زمانی که جواب درست بود برنامه قطع شود.
در ادامه مجددا از متغیر guess استفاده میکنیم که در بالای برنامه آن را برابر با صفر قرار داده بودیم. در این حلقه از اپراتور =+ استفاده میکنیم تا در هر بار تکرار حلقه یک مقدار به این متغیر اضافه شود. از آنجایی که میخواهیم کاربر حداکثر ۳ حدس داشته باشد پس یک بلوک شرط دیگری مینویسیم که پس از آنکه متغیر guess برابر با عدد ۳ شد متنی را پرینت کند و حلقه را تمام کند.
تا اینجای کار مربوط به بلوک try بوده که این در صورت صحیح بودن ورودی کاربر هست که مورد انتظار ما باشد. اما اگر کاربر به اشتباه کاراکتر دیگری جز عدد وارد کرد ما اینجا باید مدیریت خطا را برعهده بگیریم تا برنامه ما به ارور نخورد و کاربر خطا نبیند.
بلوک try را با except و به این فرمت ادامه میدهیم:
که از این لینک در حقیقت میتوانید تمامی exceptionهای built-in خود پایتون را مشاهده کنید.
اکسپشن ValueError مربوط به خطای مقدار هست که زمانی که مقدار دریافتی مورد انتظار نباشد. مثلا در برنامه ما مقادیر مورد انتظار فقط عدد 0 تا 9 هست و هر کاراکتری جز این غیرمجاز محسوب میشود. بنابراین در این بلوک با به دست گرفتن مدیریت خطا داریم عنوان میکنیم که اگر کاربر مقدار نادرست وارد کرد برنامه بسته نشود و طوری که ما میخواهیم پیش برود.
بنابراین کد کامل برنامه به این صورت میشود:
بیشتر
نظرات 6
Newly created comments need to be manually approved before publication, other users cannot see this comment until it has been approved.
Newly created comments need to be manually approved before publication, other users cannot see this comment until it has been approved.
mohsen
سلام
ممنون از توضیح واضح و کاملتون
فقط یه سوال
اگر بخوایم به جای اینکه از کاربر ورودی گرفته بشه و کاربر حدس بزنه، از کامپیتور بخوایم یه عدد بگیریم و بگیم درست یا غلطه چکار باید بکنیم؟
سعید فضل اله زاده نویسنده
سلام
از ارسال نظر شما سپاسگزاریم.
اگر درست متوجه شده باشم یعنی شما می خواهید که کامپیوتر حدس بزند عدد ما چیست، درست است؟
اگر بله باید خط هشتم را به این صورت تغییر دهید:
در این حالت خب الان خود کامپیوتر یک عدد رندوم را تا سه بار حدس می زند.
منظور تان همین بوده؟
mohsen
ممنون از پاسخگویی سریع شما، بله می خوام کامپیوتر بدون این که کاربر ورودی بهش بده یک عدد رو چاپ کنه و کاربر بگه مثلا این عدد بزرگتر یا کوچکتر از عددی هست که تو ذهن خودش انتخاب کرده، محدودیت تعداد حدسم نداشته باشه
سعید فضل اله زاده نویسنده
سلام
خواهش می کنم.
الان تا زمانی که کاربر عدد درست رو وارد نکنه حلقه ادامه دارد و محدودیت حدس هم ندارد.
هم چنین سوال تان را هم می توانید در انجمن پایتون فارسی نیز مطرح کنید.
mohsen
مجددا ممنونم، عذر خواهم جای اشتباه مطرح کردم سوالم رو
سعید فضل اله زاده نویسنده
سلام
خواهش می کنم.
منظور این بوده که شما علاوه بر بخش نظرات سایت، سوال تان را در انجمن هم می توانید مطرح کنید.
موید و پیروز باشید.