درس ۲۱ روبی: حل خودکار هزارتو با الگوریتم
هزارتو نقطهی اوج ردهی ۳ است. در این درس کودک دیگر یک نقشه را حل نمیکند؛ الگوریتمی مینویسد که ربات روبی با آن هر هزارتویی را حل کند.
هدف درس هزارتو
هدف درس ۲۱ روبی ترکیب همهی ابزارهای قبلی است: حلقهی while، شرط if / else و حسگرهای دیوار. کودک یاد میگیرد یک «قانون رفتاری» برای روبی بنویسد که بدون دانستن شکل نقشه، او را به هدف برساند.
در طرح درس آکادمی روبی آمده است: کدی که هر هزارتو را حل کند بهتر از راهحل خاص یک نقشه است. این درس دقیقاً همین تفاوت میان «راهحل» و «الگوریتم» را به کودک نشان میدهد.
مفهوم برنامهنویسی: الگوریتم و تعمیم
الگوریتم یعنی دستورالعملی که برای همهی نمونههای یک مسئله کار کند. معروفترین الگوریتم ساده برای هزارتو قانون «دست روی دیوار» است: اگر همیشه دست راستت را روی دیوار نگه داری، در هزارتوهای معمولی بالاخره به خروجی میرسی.
برای والدین: این اولین تجربهی کودک از طراحی الگوریتم واقعی است؛ همان نوع فکری که در مسابقات برنامهنویسی و المپیاد کامپیوتر خواسته میشود. کودک یاد میگیرد به جای حفظ کردن جواب، قانونی بسازد که جواب را تولید کند.
فعالیت قدمبهقدم با ربات روبی
نسخهی سادهی قانون دست راست با حسگرهای روبی این است: while not onTarget: if not rightIsWall: turnRight, forward else: if frontIsWall: turnLeft else: forward. یعنی اگر سمت راست باز است، بپیچ و برو؛ وگرنه اگر جلو دیوار است، به چپ بچرخ؛ در غیر این صورت جلو برو.
در حالت بلوکی، یک بلوک «♾️ تا وقتی» با شرط «نه onTarget» میسازیم و داخل آن یک بلوک «❓ اگر» با rightIsWall میگذاریم. در بخش «وگرنه» آن، یک «اگر» دیگر با frontIsWall قرار میگیرد. بهتر است کودک اول نسخهی سادهتر را بسازد: while not onTarget: if frontIsWall: turnLeft else: forward و ببیند کجا شکست میخورد.
- ✅ قدم ۱: نسخهی ساده را بساز و روی چند هزارتو امتحان کن
- ✅ قدم ۲: جایی که روبی گیر میکند را پیدا کن
- ✅ قدم ۳: شرط rightIsWall را اضافه کن
- ✅ قدم ۴: برنامه را روی هزارتوی جدید آزمایش کن
اشتباههای رایج و راه رفعشان
ترتیب نادرست شرطها رایجترین خطاست. اگر اول frontIsWall بررسی شود و بعد rightIsWall، روبی ممکن است راههای سمت راست را از دست بدهد. خطای دیگر حلقهی بیپایان است: در قانون دست راست اگر بعد از turnRight دستور forward فراموش شود، روبی در یک خانه دور خودش میچرخد.
راه رفع: اجرای قدمبهقدم و ردیابی مسیر روی کاغذ. از کودک بخواهید در هر خانه بنویسد کدام شاخهی شرط اجرا شد. این همان تکنیک ردیابی است که برنامهنویسان حرفهای هم به کار میبرند.
خطای سوم آزمایش برنامه فقط روی یک هزارتوست. برنامهای که روی نقشهی اول کار کرده، ممکن است در نقشهی دوم شکست بخورد. همیشه دستکم دو یا سه هزارتوی متفاوت را امتحان کنید تا مطمئن شوید الگوریتم واقعاً عمومی است.
فعالیت بدون کامپیوتر: هزارتوی کاغذی
روی کاغذ شطرنجی چند هزارتوی کوچک بکشید. کودک با یک مهره و فقط با قانون دست راست حرکت کند و مسیر را با مداد رنگی علامت بزند. بعد خودش هزارتویی طراحی کند و ببیند آیا میتواند هزارتویی بسازد که این قانون در آن جواب ندهد.
نکته برای معلم و والدین: این درس ممکن است چند جلسه طول بکشد و این کاملاً طبیعی است. بگذارید کودک با نسخهی ساده شروع کند، شکست آن را ببیند و خودش دلیلش را پیدا کند. کشف اینکه چرا یک قانون ساده کافی نیست، ارزشمندتر از دیدن جواب نهایی است و اعتمادبهنفس کودک را در حل مسئله بالا میبرد.
ارتباط با پایتون واقعی و مسیر پیشرفته
ساختار while و if در روبی همان ساختار پایتون است؛ تفاوت اصلی این است که در پایتون واقعی حسگرها معمولاً تابع یا متغیرند و تورفتگی بدنه را مشخص میکند. کودکی که این درس را حل کرده، منطق برنامهی پایتون را از قبل میداند.
در مسیر پیشرفتهی آکادمی روبی، همین مسئله ادامه پیدا میکند: شرطهای تو در تو با if / elif / else و عملگرهای and / or / not، و الگوریتمهای مسیریابی مثل دست روی دیوار و جستوجوی سطحبهسطح (BFS) برای پیدا کردن کوتاهترین مسیر.
سوالهای پرتکرار
آیا قانون دست راست همهی هزارتوها را حل میکند؟
هزارتوهای معمولی که دیوارهایشان به هم وصلاند را بله، اما نه همهی هزارتوها را. همین محدودیت انگیزهی یادگیری الگوریتمهایی مثل BFS در مسیر پیشرفتهی روبی است.
این درس برای المپیاد مفید است؟
بله، طراحی الگوریتم عمومی و ردیابی اجرای برنامه از پایههای آمادگی مسابقات الگوریتمی است.
اگر کودک فقط هزارتوی جلوی چشمش را حل کرد چه؟
تشویقش کنید، بعد هزارتوی دیگری بدهید و بپرسید برنامهاش آنجا هم کار میکند یا نه. همین پرسش او را به سمت الگوریتم عمومی میبرد.