خطا گرفتم — یعنی چه و چه کار کنم؟

هر پیامی که در لیگ شبیه‌سازی خانه هوشمند پایین ویرایشگر قرمز می‌شود، اینجا هست: دقیقاً همان جمله‌ای که می‌بینید، معنی‌اش به زبان ساده، و کدِ درست کنار کدِ غلط. خطا گرفتن یعنی برنامه اجرا نشده — نه این‌که ربات بد بازی کرده. پس اول اینجا را نگاه کنید.

خطاهایی که برنامه را متوقف می‌کنند

!Line 1: expected ':' at end of line

دونقطه‌ی آخر خط را جا انداخته‌اید. در پایتون هر if، elif، else، while و def با دونقطه تمام می‌شود.

غلط
if front < 40
    turnleft(1)
درست
if front < 40:
    turnleft(1)

همین خطا را می‌گیرید اگر از زبانی مثل C یا جاوااسکریپت عادت به { } داشته باشید. پایتون آکولاد ندارد.

!Line 1: expected an indented block

بعد از دونقطه، خط بعدی باید تورفتگی داشته باشد. تورفتگی در پایتون تزئینی نیست؛ همان چیزی است که می‌گوید این خط «داخل» شرط است.

غلط
if front < 40:
turnleft(1)
درست
if front < 40:
    turnleft(1)

چهار فاصله استاندارد است. فاصله و تب را قاطی نکنید — چشم فرقشان را نمی‌بیند ولی برنامه می‌بیند.

!Line 2: unexpected indentation

خطی تورفتگی دارد که نباید داشته باشد — چیزی بالایش نیست که این خط داخلش باشد.

غلط
forward(1)
    turnleft(1)
درست
forward(1)
turnleft(1)
!Line 1: unexpected character '='

شایع‌ترین خطای همه. = یعنی «این مقدار را بگذار»، ولی == یعنی «آیا برابر است؟». در شرط همیشه دوتایی است.

غلط
if color = green:
درست
if color == green:

همین پیام را با '&' هم می‌گیرید: در پایتون به‌جای && می‌نویسید and و به‌جای || می‌نویسید or.

!there is no sensor or variable called 'frontt' — did you mean 'front' or 'frontleft' or 'frontright'?

اسم سنسور را اشتباه تایپ کرده‌اید. خوشبختانه برنامه خودش نزدیک‌ترین اسم‌ها را پیشنهاد می‌دهد — کافی است پیام را تا آخر بخوانید.

گاهی هم اسم درست است ولی رده‌ی شما آن سنسور را ندارد. مثلاً heading در فرست‌استپ وجود ندارد و همین پیام را می‌گیرید. کدام رده چه دارد را در طرح درس سنسورها ببینید.

غلط
if frontt < 40:
درست
if front < 40:
!unknown function 'forwardd()'

اسم دستور اشتباه است. دستورهای حرکت دقیقاً این‌ها هستند و بس:

forward(s)   backward(s)   turnleft(s)   turnright(s)   stop(s)

عددی که می‌دهید ثانیه‌ی واقعی است، نه تعداد قدم.

!while loop ran too long

یک while نوشته‌اید که هیچ‌وقت تمام نمی‌شود. برنامه‌ی شما باید در هر قدم سریع تمام شود و تصمیمش را بدهد — شبیه‌ساز خودش قدم بعدی را صدا می‌زند.

غلط
while True:
    forward(1)
درست
forward(1)   # همین کافی است

اگر می‌خواهید کاری چند قدم طول بکشد، از timer استفاده کنید نه while.

!code ran too long (possible infinite loop)

کل برنامه‌ی یک قدم بیش از حد طول کشیده. معمولاً یعنی حلقه‌های تودرتو یا محاسبه‌ی خیلی سنگین. ساده‌اش کنید؛ یک قدم باید در کسری از ثانیه تصمیم بگیرد.

!functions calling each other too deep

تابعی خودش را صدا زده و ته نمی‌کشد. برای این مسابقه تقریباً هیچ‌وقت به بازگشت (recursion) نیاز ندارید.

خطاهایی که پیام نمی‌دهند — و برای همین سخت‌ترند

این‌ها برنامه را متوقف نمی‌کنند. ربات اجرا می‌شود ولی کاری که می‌خواستید نمی‌کند، و هیچ چیز قرمز نمی‌شود. بیشترِ وقتی که تیم‌ها تلف می‌کنند، اینجاست.

?ربات سر جایش می‌لرزد و جلو نمی‌رود

واکنش نوشته‌اید ولی حافظه نگذاشته‌اید. ربات یک قدم عقب می‌رود، قدم بعد دوباره همان مانع را می‌بیند، دوباره یک قدم عقب — و تا آخر مسابقه می‌لرزد.

می‌لرزد
if front < 40:
    backward(0.2)
تمام می‌کند
if front < 40:
    timer = 8        # هشت قدم عقب

if timer > 0:
    timer = timer - 1
    wheelleft  = -25
    wheelright = -8  # قوسی، تا بچرخد هم

بیشتر بخوانید: حافظه‌ی بین قدم‌ها

?عدد بزرگ‌تری به چرخ دادم ولی تندتر نرفت

سرعت چرخ‌ها بین -25 و 25 محدود است. اگر 400 بنویسید خطا نمی‌گیرید — شبیه‌ساز بی‌صدا آن را به ۲۵ می‌رساند. همه‌ی ربات‌ها سرعت یکسان دارند؛ برنده کسی است که مسیر بهتری بچیند.

?ربات فقط دور خودش می‌چرخد

دو چرخ را خلاف هم گذاشته‌اید و هیچ‌وقت هم‌جهت نمی‌شوند. برای رفتن، هر دو باید هم‌علامت باشند.

می‌چرخد
wheelleft  = -25
wheelright =  25
می‌رود
wheelleft  = 25
wheelright = 25
?امتیازم بالا نمی‌رود با این‌که ربات کار می‌کند

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

با سنسور رنگ حل می‌شود: دنبال white بگرد

?داور رباتم را جابه‌جا کرد و امتیاز از دست دادم

ربات ۱۵ ثانیه در یک دایره‌ی کوچک مانده بود، پس گیرکرده حساب شد. تقریباً همیشه یعنی واکنش به مانع کافی نبوده — یا timer کوتاه است، یا فقط عقب می‌روید بدون این‌که بچرخید.

در گزارش پایان بازی، «زمان گیر کرده» را نگاه کنید. اگر بیشتر از چند ثانیه است، همین‌جا وقت از دست داده‌اید.

هنوز درست نشد؟

یک: کد پایه را برگردانید. در ویرایشگر دکمه‌ی بازنشانی، کد نمونه‌ی سالم را برمی‌گرداند. از آنجا یک تغییر کوچک بدهید و امتحان کنید.

دو: از هلپر استفاده کنید. در صفحه‌های کمکی چند شرط ساده انتخاب می‌کنید و برنامه‌ی درست خودش نوشته می‌شود — بعد می‌توانید همان را در ویرایشگر باز کنید و ادامه بدهید.

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