یک شبیهساز ربات بنویسید.
مرکز آزمایش یک کارخانهی ربات به برنامهای نیاز دارد که حرکات ربات را بررسی کند.
رباتها سه حرکت ممکن دارند:
رباتها روی یک شبکهی بینهایت فرضی قرار میگیرند، رو به جهت خاصی (شمال، شرق، جنوب یا غرب)، در مجموعهای از مختصات {x,y}، مثلاً {3,8}، که مختصات به سمت شمال و شرق افزایش مییابد.
سپس ربات تعدادی دستور دریافت میکند و در این مرحله، مرکز آزمایش موقعیت جدید ربات و جهتی را که رو به آن است بررسی میکند.
تستها به ۳ مرحله تقسیم شدهاند.
همهی تستها را با go test اجرا کنید یا تستهای مشخصی را با گزینهی -tags اجرا کنید.
مثالها:
go test # run all tests
go test -tags step1 # run just step 1 tests.
go test -tags 'step1 step2' # run step1 and step2 tests
فایل منبع defs.go در اختیار شما قرار داده شده است که چند مورد از نیازهای برنامهی تست را تعریف میکند.
این فایل بر حسب مرحله به سه بخش سازماندهی شده است.
برای کامل کردن مرحله ۱ باید Right، Left، Advance، N، S، E، W و Dir را تعریف کنید.
پیش از رفتن به مرحله ۲، مرحله ۱ را کامل کنید.
در مرحله ۱ حرکتهای ربات را پیادهسازی کردید، اما آن چندان شبیهسازی نیست. برای مثال، «ربات» در کد منبع کجاست؟ «شبکه» کجاست؟ محاسباتی که کنشهای ربات را به موقعیتهای شبکه تبدیل میکنند کجا هستند، در ربات یا در شبکه؟ دنیای فیزیکی متفاوت است.
مرحله ۲ یک «اتاق» را معرفی میکند.
به نظر افزودنی کوچکی میرسد، اما تغییرات بزرگی اعمال خواهیم کرد تا نقشهای «اتاق»، «ربات» و «برنامهی تست» را روشن کنیم و کمکم فیزیک شبیهسازی را شفاف کنیم.
شما Room و Robot را بهصورت توابعی تعریف خواهید کرد که برنامهی تست آنها را با راهاندازی بهصورت گوروتین «به وجود میآورد».
اطلاعات از طریق کانالهای Go میان برنامهی تست، ربات و اتاق جابهجا میشود.
Room را یک «موتور فیزیک» در نظر بگیرید که اتاقی فیزیکی با دیوارها و یک ربات را مدلسازی و شبیهسازی میکند.
باید بهنحوی فضای مختصاتی اتاق، موقعیت ربات و دیوارها را مدلسازی کند و مثلاً مطمئن شود که ربات از میان دیوارها عبور نمیکند.
میخواهیم Robot عاملی باشد که کنشها را انجام میدهد، اما میخواهیم Room حقیقتی منسجم را حفظ کند.
برنامهی تست کانالها را میسازد و هر دو Room و Robot را راهاندازی میکند.
سپس برنامهی تست فرمانها را به Robot میفرستد.
وقتی فرستادن فرمانها تمام شد، کانال فرمان را میبندد.
Robot باید فرمانها را بپذیرد و Room را از کنشهایی که در تلاش برای انجامشان است آگاه کند.
وقتی بسته شدن کانال فرمان را حس کند، باید خودش را خاموش کند.
اتاق باید پیامدهای فیزیکی کنشهای ربات را تفسیر کند.
وقتی خاموش شدن ربات را حس کند، گزارش نهایی را به برنامهی تست برمیگرداند و موقعیت و جهت نهایی ربات را اعلام میکند.
مرحله ۳ سه تغییر عمده دارد:
برای گزارش موقعیت نهایی که از Room3 فرستاده میشود، میتوانید همان اسلایسی را برگردانید که از کانال رباتها دریافت کردهاید، فقط با موقعیتها و جهتهای بهروزشده.
برای موارد زیر باید روی کانال لاگ پیام فرستاده شود: