فهرست عناوین

موضوع قبلی

16. اگر فقط ...

موضوع بعدی

18. بهم گوش کن ... وگرنه ...

17. به دنبال یک جای خوب

با این که برنامه‌ای که نوشتید می‌بایست برای محیط‌های نشانه‌های ۱ و نشانه‌های ۲ کار کند؛ اگر با نشانه‌های ۳ امتحانش کنید به مشکل می‌خورید.

امتحان کن!

برنامهٔتان را با هر سه تا محیط امتحان کنید.

17.1. یک حالت دیگر

توجه

green_home_tile house racing_flag :()at_goal

ریبرگ علاوه بر این که می‌تواند بفهمد آیا همان جایی که ایستاده، نشانه هست یا نه؛ می‌تواند تشخیص بدهد که آیا به آن مربّع رنگی -که قبلاً به عنوان خانهٔ ریبرگ تعریفش کردیم- رسیده یا نه.

در خیلی از محیط‌ها، منطقی‌تر است که این محل را به جای خانه به عنوان مقصد در نظر بگیریم. تابعی که ریبرگ برای تشخیص این مورد استفاده می‌کند ()move است. این پایین طرح کلّی راه حلی است که می‌بایست در هر چهار محیطی که بالاتر گفتیم کار کند.

def move_until_done():
    if at_goal():
        # یک سری کار
    move()
    if object_here():
        # یه کار
        # یه کار دیگه
        # بازم یه کار دیگه

repeat 42:
    move_until_done()

توجه

اگر اطّلاعات محیط مربوط به نشانه‌های ۳ را نگاه کنید؛ می‌بینید که راه حل پیشنهادی، کلیدواژهٔ پایتونی while را به کار برده که هنوز ندیده‌ایم.

ساختار کد بالا را در ویرایشگر کد پایتون کامل کنید و آن را برای هر سه تا محیطی که بالاتر گفتیم امتحان کنید، حواستان باشد در آن‌ها هم کار کند.

17.2. و حالا یک کار متفاوت

حتماً تمرین بالا را کامل کرده‌اید دیگر؛ نه؟! ... خیلی خوب.

این کار رو بکن!

یکی از محیط‌های خانه ۱ یا خانه ۲ را انتخاب کنید. آیا همان برنامه‌ای که برای محیط‌های نشانه‌ها استفاده کردید؛ در آن‌ها هم کار می‌کند؟ بعد از تشخیص این موضوع با اجرای برنامه؛ سعی کنید حدس‌تان را راستی‌آزمایی کنید.

17.3. مسابقات دو با مانع!

نگاهی به محیط‌های با مانع ۱ و با مانع ۲ بیاندازید. با چشم پوشی از هدف نهایی، برنامه‌ای که ریبرگ می‌تواند با آن در مسابقه‌ از روی این مانع‌ها بپرد، چند بار اجرای به ترتیب این دو تا دستور است:

  • ()move

  • ()jump_over_hurdle

البتّه با یک تعریف مناسب برای تابع ()jump_over_hurdle .

اگر می‌توانستید یک معیار (گزارهٔ منطقی``if``) یک جا توی برنامه بگذارید که ببینید آیا ریبرگ به مقصد رسیده یا نه، می‌توانستید یک تابع جدیدبا نام ()move_and_jump_until_done (تا موقع تمام شدن برو و بپر) درست کنید.

در این صورت برنامه‌ای که برای هر دو تا محیط با مانع ۱ و با مانع ۲ مناسب بود و کار می‌کرد مثل این می‌شد:

repeat 42:
    move_and_jump_until_done()

انجامش بده!

چنین برنامه‌ای را بنویسید و امتحان کنید تا خاطر جمع شوید که کار می‌کند.

راهنمایی

برنامهٔتان می‌تواند این طور باشد:

from my_lib import turn_right

def move_and_jump_over_hurdle():
# چند تا دستور

repeat 42:
    move_and_jump_over_hurdle()
    if at_goal():
        done()

17.3.1. یک سؤال برای شما

آیا این برنامه بدون تغییر برای محیط با مانع ۳ کار می‌کند؟