شرلوک هلمز پس از رمزگشایی کد مورس با کمک دستیار جوانش، به سرعت پالتو و کلاه گوشیدار معروفش را بر میدارد و به سمت برج لندن میرود. پس از رسیدن به محل بمبگذاری فردی ناشناس با صدایی ترسناک به شرلوک زنگ میزند و به او میگوید برای خنثی کردن بمب باید معمایی که برایش ارسال کرده است را انجام دهد.
شرلوک پس از دیدن معما متوجه میشود که این معما در اصل معمای معروف `maze` است که بازیکن باید مسیری از نقطه شروع به نقطه نهایی پیدا کند و کلید بمب با توجه به جهاتی که باید پیمایش شود تا بازی به اتمام برسد مشخص میشود. به دلیل زمان کمی که وجود دارد شرلوک از شما برای ایجاد الگوریتمی برای حل این بازی کمک میگیرد.
ظاهر کلی برنامه به صورت زیر است:
![ظاهرکلی](https://quera.org/qbox/view/j7Y3rUNNtT/Maze.gif)
## پروژه اولیه
پروژه اولیه را از [این لینک](/problemset/assignments/4367/download_problem_initial_project/236448/) دانلود کنید.
ساختار فایلها
```
maze
├── scripts
│ ├── direction.js
│ ├── execution.js
│ ├── generation.js
│ ├── main.js
│ ├── maze.js
│ ├── point.js
│ └── utility.js
├── <mark title="شما تنها مجاز به تغییر این فایل هستید">solution.js</mark>
├── styles
│ ├── reset.css
│ └── styles.css
├── template
│ ├── index.html
├── assets
│ ├── favicon.svg
```
## توضیحات
<details class="blue">
<summary>
**فایلها**
</summary>
| فایل | تعریف |
|:---------:|:------------------------------------------------------------------------------------------------------------------------------------------------------------:|
| `direction` | در داخل این بازی چهار جهت بالا، پایین، چپ و راست در فایل direction.js به صورت `enum` تعریف شده است. |
| `Point` | در این بازی یک کلاس به نام `Point` در فایل `Point.js` تعریف شده است که در اصل موقعیت مکانی هرکدام از سلولهای بازی است. |
| `maze` | در این بازی یک کلاس به نام `maze` در فایل `maze.js` تعریف شده است که در اصل زمین و مشخصات مربوط به بازی است. |
</details>
<details class="blue">
<summary>
**فایل`direction`**
</summary>
| تعریف | مقدار |
|:-----:|:-----:|
| `UP` | ↑ |
| `DOWN` | ↓ |
| `LEFT` | ← |
| `RIGHT` | → |
</details>
<details class="blue">
<summary>
**فایل `point`**
</summary>
| تابع | تعریف |
|:---------:|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
| `equals` | این تابع یک `point` دیگر را به عنوان ورودی دریافت میکند و اگر مختصات این `point` با مختصات خود `point` برابر بود مقدار `true` و در غیر این صورت مقدار `false` را برمیگرداند. |
| `left` | این تابع مختصات فعلی کلاس خود را یک واحد در خلاف جهت محور x میبرد.(به عنوان مثال اگر مختصات برابر `x=1, y=2` باشد پس از صدا زدن این تابع مختصات جدید برابر `x=0, y=2` میشود.) |
| `right` | این تابع مختصات فعلی کلاس خود را یک واحد در جهت محور x میبرد.( به عنوان مثال اگر مختصات برابر `x=1, y=2` باشد پس از صدا زدن این تابع مختصات جدید برابر `x=2, y=2` میشود.) |
| `up` | این تابع مختصات فعلی کلاس خود را یک واحد در جهت محور y میبرد.(به عنوان مثال اگر مختصات برابر `x=1, y=2` باشد پس از صدا زدن این تابع مختصات جدید برابر `x=1, y=3` میشود.) |
| `down` | این تابع مختصات فعلی کلاس خود را یک واحد در خلاف جهت محور y میبرد.(به عنوان مثال اگر مختصات برابر `x=1, y=2` باشد پس از صدا زدن این تابع مختصات جدید برابر `x=1, y=1` میشود.) |
| `isBlocked` | این تابع مختصاتی را به صورت یک `Point` دریافت میکند و در صورتی که در سلول بازی این مختصات بلاک شده باشد (قابل حرکت نباشد) یا از فضای بازی بیرون نباشد (به عنوان مثال `x=-1, y=-1` ) مقدار `true` و در غیر این صورت مقدار `false` برمیگرداند. |
</details>
<details class="blue">
<summary>
**فایل `maze`**
</summary>
| متغیر | تعریف |
|:----------:|:--------------------------------------------------------------------:|
| `startPoint` | این مشخصه در اصل مختصات مکان شروع بازی را به صورت `point` به شما میدهد. |
| `endPoint` | این مشخصه در اصل مختصات مکان پایان بازی را به صورت `point` به شما میدهد. |
</details>
## خواسته مسئله
در فایل `solution.js` تابعی به نام `solveMaze` وجود دارد که شما باید در آن الگوریتمی بنویسید نا مسیری که باید از نقطه شروع (`startPoint`) به نقطه پایان (`endPoint`) بازی پیمایش شود را با استفاده از جهتهایی که در فایل `direction.js` مشخص شده است، برگرداند.
## نکات
1. شما تنها قادر به تغییر فایل `solution.js` هستید.
2. شما تنها قادر به استفاده از توابع و مشخصههایی که در بالا توضیح داده شده است هستید.
2. پس از اعمال تغییرات در فایل `solution.js` آن را در قسمت پاسخ آپلود کنید.