فهرست عناوین

موضوع قبلی

23. پالایش‌ها: بخش ۱

موضوع بعدی

25. پالایش‌ها: بخش ۳

24. پالایش‌ها: بخش ۲

علّت مشکل آخر قسمت ۱ این بود که ما نشانه را گذاشتیم؛ ولی قبل از این که فرصتی برای حرکت داشته باشیم، امتحان کردیم ببینیم نزدیکش ایستاده‌ایم، یا نه. از آن‌جایی که روی نشانه بودیم هیچ وقت امکان رفتن توی حلقهٔ while را نداشتیم. شاید بتوانیم برنامه را با افزودن یک ()move قبل از شروع حلقه درست کنیم؛ مثل این:

put()
move()
while  not  object_here():
    if  front_is_clear():
        move()

    else :
        turn_left()

امتحان کنید!

قبل از ادامهٔ خواندن بقیّهٔ این آموزش‌ها، امتحان کنید ببینید برنامه درست کار می‌کند، یا نه.

24.1. دنیای ما پیچیده‌تر از این حرفاست

بیاید برنامه‌ای را که نوشتیم را توی یک محیط یک خورده پیچیده‌تر همین دور و بر ۲ امتحان کنیم.

توجه

یادتان نرود این خط را توی برنامهٔتان بگذارید:

from  library  import  turn_right

وقتی برنامهٔتان را امتحان می‌کنید؛ می‌بینید که نتیجه دقیقاً آن چیزی که می‌خواستیم نیست. ریبرگ همهٔ محیط را دور نمی‌زند و میان‌بر می‌زند. مشکل این است که ما فرض کردیم ریبرگ فقط باید جلو برود یا به چپ به پیچد تا محیطش را دور بزند. هیچ وقت حساب این جور موقعیّت‌هایی را نکردیم که در آن از ریبرگ بخواهیم به راست بپیچد. کاری که ریبرگ باید بکند این است که اول سمت راستش را بررسی کند ببیند آیا هنوز دیواری هست؟ اگر نبود، کاری کنیم که به راست به پیچد. این پایین برنامهٔ تغییر یافته‌ای هست که دقیقاً برای انجام همین کار است:

put()
move()

while  not  object_here():
    if  right_is_clear():
        turn_right()

    elif  front_is_clear():
        move()

    else :
        turn_left()

نوبت شما!

کار می‌کرد؟ با دقّت بخوانید تا خودتان تصمیم بگیرید. بعد اجرایش کنید، تا ببینید آیا حدس شما درست بوده یا نه؟ اگر نشد، هر تغییری که فکر می‌کنید مناسب هست را در آن انجام بدهید تا درست کار کند.