بیاید برگردیم سراغ مثالهای روزنامه رسانی، ولی این بار فقط به مثالهایی نگاه میکنیم که برای روزنامه پول پرداخت میشود.
کد این پایین تلاش شده راه حلی باشد، که هم برای محیط خانوم لاولیس (روزنامه ۱) کار کند، و هم برای محیط آقای بابیج (روزنامه ۲):
from library import turn_right, turn_around
def climb_up_one_floor():
turn_left()
move()
turn_right()
move()
move()
def climb_down_one_floor():
move()
move()
turn_left()
move()
turn_right()
def get_money():
while object_here():
take()
# === پایان تعریفها ===
take()
while not object_here():
climb_up_one_floor()
get_money()
put() # روزنامهٔ استار رو بگذار
turn_around()
while not at_goal():
climb_down_one_floor()
آزمون مهم!
برنامهٔ بالا را باز تولید و اجرا کنید. به نتیجهٔ کار توجّه کنید.
همان طور که خواهید دید وقتی ریبرگ میخواهد دستور ()put
را در سطری که با رنگ دیگری مشخّص شده اجرا کند؛ متوّقف میشود و فریاد میزند `` وسایل زیادی همراهم هست. نمیدونم کدومش رو بگذارم زمین!``.
خب، مشکل این است که که ریبرگ هم پول (نشانه) همراهش هست و هم روزنامه (ستاره).
راه حل؟
برنامه را طوری تغییر بدهید که ریبرگ پیش از این که پول را بردارد، روزنامه را زمین بگذارد. آیا این راه حل کار میکند؟
هر جایی که روی هم اشیاء مختلف زیادی باشند (مثل یک ستاره و چندتا نشانهای که در محیطهایی این بالا گفته شد) وقتی ما به ریبرگ دستور بدهیم ()take
(یعنی بردار)؛ ریبرگ نمیداند کدام شیئ را بردارد. به طور مشابه، اگر ریبرگ اشیاء زیادی را همراه داشته باشد و فقط صرفاً بخواهیم با دستور ()put
یک شیئ را بگذارد پایین، نمیداند کدام یکی را بگذارد.
راه حل ساده است: باید دقیقتر باشیم.
تا به حال نشانوندهای تابع را دیدهایم. در یک اتًفاق! خوشایند، تابعهای ()take
و ()put
هم میتوانند نشانوند داشته باشند. در این مورد، روزنامهٔ «استار» با یک ستاره نشان داده شده. نشانوندی که باید استفاده شود کلمهٔ ستاره به زبان انگلیسی ("star"
) است؛ مثل این:
take("star")
put("star")
برای پول هم کلمه``"token"`` به معنی نشانه را به کار میبریم.
نوبت شما!
برنامهٔ قبل را تغییر بدهید و تا مشخّص کند ریبرگ کدام اشیاء را باید بردارد و یا بگذارد. بررسی کنید و مراقب باشید برنامهٔتان برای هر دو محیط روزنامهٔ ۱ و روزنامهٔ ۲ به درستی کار میکند. شاید بخواهید از ()think
برای کم یا زیاد گردن گاه و بیگاه حرکت ریبرگ استفاده کنید.
یک گزینهٔ دیگر
برنامهٔتان را با جایگزینی object_here("token")
با ()object_here
دوباره تغییر بدهید و مراقب باشید که هنوز هم کار کند.