Smart Home League

جزوه‌ی آموزشی درس‌به‌درس — زیر ۱۴ سال (پرایمری)
6 درس

نصب و اجرا

پوشه‌ی Smart Home League که دریافت کرده‌اید دو زیرپوشه دارد: Windows و Mac.

ویندوز

  1. وارد پوشه‌ی Windows شوید و روی Smart Home League.exe دوبار کلیک کنید.
  2. اگر بار اول ویندوز پیام امنیتی داد: More info و سپس Run anyway را بزنید.
  3. پنجره‌ی بازی خودش باز می‌شود — همین!

مک

  1. وارد پوشه‌ی Mac شوید و روی Smart Home League (Mac).command دوبار کلیک کنید.
  2. اگر مک اجازه نداد: روی همان فایل راست‌کلیک → Open → Open (فقط بار اول لازم است).
  3. اگر مک پیشنهاد نصب ابزار خط فرمان (python3) داد، Install را بزنید و بعد از پایان، دوباره دوبار کلیک کنید.

در خودِ برنامه: زبان از منوی ☰ قابل تغییر است؛ «کد پایه»، «هلپرها» و «حالت مسابقه» روی صفحه‌ی اول هر لیگ هستند و کتابچه‌ی کامل قوانین از دکمه‌ی «قوانین» باز می‌شود.

هلپر AI در U14 — قدرت‌های اضافه

همان هلپر AI فرست‌استپ است، با حس‌ها و حرکت‌های بیشتر:

  1. قطب‌نما: حرکتِ «Turn to °» بچرخ-تا-درجه‌ی مطلق است — ربات آن‌قدر می‌چرخد تا heading همان عدد شود.
  2. شماره‌ی اتاق و درصد تمیزی: حس‌های room و clean را روی یک قانون بیندازید: «اگر در اتاق ۲ بودم و اتاق ۲ بیش از ۸۰٪ تمیز بود…».
  3. قانون سه‌حرکته: هر قانون تا ۳ حرکت پشت‌سرهم دارد — «بچرخ به ۲۷۰ ← مستقیم برو ← بچرخ به ۱۸۰» دقیقاً مسیر خروج از اتاق است.
  4. دکمه‌ی «🚪 قانونِ خروج از اتاقِ تمام‌شده» همین قانون نمونه را یک‌جا می‌سازد؛ درجه‌ی هر مرحله را با نقشه‌ی خودتان تنظیم کنید.
  5. مثل همیشه: ▶ اجرا، ⬇ ذخیره، و عددهای زرد قابل ویرایش در خودِ کد.

سنسورهای ربات در یک نگاه

سه سنسور فاصله‌ی آلتراسونیک (US): front جلوی ربات، frontleft جلو-چپ، frontright جلو-راست — و حلقه‌ی نارنجی، بامپر (سپر لمسی) است

پیش از شروع

نکته: برنامه‌ی ربات ۱۰ بار در ثانیه از بالا تا پایین اجرا می‌شود؛ مقداری که در wheelleft و wheelright می‌گذارید تا اجرای بعدی می‌ماند. هر درس یک برنامه‌ی کامل و قابل‌اجراست — آن را در بخش «آموزش» داخل برنامه اجرا کنید یا در ادیتور مسابقه بگذارید.

درس ۱ — سه سنسور فاصله، بدون توقف

خانه‌ی U14 بزرگ‌تر است و وقت طلاست: به‌جای «بایست و بچرخ»، با سه سنسور جلو فرمان بده. مانعِ چپ؟ قوس به راست. مانعِ راست؟ قوس به چپ. روبه‌رو بسته؟ چرخش درجا. چرخ‌هایی که نمی‌ایستند یعنی کاشی‌هایی که پشت‌سرهم رنگ می‌شوند.
wheelleft = 25
wheelright = 25

if front < 60:          # روبه‌رو بسته
    wheelleft = 18
    wheelright = -18
elif frontleft < 50:    # مانع سمت چپ
    wheelleft = 25
    wheelright = 8
elif frontright < 50:   # مانع سمت راست
    wheelleft = 8
    wheelright = 25
نتیجه‌ی مورد انتظار: ربات بدون ایست در خانه‌ی بزرگ می‌گردد و از کنار مبل‌ها سُر می‌خورد. توجه داشته باشید: قوسِ پیوسته دور یک پایه‌ی صندلی می‌تواند «مدار» شود — درس ۶ راه‌حلش را دارد.

درس ۲ — فرش‌ها پول نمی‌دهند

سنسور رنگ فرش را قبل از ورود می‌بیند: green فرش بزرگ است — نصف سرعت و صفر امتیاز؛ purple فرش کوچک — صفر امتیاز. در U14 کفِ خیس هم هست که ۲ کاشی جریمه دارد و از رنگ دیده نمی‌شود — پس عادتِ دورماندن از فرش‌ها مسیرهای امن‌تر هم می‌سازد.
wheelleft = 25
wheelright = 25

if timer > 0:
    timer -= 1
    wheelleft = -25
    wheelright = -8     # عقبِ کج: هم دور می‌شوی هم می‌چرخی

elif color == green:    # فرش بزرگ
    timer = 8

elif color == purple:   # فرش کوچک
    timer = 5
نتیجه‌ی مورد انتظار: نرسیده به فرش سبز، با قوسِ عقب‌گرد ازش جدا می‌شود و مسیر تازه می‌گیرد. timer فرش سبز عمداً بلندتر است (۸ در برابر ۵) — سبز گران‌تر است!

درس ۳ — تایمر و state: مانورِ چندتکه

گاهی یک مانور دو تکه دارد: «عقب بکش، بعد بچرخ». timer می‌گوید چقدر، و state یادش می‌ماند کدام تکه‌ایم: state = 2 دنده‌عقب، state = 1 چرخش به راست. بلوک بالای منطق با همین دو عدد، مانور را قدم‌به‌قدم پیش می‌برد.
wheelleft = 25
wheelright = 25

if timer > 0:
    timer -= 1
    if state == 2:      # تکه‌ی ۱: عقب
        wheelleft = -25
        wheelright = -25
        if timer == 0:  # عقب تمام شد؟
            state = 1   # -> تکه‌ی ۲: چرخش
            timer = 4
    else:               # state == 1
        wheelleft = 18
        wheelright = -18

elif bumper == 1:       # خوردم!
    state = 2           # اول عقب...
    timer = 5
نتیجه‌ی مورد انتظار: بعد از هر برخورد، اول نیم‌ثانیه عقب می‌کشد و «بعد» می‌چرخد — دو تکه، پشت‌سرهم، بدون گیج‌بازی. timer = 4 چرخش را کوتاه و بلند کنید تا زاویه عوض شود.

درس ۴ — سه سبک برای حرکتِ ماندگار

سه ابزار دارید: سبک ۱ timer + بلوک شمارش (خودتان می‌شمارید). سبک ۲ movetime — چرخ‌ها را تنظیم کنید و بگویید چند قدم نگهشان دارد؛ شمارش خودکار است. سبک ۳ حرکت‌های آسان — backward(2) و دوستانش؛ عدد = ثانیه. کد پایین سبک ۱ را اجرا می‌کند؛ کامنت‌ها ۲ و ۳ را نشان می‌دهند.
wheelleft = 25
wheelright = 25

# سبک ۱: تایمر
if timer > 0:
    timer -= 1
    wheelleft = -25
    wheelright = -25
elif color == green:
    timer = 20          # ۲۰ قدم = ۲ ثانیه
    wheelleft = -25
    wheelright = -25

# سبک ۲: movetime — بالا را پاک کن و امتحان کن:
#     if color == green:
#         wheelleft = -25
#         wheelright = -25
#         movetime = seconds(2)

# سبک ۳: حرکت آسان — کوتاه‌ترین:
#     if color == green:
#         backward(2)
نتیجه‌ی مورد انتظار: هر سه سبک همان یک کار را می‌کنند: ~۲ ثانیه عقب وقتی سبز پیدا شد. اول سبک ۱ را اجرا کنید، بعد دوتای دیگر را از کامنت دربیاورید — و شمارشِ timer / movetime را زنده در پنل ببینید.

درس ۵ — قطب‌نما (heading)

چیزی که U14 دارد و FS ندارد: heading — جهتِ ربات از ۰ تا ۳۵۹ درجه (۰ = شرق، ۹۰ = شمال، ۱۸۰ = غرب، ۲۷۰ = جنوب). با آن می‌توانید «رو به شمال شو» بنویسید، مسیر شما را بعد از ده مانور دوباره پیدا کنید، یا نیمه‌ی حریف را نشانه بگیرید.
wheelleft = 25
wheelright = 25

# رو به شمال (۹۰ درجه) شو، بعد مستقیم برو
if heading < 82 or heading > 98:
    wheelleft = -12      # بچرخ تا شمالی شوی
    wheelright = 12
else:
    wheelleft = 25       # شمالی هستی -> بران
    wheelright = 25

if bumper == 1:          # به چیزی خوردی؟
    backward(1)          # عقب — و باز رو به شمال
نتیجه‌ی مورد انتظار: ربات اول درجا می‌چرخد تا heading در پنل حدود ۹۰ شود، بعد صاف به سمت شمال می‌راند؛ بعد از هر برخورد هم دوباره شمال را پیدا می‌کند. 90 را ۰ کنید تا شرق‌رو شود.

درس ۶ — کنج، و درسِ «همیشه یک‌طرف»

وقتی هر سه سنسور فاصله عدد کوچک می‌گویند، در کنجی — تکان‌های کوچک شما را برمی‌گردانند همان‌جا؛ یک چرخش حسابی لازم است. و یک یافته‌ی اندازه‌گیری‌شده از کد قهرمان: فرارِ «هر بار یک‌طرف» ربات را بین دو مانع موج می‌اندازد. در آزمایش ما، همیشه-راست ۱۴۲ کاشی گرفت و فرارِ متغیر فقط ۵۴!
wheelleft = 25
wheelright = 25

if timer > 0:
    timer -= 1
    wheelleft = 18      # چرخش به راست — همیشه راست!
    wheelright = -18

elif front < 55 and frontleft < 55 and frontright < 55:
    timer = 8           # کنج: چرخش بزرگ (~۱۳۰ درجه)

elif front < 70:
    timer = 3           # دیوار: چرخش کوتاه
نتیجه‌ی مورد انتظار: در فضای باز صاف می‌راند، کنارِ دیوار چرخش کوتاه می‌زند و در کنج‌ها یک‌باره ~۱۳۰ درجه می‌چرخد و آزاد می‌شود. حالا کد کامل «🏆 قهرمان U14» را از منوی ربات‌ها بردارید و مقایسه کنید — همین درس‌ها آنجا کنار هم‌اند.